我正在尝试使用MediaCodec API解码视频样本。我使用surfaceView来显示渲染的样本。如果我按下主页按钮,应用程序进入暂停状态并且表面被破坏。当我回到恢复状态时,新的surfaceView参考正在创建,但解码器无法在surfaceView上抽样。因此屏幕显示为黑色。 视频配置: videoDecoder.configure(format,surface,null,0); 那么如何在上面的语句中重新配置videoDecoder。它类似于以下问题 How to keep decoding alive during screen orientation?
答案 0 :(得分:2)
目前MediaCodec
API(API 19)未提供替换输出Surface
的方法。
正如你提到的另一个问题,我认为处理这个问题的方法是解码为与视图层次结构无关的Surface
(因此,不会被撕裂)当Activity
被销毁时向下。
如果您将MediaCodec
的输出定向到SurfaceTexture
,则可以将该纹理渲染到SurfaceView
上。这将需要一些GLES代码。您可以在Grafika sources中找到必要的部分,但目前还没有完全实现您想要的内容(例如PlayMovieActivity
将视频解码为SurfaceTexture
,但ST是其中的一部分一个TextureView
,它将被拆除。)
额外的渲染步骤将增加GPU负载,并且不适用于受DRM保护的视频。对于大多数设备和应用程序而言,这无关紧要。
另请参阅bigflake examples。
更新:我已将此添加到Grafika,但有一点麻烦。请参阅“双重解码”示例。输出转到与SurfaceTexture
关联的TextureView
。如果旋转屏幕(或者,当前通过按下电源按钮消隐),则继续解码。如果您使用“后退”或“主页”按钮退出活动,则解码将停止。它的工作原理是保留SurfaceTexture
,并将其附加到新的TextureView
。