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