Android MediaCodec 输出格式:GLES 外部纹理 (YUV / NV12) 到 GLES 纹理 (RGB)

Android MediaCodec output format: GLES External Texture (YUV / NV12) to GLES Texture (RGB)

我目前正在尝试在 Android 上开发一个视频播放器,但在颜色格式方面遇到困难。

上下文: 我通过MediaExtractor/MediaCodec的标准组合提取和解码视频。因为我需要将提取的帧用作 OpenGLES 纹理 (RGB),所以我设置了我的解码器 (MediaCodec),以便它提供外部 GLES纹理 (GL_TEXTURE_EXTERNAL_OES) 通过 SurfaceTexture。我知道我的硬件解码器输出的数据是 NV12 (YUV420SemiPlanar) 格式,我需要通过渲染将其转换为 RGB (使用片段着色器进行转换)。

MediaCodec ---> GLES External Texture (NV12) [1] ---> Rendering ---> GLES Texture (RGB)

我纠结的地方是:如何访问 GLES 外部纹理中包含的特定 Y、U 和 V 值 ([1] )。我不知道 GLES 纹理内存是如何设置的,也不知道如何访问它("texture()" 和 "texelFetch()" GLSL 函数除外)。

是的,我会说你想多了。您是否将事情和 运行 测试成您可以描述的实际问题,或者这只是到目前为止的理论?

即使原始解码器本身输出 NV12,当您通过 SufaceTexture 访问它时,这个细节是隐藏的 - 然后您可以像任何 RGB 纹理一样访问它。由于纹理的物理内存布局是隐藏的,您真的不知道它是否真的在您获取它之前一次性全部转换,或者纹理访问器是否在您每次对其进行采样时进行即时转换。据我所知,实现可以自由地以这些方式中的任何一种进行,并且根本无法通过 public API 观察到关于如何完成的实现细节。