我正在开发一个安卓视频播放器,但是在处理颜色格式时遇到了困难。
背景:我使用标准的MediaExtractor/MediaCodec组合提取和解码视频。由于需要将提取的帧作为OpenGLES纹理(RGB)可用,我设置了我的解码器(MediaCodec),使其通过SurfaceTexture向外部GLES纹理(GL_TEXTURE_EXTERNAL_OES)提供数据。我知道硬件解码器输出的数据格式为NV12(YUV420SemiPlanar),而我需要通过渲染它(使用片段着色器进行转换)来将其转换为RGB。
"MediaCodec ---> GLES External Texture (NV12) [1] ---> Rendering ---> GLES Texture (RGB)"
我遇到的问题是:如何访问包含在GLES External Texture中的特定Y,U和V值。我不知道GLES纹理内存是如何设置的,也不知道如何访问它(除了“texture()”和“texelFetch()”GLSL函数)。
以下是一些疑问:
1.是否有一种方法可以像访问简单数组(指针+偏移量)一样访问数据?
2.我是不是想得太多了?
3.Surface或SurfaceTexture是否会处理转换?(我认为不会)
4.Surface或SurfaceTexture是否在填充GLES External Texture [1]时更改了数据的内存布局,以便可以通过GLES纹理访问函数访问组件?
背景:我使用标准的MediaExtractor/MediaCodec组合提取和解码视频。由于需要将提取的帧作为OpenGLES纹理(RGB)可用,我设置了我的解码器(MediaCodec),使其通过SurfaceTexture向外部GLES纹理(GL_TEXTURE_EXTERNAL_OES)提供数据。我知道硬件解码器输出的数据格式为NV12(YUV420SemiPlanar),而我需要通过渲染它(使用片段着色器进行转换)来将其转换为RGB。
"MediaCodec ---> GLES External Texture (NV12) [1] ---> Rendering ---> GLES Texture (RGB)"
我遇到的问题是:如何访问包含在GLES External Texture中的特定Y,U和V值。我不知道GLES纹理内存是如何设置的,也不知道如何访问它(除了“texture()”和“texelFetch()”GLSL函数)。
以下是一些疑问:
1.是否有一种方法可以像访问简单数组(指针+偏移量)一样访问数据?
2.我是不是想得太多了?
3.Surface或SurfaceTexture是否会处理转换?(我认为不会)
4.Surface或SurfaceTexture是否在填充GLES External Texture [1]时更改了数据的内存布局,以便可以通过GLES纹理访问函数访问组件?