当前位置: 首页 > 知识库问答 >
问题:

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

习高格
2023-03-14

我目前正在尝试开发一个Android上的视频播放器,但是在颜色格式上却很纠结。

上下文:我通过MediaExtractor/MediaCodec的标准组合来提取和解码视频。因为我需要提取的帧作为OpenGLES纹理(RGB)可用,所以我设置了解码器(MediaCodec),以便它通过SurfaceTexture提供外部GLES纹理(GL_TEXTURE_EXTERNAL_OES)。我知道我的HW解码器输出的数据是NV12(YUV420SemiPlanar)格式的,我需要通过渲染将其转换为RGB(使用片段着色器进行转换)。

MediaCodec---->GLES外部纹理(NV12)[1]---->呈现---->GLES纹理(RGB)

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

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

共有1个答案

魏勇军
2023-03-14

是的,我会说你想多了。您是否测试了一些东西,并遇到了一个您可以描述的实际问题,还是这只是理论上的问题?

尽管原始解码器本身输出NV12,但当您通过sufacetexture访问它时,这个细节是隐藏的--然后您可以作为任何RGB纹理访问它。由于纹理的物理内存布局是隐藏的,所以您并不知道在获取它之前它是否真的被一次转换了,或者纹理访问器是否在每次对它进行采样时都进行了即时转换。据我所知,实现可以自由地以这些方式中的任何一种方式进行,而关于如何进行的实现细节根本无法通过公共API观察到。

 类似资料:
  • 我正在使用SurfaceView通过GLES将相机预览渲染到屏幕上。是否可以在下面的方法中裁剪纹理,然后再进行渲染?我想裁剪一个16:9的纹理,在屏幕上显示为4:3。

  • 好的,所以我需要创建我自己的纹理/图像数据,然后在OpenGL中将它显示到一个四边形上。我让四边形工作,我可以用我自己的纹理加载器在上面显示一个TGA文件,它完美地映射到四边形。 但是我如何创建自己的“自制图像”,即每个像素1000x1000和3个通道(RGB值)?纹理数组的格式是什么,例如如何将像素(100,100)设置为黑色? 这就是我对完全白色的图像/纹理的想象: 编辑:下面的答案是正确的,

  • 译注 注意,由于作者对教程做出了更新,之前本节使用的是SOIL库,但现在改为了使用stb_image.h库,关于SOIL配置的部分现在已经被修改,但我仍决定将这部分教程保留起来,放到一个历史存档中,如果有需要的话可以到这里来查看。 我们已经了解到,我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会

  • 将图片加载后创建纹理对象,纹理将直接用于绘制 createTextures(object) 纹理异步加载,批量异步加载接口 手Q版本:7.8.0 函数参数object属性: 属性名 类型 是否必填 说明 file Array 是 要加载的图片文件数组 success Function 否 接口调用成功回调 fail Function 否 接口调用失败回调 complete Function 否 接

  • 我有一个YUV-NV12格式化图像数据的字节缓冲区。当我试图将其转换为RGB时,我得到了一个像下面图像中一样具有拉伸颜色(色度)层的输出。 我遵循了这个伟大的答案,它引导我将YUV-NV21转换为RGB。由于NV-12只是带有翻转U和V数据的NV-21,所以我应该做的唯一更改是替换片段着色器中的和值。 顶点着色器: 片段着色器: 将图像数据拆分并放入2个,分别是和只是一个,其中包含的图像数据为数据

  • 对于SSAO效果,我必须生成两种纹理:法线(在视图空间中)和深度。 根据微软教程(阅读深度模板缓冲区作为纹理章节),我决定使用深度缓冲区作为纹理。 不幸的是,渲染后我从深度缓冲区(下图)中没有得到任何信息: 我想这是不对的。奇怪的是,深度缓冲区似乎有效(我得到了正确的人脸顺序等)。 深度缓冲区代码: 使用第一遍渲染后,我将深度模板与其他渲染目标(颜色、法线)一起设置为纹理资源,将其附加到数组: 在