1. YUV存储格式与采样
1.1 YUV存储格式
YUV是一种亮度信号Y和色度信号U、V是分离的色彩空间,它主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。 YUV格式分为两种类型:Packed类型和Planar类型。
- Packed类型:是将YUV分量存在在同一个数组中,每个像素点的Y、U、V是连续交错存储的;
- Planar类型:是将YUV分量分别存放到三个独立的数组中,且先连续存储所有像素点的Y,紧接着存储所有像素点的U,最后是所有像素点的V。
1.2 YUV采样方式
YUV码流的存储格式与采样方式密切相关,目前主流的采样方式有如下三种:YUV444、YUV422、YUV420,其中,YUV444采样是每一个Y对应一组UV分量,每个像素(YUV)占32Bits;YUV422采样是每两个Y共用一组UV分量,每个像素占16bits(Y占8bits、UV分量占8bits);YUV420采样是每四个Y共用一组UV分量,每个像素(YUV)占16bits或者12bits。三种采样格式表示如下图:
2. 常见YUV420颜色格式内存分析
2.1 摄像头设备输出的颜色格式
考虑到摄像头设备种类很多,比如手机摄像头、USB摄像头、WIFI摄像头等,输出图像涉及到的YUV颜色格式也有所区别,因此这里我就选择开发中时常接触的手机摄像头来讲解。关于手机自带Camera采集图像的YUV颜色格式,可以通过Camera.Parameters.getSupportedPreviewFormats ()
方法获取Camera支持的颜色格式。API介绍如下:
从getSupportedPreviewFormats ()方法可知,手机自带Camera主要支持NV21和YV12
两种YUV颜色格式,其中,YV12引入于API12。下面我们着重分析下这两种格式的特征以及内存存储特点:
【腾讯文档】FFmpegWebRTCRTMPRTSPHLSRTP播放器-音视频流媒体高级开发-资料领取
https://docs.qq.com/doc/DYU5ORlBOdkpCUkNxhttps://docs.qq.com/doc/DYU5ORlBOdkpCUkNx
(1) NV21:YYYYYYYY VUVU
从android/graphics/ImageFormat.NV21中可知,NV21是手机自带Camera默认的预览格式,即采集图像颜色格式为NV21。NV21是一种半平面(Semi Planner)格式,Y分量占一个平面空间,VU交叉存储占一个平面空间,4个像素的Y分量共用一个VU分量。示意图如下:
在内存中的存储: