【问题标题】:How to keep decoding alive during screen orientation?如何在屏幕方向保持解码?
【发布时间】:2014-01-30 07:14:35
【问题描述】:

伙计们,

我正在使用 MediaCodec 解码网络流。 MediaCodec 上的方法 configure() 将 SurfaceView 对象作为参数,可以轻松将输出直接解码到表面视图中。

当设备方向改变时,问题就出现了。旧表面被破坏并创建一个新表面。 mediacodec 仍然持有的表面变得无效。

我无法销毁 MediaCodec 对象并重新创建一个新对象。这将导致等待几秒钟,直到新的关键视频帧到达。

查看 MediaCodec 上可用的所有方法,似乎更改表面的唯一方法是调用 configure()。在 MediaCodec 对象上多次调用 configure() 可以吗?

或者,也许有一种方法可以存储 MediaCodec 对象的内部状态并将其传输到新的 MediaCodec 对象。

如果您能指导我正确的方向,我将不胜感激。提前感谢您的帮助。

【问题讨论】:

  • MediaCodec 对象上允许的操作集有点模糊。另一种方法是配置一个不绑定到显示器的Surface,例如SurfaceTexture,然后您将使用 OpenGL ES 将其渲染为 GLSurfaceView
  • 感谢您的帮助。我会试试 SurfaceTexture。
  • 你可以试试 TextureView," 与 SurfaceView 不同的是,TextureView 不会创建单独的窗口,而是像常规 View 一样。这一关键区别允许 TextureView 可以移动、转换、动画等。例如,您可以通过调用 myView.setAlpha(0.5f) 使 TextureView 半透明。”我的问题是我使用 Mediacodec 无法成功解码 h264 帧,也许你可以给我一些帮助,我的电子邮件是 zhang.wei@gvconcepts.com,谢谢!

标签: android android-mediacodec


【解决方案1】:

现在Grafika 中有一个示例。请参阅“双重解码”活动。

它通过将视频解码器的输出定向到 SurfaceTexture 而不是直接到视图来工作。 SurfaceTexture 附加到 TextureView。当视图因设备旋转而发生变化时,会创建一个新的TextureView,并使用setSurfaceTexture() 方法删除旧的SurfaceTexture

如果您使用“返回”或“主页”离开活动,解码器将关闭。这有助于避免在切换到其他应用程序时占用硬件编解码器资源。

如果您使用电源键关闭屏幕,它目前不会关闭解码器,这可能是可取的,也可能是不可取的。

为了让生活变得有趣,它并排解码两个流。

【讨论】:

  • 非常感谢!我已经使用您的想法解决了设置表面和IllegalStateException 方向问题的问题。感谢伟大的 Grafika
【解决方案2】:

为什么你不能设置你的活动来处理清单中的设备方向以保持你的活动活跃?..http://developer.android.com/guide/topics/manifest/activity-element.html#config

【讨论】:

    猜你喜欢
    • 2022-01-27
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多