我目前正在尝试在 Android 上开发一个视频播放器,但在颜色格式方面遇到了困难。
Context:我通过以下标准组合提取和解码视频媒体提取器/媒体编解码器。因为我需要提取的帧可用作 OpenGLES 纹理 (RGB),我设置了我的解码器(媒体编解码器)以便它提供外部 GLES 纹理(GL_TEXTURE_EXTERNAL_OES)通过 SurfaceTexture。我知道我的硬件解码器输出的数据位于NV12 (YUV420 半平面)格式,我需要通过渲染将其转换为 RGB(使用片段着色器进行转换)。
MediaCodec ---> GLES 外部纹理 (NV12)[1]---> 渲染 ---> GLES 纹理 (RGB)
我挣扎的点是:如何访问 GLES 外部纹理中包含的特定 Y、U 和 V 值([1])。我不知道 GLES 纹理内存是如何设置的,也不知道如何访问它(“texture()”和“texelFetch()”GLSL 函数除外)。
- 有没有一种方法可以像访问简单数组(指针+偏移量)一样访问数据?
- 是不是我想太多了?
- 做任一Surface or 表面纹理照顾转换? (我不这么认为)
- 做任一Surface or 表面纹理填充 GLES 外部纹理时更改数据的内存布局([1])所以可以通过 GLES 纹理访问函数来访问组件?
是的,我想说你想太多了。您是否测试过并遇到了可以描述的实际问题,或者到目前为止这只是理论上的?
即使原始解码器本身输出 NV12,当您通过SufaceTexture
- 然后你就可以将它作为任何 RGB 纹理来访问。由于纹理的物理内存布局是隐藏的,因此您实际上并不知道在获取纹理之前它是否实际上一次全部转换,或者纹理访问器是否在每次采样时进行即时转换。据我所知,实现可以自由地以任何这些方式完成,并且有关如何完成的实现细节根本无法通过公共 API 观察到。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)