1.YUV
YUV是一种常见的视频像素格式,经常用在视频编解码上面,YUV分别由Y分量和U、V分量(红色投影Cr)组成。Y分量指的是亮度分量,也就是我们经常说的灰阶值,相当于一副灰色的图像。而U分量和V分量表示的是色度分量,它的作用就是用于影像的色彩以及饱和度,常用于指定像素的颜色,U分量是图像蓝色部分去掉亮度Y,V分量是图像红色部分去掉亮度Y。换言之如果一副图像只有Y分量,没有UV分量就相当于我们看黑白电视一样,没有颜色,所以现在大部分彩色电视都引用了YUV像素格式。
2.YUV的优势
YUV和RGB是目前最流行的两套颜色格式,但是在我们音视频编解码和网络传输的时候基本上都会用YUV格式,而非RGB格式。这是由于YUV在网络传输的时候只需要占用很少的带宽进行传输,这能够大大节约存储空间、并且提高传输效率。比方说,使用YUV420P格式进行采样能够比RGB节约超过1/2的存储空间。
3.YUV采样格式
现在主流的YUV采样方式一般分三种分别是:YUV444、YUV422、YUV420。我们来看看这三种采样格式的区别:
1. YUV444
YUV444采样,相当于Y、U、V三个分量采用相同的采样比例进行采样。所以用YUV444采样生成的图像,YUV三个分量的信息是完整的,都是8bit,也就是一个字节。这里的YUV444顾名思义就是4个Y分量、4个U分量、4个V分量。Y分量大小:w * h;U分量大小:w * h;V分量大小:w * h。
所以,我们用YUV444格式去采样一个1920 * 1080的图像的时候,得到的大小等于:(1920 * 1080 * 8 + 1920 * 1080 * 8 + 1920 * 1080 * 8)/8/1024/1024 ~= 5.94M。从计算公式可以看出,YUV444每一帧图像大小和RGB差不多,所以在真正开发中很少会用到。
2. YUV422
YUV422采样,相当于U、V分量是以Y分量采样的一半进行采样,Y分量和UV分量按照2:1的比例进行采样(也可以理解为两个Y分量对应一个UV分量)。就比方说,若一个水平方向有8个像素点,那么采样了8个Y分量,那么UV分量只有4个。这里采样用的是4个Y分量、2个U分量、2个V分量进行采样。Y分量大小:w * h;U分量:w * h /2;V分量:w * h /2。
所以,用YUV422采样的大小是:(1920 * 1080 * 8 + (1920 * 1080)/2 * 8 + (1920 * 1080)/2 * 8)/8/1024/1024 ~= 3.96M。
3. YUV420
YUV420采样,相当于每一行扫描的时候只扫描一种色度分量(U分量或者V分量),和Y分量按照2:1的方式进行采样(也可以理解为四个Y分量对应一个UV分量)。就比方说,在第一行扫描的时候,YV分量按照2:1的方式进行采样,那么YU分量也是用2:1的方式采样,所以对于每个色度分量来说,它的水平方向和垂直方向的采样比都是2:1。这里采用的是4个Y分量、2个U分量、0个V分量采集,而下一行的则是用4个Y分量、0个U分量、2个V分量采样。所以,Y分量大小:w * h;U分量:w * h /4; V分量:w * h/4。
所以用YUV420采集一个1920 * 1080的图像大小:(1920 * 1080 * 8 + (1920 * 1080)/4 * 8 + (1920 * 1080)/4 * 8)/8/1024/1024 ~=2.97M。可以看到用YUV420采样的图像比YUV444和YUV422都节省空间,因此它是目前最主流的采样格式。
4.YUV存储格式
YUV存储一般分为两大类,一种是Planar,另外一种是Packed。
Planar
指的是平面格式:它的特点是先连续存储所有的Y像素点,然后再存储所有的U像素点,最后存储所有的V像素点。换言之它分三个数组存储三个分量,比方说data[0]存储所有的Y分量、data[1]存储所有的U分量、data[2]存储所有的V分量。
Packed
指的是打包格式:它的特点是所有像素点的YUV分量都是连续存储,并且所有的数据都存储在data[0]里面。
所以根据采样方式的不同和存储方式的不同,在实际开发中就有了多种YUV格式,主要是针对YUV420和YUV422:
YUV420采样格式
就有这几种打包格式:NV12、NV21、YV12、YU12
1.NV12
这种方式使用的是平面格式来存储数据,换言之就是先存储Y分量、 然后UV交替存储。
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 U0 V0...
第一平面(Plane 0):存储所有的Y分量,一个像素一个Y值。
第二平面(Plane 1):打包存储 所有的U和V分量。UV分量是交错的,每个2x2的Y像素块共享一对UV值。
2.NV21
这种方式使用的是平面格式来存储数据,换言之就是先存储Y分量、 然后VU交替存储。
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 V0 U0...
3.YV12
这种方式使用的是平面格式来存储数据,换言之就是先存储Y分量、 然后存V分量、 最后存U分量。
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 V0 U0...
4.YU12
这种方式使用的是平面格式来存储数据,换言之就是先存储Y分量、 然后存U分量、 最后存V分量。
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 U0 V0...
第一平面(Plane Y):存储所有的Y分量。
第二平面(Plane U/Cb):存储所有的U分量。
第三平面(Plane V/Cr):存储所有的V分量。
YUV422采样格式
就有这几种打包格式:YUYV、UYVY、YUV422P:
1.YUYV
采用的是打包方式存储,它的特点是每个像素点采用Y分量存储,但是每隔一个像素点用UV分量采样。
Y0 U0 Y1 V0 Y2 U2 Y3 V2
2.UYVY
采用的是打包方式存储,它的特点是每个像素点采用U分量再采样Y分量
U0 Y0 V0 Y1 U2 Y2 V2 Y3
3.YUV422P
采用的是平面方式存储,它的特点是先存储所有的Y分量、然后在存储U分量、最后存储V分量Y0
Y0 Y1 Y2 Y3 U0 U1 V0 V1