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

为什么MediaCodec的解码器不输出统一的YUV格式(像YUV420P)?

阎阳
2023-03-14

“MediaCodec解码器可以使用上述格式之一或专有格式在字节缓冲区中产生数据。例如,基于Qualcomm SoC的设备通常使用OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m(#2141391876/0x7FA30C04)。”

为什么不使用统一的YUV格式?为什么有这么多的YUV颜色格式?

@fadden,我发现有可能解码到Surface并获得RGB缓冲区(像http://bigflake.com/mediacodec/extractmpegframestest.java.txt),我能把RGB缓冲区转换成YUV格式然后编码吗?

fadden,我尝试使用API18+时遇到了一些问题,我引用了ContinuousCaptureActivity和ExtractTMPegFrameStest代码。在ContinuousCaptuReactivity中:

    mEglCore = new EglCore(null, EglCore.FLAG_RECORDABLE);
    mDisplaySurface = new WindowSurface(mEglCore, holder.getSurface(), false);
    mDisplaySurface.makeCurrent();

    mFullFrameBlit = new FullFrameRect(
            new Texture2dProgram(Texture2dProgram.ProgramType.TEXTURE_EXT));
    mTextureId = mFullFrameBlit.createTextureObject();
    mCameraTexture = new SurfaceTexture(mTextureId);
    mCameraTexture.setOnFrameAvailableListener(this);
    mCamera.setPreviewTexture(mCameraTexture);

FullFrameRect创建一个表面照片,它被设置为相机预览纹理。

但是在ExtractMpegFramesTest中,使用了CodecOutputSurface并且它还创建了一个文本。我如何将CodecOutputSurface和FullFrameRect一起使用呢?(一个供给面接收解码器输出,一个缩放和渲染到编码器输入面。)

共有1个答案

郎曜文
2023-03-14

让我试着回答“为什么”的部分。如果您允许,我将改变问题的顺序。

以及为什么有这么多YUV颜色格式?

YUV只是用来表示视觉信息的众多颜色空间中的一个。由于许多技术和历史原因,这种颜色空间对于摄影数据(包括视频)最受欢迎。维基百科声称YUV是在电视开始从BW向彩色转变的时候发明的。那时,这些是模拟信号。后来,不同公司和国家的不同工程师开始独立发明以数字格式存储这种YUV数据的方法。难怪他们没有想出一种格式。

此外,YUV格式在它们所存储的色度信息的体积上有所不同。YUV420、422和444都有存在的权利,在精度和尺寸之间做出不同的折衷,这是很自然的。

最后,YUV格式的一些差异与像素的物理布局有关,并且针对不同的光学传感器进行了优化。

这就引出了你问题的第一部分:

如果在适当的集成电路上使用,这些html" target="_blank">格式可能具有显著的优势,如果在不同类型的硬件上使用,则完全没有优势。

硬件编解码器也是如此。h264解码器的不同实现可利用高速缓存局部性用于不同隔行的YUV格式。

 类似资料:
  • Android MediaCodec可以用来解码输出的yuv420格式。我猜应该是NV12格式,但是当我在Nexus6 7.1.1设备上试用的时候。结果很奇怪: > 对于720p视频,它工作良好,输出的yuv可以通过ffplay播放,使用以下命令: ffplay-V信息-F rawvideo-PIXEL_FORMAT yuv420p-VIDEO_SIZE 1280x720 OUT.YUV 当试图解

  • 我目前正在尝试开发一个Android上的视频播放器,但是在颜色格式上却很纠结。 上下文:我通过MediaExtractor/MediaCodec的标准组合来提取和解码视频。因为我需要提取的帧作为OpenGLES纹理(RGB)可用,所以我设置了解码器(MediaCodec),以便它通过SurfaceTexture提供外部GLES纹理(GL_TEXTURE_EXTERNAL_OES)。我知道我的HW解

  • 大小范围在2.5MB-20MB之间。这个问题在较长的剪辑上变得更糟,例如7分钟的范围是9MB-120MB。 正常吗? 我试图捕捉同样的场景,但还是得到了不同的结果。

  • 我正在尝试从解码的mp4缓冲区中获取PCM样本以进行进一步处理。我首先从使用手机的相机应用程序录制的视频文件中提取音轨,并且我已经确保在获得“音频/mp4”mime键时选择了音轨: 之后,我遍历轨道,向编解码器提供编码访问单元流,并将解码的访问单元拉入ByteBuffer(这是我从此处发布的视频渲染示例中回收的代码https://github.com/vecio/MediaCodecDemo):

  • 本文向大家介绍对python的输出和输出格式详解,包括了对python的输出和输出格式详解的使用技巧和注意事项,需要的朋友参考一下 输出 1. 普通的输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字。比如输出'hello, world',用代码实现如下: print()函数也可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出: print()会依次打印每个字符串,遇到逗

  • 我已经复制粘贴了我在stackoverflow上找到的一些代码,将默认的相机预览YUV转换成RGB格式,然后上传到OpenGL进行处理。这很好,问题是大部分中央处理器都忙于将YUV图像转换成RGB格式,这变成了瓶颈。 我想将YUV图像上传到GPU,然后在片段着色器中将其转换为RGB。我使用了在CPU上运行的Java YUV to RGB函数,并试图使其在GPU上运行。 这变成了一场小小的噩梦,因为