1

我正在尝试使用 MediaCodec API 解码视频样本。我正在使用surfaceView 来显示渲染样本。如果我按下主页按钮,应用程序将进入暂停状态并且表面被破坏。当我回到恢复状态时,正在创建新的surfaceView 引用,但解码器无法在surfaceView 上抽取样本。所以屏幕显示为黑色。视频配置:videoDecoder.configure(format, surface, null, 0); 那么我如何在上面的语句中重新配置 videoDecoder 。它类似于以下问题 如何在屏幕定向期间保持解码活动?

4

1 回答 1

3

API目前MediaCodec(API 19)不提供替换输出的方法Surface

正如您提到的另一个问题一样,我认为处理此问题的方法是解码为Surface与视图层次结构无关的 a (因此,在销毁时不会被拆除Activity)。

如果将 的输出定向MediaCodec到 a SurfaceTexture,则可以将该纹理渲染到SurfaceView. 这将需要一些 GLES 代码。您可以在Grafika sources中找到必要的部分,但目前还没有您想要的完整实现(例如,PlayMovieActivity将视频解码为 a SurfaceTexture,但 ST 是 a 的一部分TextureView,这将被拆除)。

额外的渲染步骤会增加 GPU 负载,并且不适用于受 DRM 保护的视频。对于大多数设备和应用程序来说,这无关紧要。

另请参阅bigflake 示例

更新:我已将其添加到Grafika中,但有所不同。请参阅“双重解码”示例。输出到与 aSurfaceTexture关联的 a TextureView。如果屏幕被旋转(或者,当前,通过按下电源按钮来消隐),解码将继续。如果您使用“返回”或“主页”按钮离开活动,则解码停止。它的工作原理是保留SurfaceTexture,将其附加到新的TextureView.

于 2013-12-22T19:30:21.787 回答