我目前正在尝试在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函数除外)。
答案 0 :(得分:3)
是的,我会说你过度思考它。你有没有测试过并遇到一个你可以描述的实际问题,或者到目前为止这只是理论上的问题?
即使原始解码器本身输出NV12,当您通过SufaceTexture
访问它时隐藏此细节 - 然后您可以将其作为任何RGB纹理进行访问。由于纹理的物理内存布局是隐藏的,因此在获取纹理之前,您实际上并不知道它是否实际上是全部转换的,或者每次采样时纹理访问器是否进行了即时转换。据我所知,实现可以通过任何这些方式自由执行,并且根据公共API无法观察到有关如何完成的实现细节。