小编cre*_*zyz的帖子

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

我目前正在尝试在 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 函数除外)。

  • 有没有一种方法可以像访问简单数组(指针+偏移量)一样访问数据?
  • 是不是我想太多了?
  • SurfaceSurfaceTexture是否负责转换?(我不这么认为)
  • SurfaceSurfaceTexture在填充 GLES 外部纹理 ( [1] ) 时是否会更改数据的内存布局,以便可以通过 GLES 纹理访问函数来访问组件?

rgb android opengl-es yuv android-mediacodec

4
推荐指数
1
解决办法
2033
查看次数

标签 统计

android ×1

android-mediacodec ×1

opengl-es ×1

rgb ×1

yuv ×1