视频解码器 使用 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硬件解码视频播放

Android 音视频 - MediaCodec 编解码音视频

Android 音视频 - MediaCodec 编解码音视频

如何在配置前获得 MediaCodec 的最大分辨率

Android 用MediaCodec实现视频硬解码

研究Android音视频-3-在Android设备上采集音视频并使用MediaCodec编码为H.264