YUV颜色空间是PAL、NTSC、SCEAM三大视频标准使用的颜色空间,主要应用于视频系统。YUV色彩空间中,Y表示亮度信息,U和V表示色度(色调和饱和度)信息。
YUV存储格式分成三大类:
packed:将Y、U、V分量交织存放在一起,和RGB的存放方式类似。内存中排列形式类似:YVYUYVYUYVYUYVYU...。在具体的存储模式命名中,packed格式不带后缀P。
planar:将Y、U、V的三个分量分别存放在不同的矩阵(平面)中。内存中排列形式类似:YYYYYY...,UUUUUU...,VVVVVV...。在具体的存储模式命名中,planar格式带后缀P。
semi-planar:将Y、U、V三个分量放在两个矩阵(平面)中。Y占用一个平面,UV共用一个平面。内存中排列形式类似:YYYYYY...,UVUVUV...。在具体的存储模式命名中,semi-planar格式带后缀SP。
YUV图像存储模式与采样方式密切相关。主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0。这些采样方式,不压缩Y分量,对UV分量的压缩程度不同,这是由人眼的特性决定的,人眼对亮度Y更敏感,对色度UV没有那么敏感,压缩UV分量可以降低数据量,但并不会人眼主观感觉造成太大影响。
1 采样方式YUV4:4:4
相邻的4个像素里有4个Y、4个U、4个V。每1个Y使用1组UV分量。如下(每个[]为一个像素点):
[ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ] [ Y U V ]
在这种采样方式下,一个像素点包含的完整的信息。
2 采样方式YUV4:2:2
相邻的4个像素里有4个Y、2个U、2个V。每2个Y共用1组UV分量。平均算来,一个像素占用的数据宽度为16b,其中Y占8b,U占4b,V占4b。后面存储模式命名中的数字16指的就是16b。
[ Y U ] [ Y V ] [ Y U ] [ Y V ] [ Y V ] [ Y U ] [ Y V ] [ Y U ] [ Y U ] [ Y V ] [ Y U ] [ Y V ] [ Y V ] [ Y U ] [ Y V ] [ Y U ]
在这种采样方式下,还原出一个像素点,需要相邻的两个像素点数据,如下:
[ Y U ] [ Y V ]
在同一采样模式下,根据分量元素排列顺序的不同,又分为不同的存储模式:YUYV,YUV422P,YUV422SP等。
3 采样方式YUV4:2:0
相邻的4个像素里有4个Y、2个U、0个V,或4个Y、2个V,0个U。每4个Y共用1组UV分量。平均算来,一个像素占用的数据宽度为12b,其中Y占8b,U占2b,V占2b。后面存储模式命名中的数字12指的就是12b。
[ Y U ] [ Y ] [ Y U ] [ Y ]
[ Y V ] [ Y ] [ Y V ] [ Y ]
[ Y U ] [ Y ] [ Y U ] [ Y ]
[ Y V ] [ Y ] [ Y V ] [ Y ]
在这种采样方式下,还原出一个像素点,需要相邻的四个像素点数据,如下:
[ Y U ] [ Y ] [ Y V ] [ Y ]
在同一采样模式下,根据分量元素排列顺序的不同,又分为不同的存储模式:YUV420P,YUV420SP等
YUV420在内存中存放的大小:
Y = width * hight (总和)
U = Y / 4
V = Y / 4
所以一张YUV图像他的存储空间就是:
width * height + width * height / 4 + width * height / 4
化简后就是 width * height *3 /2
YUV420P(planar格式)在ffmpeg中存储是在struct AVFrame的data[]数组中
data[0]-------Y分量
data[1]-------U分量
data[2]-------V分量