MediaCodec 解码以原生呈现

MediaCodec decoding to surface natively

我正在使用 MediaCodec 的解码器将数据输出到表面。使用 .configure 函数,我传递了一个通过 surfaceComposerClient 创建的表面。问题是编解码器无法启动。我认为这是我的表面设置方式的问题(当我将表面设置为 NULL 时,编解码器启动)

查看 MediaCodec 解码器 java 示例,我似乎需要创建一个 EGL 支持的 SurfaceTexture。是否可以使用 C++/NDK 本地创建表面纹理?有这方面的例子吗?

我认为这不是 "normal" 应用程序,因为您是在直接与 SurfaceFlinger 交互。

您可以在一些内部 OpenGL 测试中找到示例——代码已针对 5.0 Lollipop 版本进行了修复。查看 San Angeles demo, which uses the WindowSurface class 从 SurfaceComposerClient 获取表面。

您不需要 SurfaceTexture 或使用 EGL 进行任何操作即可将视频解码到表面。 Surface 具有生产者-消费者结构,EGL 和 MediaCodec 是生产者的两个不同示例。 (SurfaceFlinger 是消费者。)

要知道 MediaCodec 失败的原因绝非易事。您可以尝试使用 GLES 在表面上绘图,看看它是否有效,但我的猜测是您的问题出在其他地方。

对于SurfaceTexture,应用既是生产者又是消费者;它提供了一种将视频解码到表面的方法,然后您可以将其作为 GLES 纹理进行操作。如果您只想在屏幕上播放视频,这会增加不必要的开销。

参考Android-4.4源码中的SimplePlayer.h&.cpp。它用于解码媒体文件并将解码后的视频输出到表面。我认为这与您的情况相似。