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

时间:2017-09-15 16:40:11

标签: android opengl-es rgb mediacodec yuv

我目前正在尝试在Android上开发视频播放器,但我正在努力使用彩色格式。

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

  

MediaCodec ---> GLES外部纹理(NV12) [1] --->渲染---> GLES纹理(RGB)

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

  • 有没有办法访问数据,因为我会访问一个简单的数组(指针+偏移量)?
  • 我是否在思考整件事?
  • Surface SurfaceTexture 是否负责转换? (我不这么认为)
  • 在填充GLES外部纹理( [1] )的同时, Surface SurfaceTexture 更改数据的内存布局,以便组件可以可以通过GLES纹理访问函数访问吗?

1 个答案:

答案 0 :(得分:3)

是的,我会说你过度思考它。你有没有测试过并遇到一个你可以描述的实际问题,或者到目前为止这只是理论上的问题?

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