首页 文章

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

提问于
浏览
1

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

Context: 我通过MediaExtractor / MediaCodec的标准组合提取和解码视频 . 因为 I need the extracted frames to be available as OpenGLES textures (RGB) ,我设置了我的解码器(MediaCodec),以便它通过SurfaceTexture提供外部GLES纹理(GL_TEXTURE_EXTERNAL_OES) . 我知道我的HW解码器输出的数据是NV12(YUV420SemiPlanar)格式,我需要通过渲染它(使用片段着色器进行转换)将其转换为RGB .

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

The point where I struggle is :如何访问GLES外部纹理( [1] )中包含的特定Y,U和V值 . 我不知道如何设置GLES纹理内存,也不知道如何访问它(除了"texture()"和"texelFetch()" GLSL函数) .

  • 有没有办法访问数据,因为我会访问一个简单的数组(指针偏移)?

  • 我是否过度思考了整件事?

  • Surface或SurfaceTexture是否负责转换? (我不这么认为)

  • 在填充GLES外部纹理( [1] )时,Surface或SurfaceTexture是否更改数据的内存布局,以便可以通过GLES纹理访问函数访问组件?

1 回答

  • 2

    是的,我会说你是在思考它 . 您是否测试过并遇到了您可以描述的实际问题,或者到目前为止这只是理论问题?

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

相关问题