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

问题描述:

我目前正在尝试开发Android上的视频播放器,但我正在努力使用彩色格式。Android MediaCodec输出格式:GLES外部纹理(YUV/NV12)到GLES纹理(RGB)

上下文:我提取并通过MediaExtractor/MediaCodec的标准combinaison解码的视频。因为我需要提取的帧是可用作为OpenGLES纹理(RGB),设置我的解码器(MediaCodec),使得其通过表面纹理馈送外部GLES纹理(GL_TEXTURE_EXTERNAL_OES)。我知道我的硬件解码器输出的数据是在NV12YUV420SemiPlanar)格式,我需要通过渲染将其转换为RGB(使用片段着色器进行转换)。

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

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

  • 有没有办法访问数据,因为我会访问一个简单的数组(指针+偏移)?
  • 我是否过时了整件事?
  • 请执行表面SurfaceTexture是否需要照顾转换? (I不这样认为)
  • 执行下列任表面表面纹理改变数据的存储器布局,同时填充GLES外部纹理([1]),以便组件可以通过GLES纹理访问功能访问?

是的,我会说你正在超越它。你是否测试了一些事情并遇到了一个你可以描述的实际问题,或者这只是迄今为止的理论?然后你访问它的任何RGB纹理 -

即使原始解码器本身输出NV12,当您通过SufaceTexture访问这个细节被隐藏。由于纹理的物理内存布局是隐藏的,你真的不知道,如果它实际上被转换一次全部得到它之前,或者如果纹理存取每次做对的即时转换你品尝它。据我所知,实现可以通过任何这些方式*执行,而实现细节如何完成通过公共API完全不可观察。

+0

我实施了一些测试,你是对的。我的问题只是理论上的,并且运行一些例子让我意识到这些麻烦对我来说是隐藏的。感谢你的回答 –