【问题标题】:MediaCodec decoding to surface nativelyMediaCodec 解码以原生方式呈现
【发布时间】:2015-03-23 22:02:45
【问题描述】:
我正在使用 MediaCodec 的解码器将数据输出到表面。使用 .configure 函数,我传递了一个通过 surfaceComposerClient 创建的表面。问题是编解码器无法启动。我认为这是我的表面设置方式的问题(当我将表面设置为 NULL 时编解码器启动)
查看 MediaCodec 解码器 java 示例,我似乎需要创建一个支持 EGL 的 SurfaceTexture。是否可以使用 C++/NDK 本地创建表面纹理?有这方面的例子吗?
【问题讨论】:
标签:
android
android-ndk
android-mediacodec
【解决方案1】:
我认为这不是一个“普通”应用,因为您直接与 SurfaceFlinger 交互。
您可以在一些内部 OpenGL 测试中找到示例——代码已针对 5.0 Lollipop 版本进行了修复。看一下San Angeles demo,它使用WindowSurface 类从SurfaceComposerClient 获取表面。
您不需要 SurfaceTexture 或使用 EGL 执行任何操作,即可将视频解码到表面。 Surface 具有生产者-消费者结构,EGL 和 MediaCodec 是生产者的两个不同示例。 (SurfaceFlinger 是消费者。)
要知道 MediaCodec 失败的原因绝非易事。您可以尝试使用 GLES 在表面上绘图,看看它是否有效,但我猜您的问题出在其他地方。
对于 SurfaceTexture,应用既是生产者也是消费者;它提供了一种将视频解码为表面的方法,然后您可以将其作为 GLES 纹理进行操作。如果您只想在屏幕上播放视频,这会增加不必要的开销。
【解决方案2】:
参考Android-4.4源码中的SimplePlayer.h&.cpp。它用于解码媒体文件并将解码后的视频输出到表面。我认为这与您的情况相似。