我正在使用MediaCodec的解码器将数据输出到曲面。使用.configure函数,我传递了一个通过surfaceComposerClient创建的表面。问题是编解码器无法启动。我认为这是我的表面设置方式的问题(当我将表面设置为NULL时,编解码器启动)
看看MediaCodec解码器java示例,我似乎需要创建一个支持EGL的SurfaceTexture。是否可以使用C ++ / NDK原生创建表面纹理?这有什么例子吗?
答案 0 :(得分:4)
我认为这不是一个“正常”应用,因为您直接与SurfaceFlinger交互。
您可以在一些内部OpenGL测试中找到示例 - 代码已针对5.0 Lollipop版本进行修复。看一下San Angeles demo,它使用WindowSurface类从SurfaceComposerClient获取曲面。
您不需要SurfaceTexture,也不需要使用EGL做任何事情来将视频解码到曲面。 Surfaces有生产者 - 消费者结构,EGL和MediaCodec是生产者的两个不同的例子。 (SurfaceFlinger是消费者。)
要知道MediaCodec失败的原因并不容易。您可以尝试使用GLES在表面上绘图以查看它是否有效,但我猜您的问题是在其他地方。
对于SurfaceTexture,应用程序既是生产者又是消费者;它提供了一种将视频解码为曲面的方法,然后您可以将其作为GLES纹理进行操作。如果你只想让视频在屏幕上播放,这会增加不必要的开销。
答案 1 :(得分:0)
参考Android-4.4源代码中的SimplePlayer.h& .cpp。它用于解码媒体文件并将解码后的视频输出到表面。我认为它与你的情景类似。