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

时间:2014-10-20 10:34:36

标签: android yuv mediacodec

" MediaCodec解码器可以使用上述格式之一或专有格式在ByteBuffers中生成数据。例如,基于Qualcomm SoC的设备通常使用OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m(#2141391876 / 0x7FA30C04)。"

这使得甚至无法处理输出缓冲区变得困难。为什么不使用统一的YUV格式?为什么有这么多的YUV颜色格式?

@fadden,我发现可以解码到Surface并获得RGB缓冲区(如http://bigflake.com/mediacodec/ExtractMpegFramesTest.java.txt),我可以将RGB缓冲区转换为YUV格式然后对其进行编码吗?

而且,fadden,我尝试使用API​​ 18+并遇到了一些问题。我参考了ContinuousCaptureActivity和ExtractMpegFramesTest代码。 在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创建一个SurfaceTexture,并将其设置为相机预览纹理。

但是在ExtractMpegFramesTest中,使用了CodecOutputSurface并且它还创建了一个纹理。如何将CodecOutputSurface和FullFrameRect一起使用?(一个提供表面以接收解码器输出,一个重新缩放并渲染到编码器输入表面。)< / p>

1 个答案:

答案 0 :(得分:0)

让我尝试回答'why'部分。如果得到您的许可,我将更改问题的顺序。

  

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

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

此外,YUV格式在它们存储的色度信息量方面不同。 YUV 420,422和444都有权存在是很自然的,在精度和尺寸之间给出了不同的妥协。

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

这将我们带到你问题的第一部分:

  

为什么不使用统一的YUV格式?

将照片信息从光学传感器传输到计算机(智能手机)存储器是一项技术挑战。当我们谈论一个百万像素的实时high-speed视频流时,带宽限制和电子噪音变得非常重要。一些YUV格式,如uyvy或OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m,经过优化,可以减少从光学传感器到字节缓冲区的电子拥塞。

如果在适当的集成电路上使用,这些格式可能具有显着优势,或者如果在不同类型的硬件上使用,则根本没有优势。

硬件编解码器也是如此。对于不同的隔行YUV格式,h264解码器的不同实现可以利用cache locality