我目前正在尝试在 Android 上开发一个视频播放器,但在颜色格式方面遇到了困难。
上下文:我通过MediaExtractor/MediaCodec的标准组合提取和解码视频。因为我需要提取的帧可用作 OpenGLES 纹理 (RGB),所以我设置了解码器 ( MediaCodec ),以便它通过 SurfaceTexture提供外部 GLES 纹理 ( GL_TEXTURE_EXTERNAL_OES )。我知道我的硬件解码器输出的数据是NV12 ( YUV420SemiPlanar ) 格式,我需要通过渲染将其转换为 RGB(使用片段着色器进行转换)。
MediaCodec ---> GLES 外部纹理 (NV12) [1] ---> 渲染 ---> GLES 纹理 (RGB)
我遇到的困难是:如何访问 GLES 外部纹理 ( [1] ) 中包含的特定 Y、U 和 V 值。我不知道 GLES 纹理内存是如何设置的,也不知道如何访问它(“texture()”和“texelFetch()”GLSL 函数除外)。