YUV原理和格式详解( 二 )

【YUV原理和格式详解】YUV 4:2:0 采样
YUV 4:2:0 采样,并不是指只采样 U 分量而不采样 V 分量 。而是指,在每一行扫描时,只扫描一种色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式采样 。比如,第一行扫描时,YU 按照 2 : 1 的方式采样,那么第二行扫描时,YV 分量按照 2:1 的方式采样 。对于每个色度分量来说,它的水平方向和竖直方向的采样和 Y 分量相比都是 2:1。
Y 分量用叉表示,UV 分量用圆圈表示 。

YUV原理和格式详解

文章插图
举个例子:
假设图像像素为:
[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3][Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
那么采样的码流为:Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8
其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一行按照 2 : 1 进行采样 。
最后映射出的像素点为:
[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7][Y5 U0 V5]、[Y6 U0 V6]、[Y7 U2 V7]、[Y8 U2 V8]
从映射出的像素点中可以看到,四个 Y 分量是共用了一套 UV 分量,而且是按照 2*2 的小方格的形式分布的,相比 YUV 4:2:2 采样中两个 Y 分量共用一套 UV 分量,这样更能够节省空间 。
一张 1280 * 720 大小的图片,在 YUV 4:2:0 采样时的大小为:
(1280 * 720 * 8 + 1280 * 720 * 0.25 * 8 * 2)/ 8 / 1024 / 1024 = 1.32MB。
YUV的存储格式
(打包格式):连续存储每个像素点的Y、U、V分量,丢弃的分量不存储 。
形如YUYV YUYV YUYV YUYV
形如
(平面格式):先存储所有像素点的Y分量,在存储所有像素点的U分量,最后存储所有像素点的V分量 。
形如 UUUU VVVV
形如 UU VV
(半平面格式):先存储所有像素点的Y分量,在交错存储U、V分量
形如
形如 UVUV
平面格式
平面格式有时也称为三面格式(),即 Y, U, V 三个分量各自使用单独的数组保存,这种三平面分离的格式比较方便视频编码 。
YV12 (I420)
YV12 : 亮度(行×列) + V(行×列/4) + U(行×列/4)
I420 : 亮度(行×列) + U(行×列/4) + V(行×列/4)
可以看出,YV12和I420基本上是一样的,就是UV的顺序不同 。
YV12 即 I420,也叫 IYUV,属于格式 。三个平面,分别存储 Y U V 分量 。每四个 Y 分量共享一组 UV 分量 。U、V 平面的 , width 和都是 Y 平面的一半,因此一个像素 12 bits,内存排列如下图所示:
从图中可看出,U、V 平面的每行字节数()、高()都是 Y 平面的一半 。I420 是音视频开发中常用的一种格式 。
J420
J420 与 I420 完全相同,但具有完整范围(0-255,full range)的亮度(Y)分量,而不是有限范围(16-240,range,在 iOS 上也叫做 video range) 。色度(UV)分量与 I420 中的完全相同 。
IMC1
IMC1 与 I420 类似,U, V 平面的宽(width)、高()是 Y 平面的一半,但是每行字节数()与 Y 平面一致,因此 U, V 平面在内存上会有留空(),因此一个像素 16 bits,如图所示:
IMC3
IMC3 与 IMC1 几乎一样,仅改变了 U, V 平面的顺序 。内存排列如下图所示:
YUV原理和格式详解

文章插图
I422
I422 属于格式 。三个平面,分别存储 Y U V 分量 。每两个 Y 分量共享一组 UV 分量 。U、V 平面的 , width 是 Y 平面的一半,但与 Y 平面一致,因此一个像素 16 bits,内存排列如下图所示:
从图中可看出,U、V 平面的每行字节数()是 Y 平面的一半,高()与 Y 平面一致 。
J422
J422 与 I422 完全相同,但具有完整范围(0-255,full range)的亮度(Y)分量,而不是有限范围(16-240,range,在 iOS 上也叫做 video range) 。色度(UV)分量与 I420 中的完全相同 。