视频解码器 使用 MediaCodec 配置
Posted
技术标签:
【中文标题】视频解码器 使用 MediaCodec 配置【英文标题】:Video decoder Configure using MediaCodec 【发布时间】:2013-12-12 06:53:00 【问题描述】:我正在尝试使用 MediaCodec API 解码视频样本。我正在使用surfaceView 来显示渲染样本。如果我按下主页按钮,应用程序将进入暂停状态并且表面被破坏。当我回到恢复状态时,正在创建新的surfaceView 引用,但解码器无法在surfaceView 上抽取样本。所以屏幕显示为黑色。 视频配置: videoDecoder.configure(格式,表面,空,0); 那么我如何在上面的语句中重新配置 videoDecoder 。它类似于以下问题 How to keep decoding alive during screen orientation?
【问题讨论】:
【参考方案1】:MediaCodec
API 目前 (API 19) 不提供替换输出 Surface
的方法。
在您提到的另一个问题中,我认为处理此问题的方法是解码为与视图层次结构无关的Surface
(因此,当Activity
被销毁)。
如果将MediaCodec
的输出定向到SurfaceTexture
,则可以将该纹理渲染到SurfaceView
。这将需要一些 GLES 代码。您可以在 Grafika sources 中找到必要的部分,但目前还没有您想要的完整实现(例如,PlayMovieActivity
将视频解码为 SurfaceTexture
,但 ST 是 TextureView
的一部分,它会被拆除)。
额外的渲染步骤会增加 GPU 负载,并且不适用于受 DRM 保护的视频。对于大多数设备和应用,这无关紧要。
另请参阅bigflake examples。
更新:我已将其添加到 Grafika,但有所不同。请参阅“双重解码”示例。输出到与TextureView
关联的SurfaceTexture
。如果屏幕被旋转(或者,当前,通过按下电源按钮来消隐),解码将继续。如果您使用“返回”或“主页”按钮离开活动,则解码停止。它的工作原理是保留SurfaceTexture
,将其附加到新的TextureView
。
【讨论】:
您好,感谢您的回复。能否给一些示例代码。 我不会在接下来的几周内更新 bigflake/grafika。顺便说一句,如果您从带有MediaExtractor
(而不是流式传输 H.264)的文件中提取视频,那么您应该能够在活动重新启动后重新创建提取器/解码器,并寻找您停止的位置。时间偏移量可以根据演示时间戳确定。
感谢法登。我会根据你的建议修改我的代码。
@fadden 我在我的应用程序中使用了 DoubleDecode Activity,它运行得非常顺利。你知道如何在其中给视频添加声音吗?以上是关于视频解码器 使用 MediaCodec 配置的主要内容,如果未能解决你的问题,请参考以下文章
Android 音视频 - MediaCodec 编解码音视频