Fra*_*ush 5 android yuv android-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);
Run Code Online (Sandbox Code Playgroud)
FullFrameRect 创建一个 SurfaceTexture 并将其设置为相机预览纹理。
但是在 ExtractMpegFramesTest 中,使用了 CodecOutputSurface 并且它还创建了一个纹理。我怎样才能一起使用 CodecOutputSurface 和 FullFrameRect?(一个提供表面来接收解码器输出,一个重新缩放并渲染到编码器输入表面。)
让我尝试回答“为什么”部分。如果您允许,我将更改问题的顺序。
而为什么有这么多YUV颜色格式呢?
YUV只是用于表示视觉信息的众多色彩空间之一。由于许多技术和历史原因,此色彩空间最适用于摄影数据(包括视频)。维基百科声称,YUV 是在电视开始从黑白转变为彩色时发明的。那时,这些都是模拟信号。后来,不同公司和国家的不同工程师开始独立发明以数字格式存储这种YUV数据的方法。难怪他们没有想出一种格式。
此外,YUV 格式存储的色度信息量有所不同。YUV 420、422 和 444 都有权利存在,这是很自然的,在精度和大小之间给出了不同的折衷。
最后,YUV 格式的一些差异与像素的物理布局有关,并针对不同的光学传感器进行了优化。
这就引出了您问题的第一部分:
为什么不使用统一的YUV格式呢?
将照片信息从光学传感器传输到计算机(智能手机)内存是一项技术挑战。当我们谈论百万像素的实时高速视频流时,带宽限制和电子噪声变得很重要。某些 YUV 格式(例如uyvy或 OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m)经过优化,可减少从光学传感器到字节缓冲区的电子拥塞。
如果在适当的集成电路上使用,这些格式可能具有显着的优势,或者如果在不同类型的硬件上使用,则根本没有优势。
硬件编解码器也是如此。h264 解码器的不同实现可以利用不同隔行 YUV 格式的缓存局部性。
| 归档时间: |
|
| 查看次数: |
3090 次 |
| 最近记录: |