目录
1、YUV420P
YUV420P又叫plane平面模式,Y , U , V分别在不同平面,也就是有三个平面,它是YUV标准格式4:2:0,主要分为:YU12和YV12
1.1、YU12 I420
这个wiki上面的图片示例非常明了,第一个图标识了图片真正像素的表示。可 以看到Y1, Y2, Y7, Y8这些物理上相近的4个像素公用了同样的U1和V1,相似的Y3,Y4,Y9,Y10用的就是U2和V2。这里不同的颜色把这个特性刻画的非常形象,一 目了然。Impressive!!一直觉得教育,或者说基础的教育一定要以这样的模式来阐述这样才能知其所以然,那种盲目的抄了一本国外的教材或者合并了 几本破书的教材不是教人是毁人。 说远了,言归正传。之前说的是物理像素的表示,在内存中的分布则是一个数组,顺序就是YUV。所以如果知道所要表现的取悦的大小的话很容易查找到具体的YUV在数组中的位置。
1.2、YV12
与YU12唯一区别是V在前U在后,把上图5行与6行对调即可。
2、YUV420SP
YUV420SP格式的图像阵列,首先是所有Y值,然后是UV或者VU交替存储,NV12和NV21属于YUV420SP格式,是一种two-plane模式,即Y和UV分为两个plane,但是UV(CbCr)为交错存储,而不是像YUV420格式那样分为三个平面。主要分为:NV21和NV12。
NV12和YV12稍有不同,区别就在UV的位置。再看一张图就很明了了!
2.1、NV12
存储顺序是先存Y值,再UV交替存储:YYYYUVUVUV,以 4 × 4 图片为例子,占用内存为 4 × 4 × 3 / 2 = 24 个字节
在YV12中U和V都是连续排布的,而在NV12中,U和V就交错排布的。看到内存中的排布很清楚,先开始都是Y,之后的都是U1V1U2V2的交错式排布。对于像素的压缩的效果是一样的。但是可能是硬件加速的支持与否。
2.2、NV21
存储顺序是先存Y值,再VU交替存储:YYYYVUVUVU,以 4 × 4 图片为例子,占用内存为 4 × 4 × 3 / 2 = 24 个字节
与NV12唯一区别是V在前U在后,把上图5行与6行中的U与V对调即可。
3、YUV和RGB转换
Y =(0.257* R)+(0.504* G)+(0.098* B)+16
U =(0.439* R)-(0.368* G)-(0.071* B)+128
V =-(0.148* R)-(0.291* G)+(0.439* B)+128
R =1.164*(Y -16)+2.018*(U -128)
G =1.164*(Y -16)+0.813*(V -128)-0.391*(U -128)
B =1.164*(Y -16)+1.596*(V -128)
4、分离YUV分量
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UV UV =>YUV420SP
NV21: YYYYYYYY VU VU =>YUV420SP
YV12 : 亮度(行×列) + U(行×列/4) + V(行×列/4)
I420 : 亮度(行×列) + V(行×列/4) + U(行×列/4)
5、YUV 采样
色度通道的采样率可以低于亮度通道,而不会显著降低感知质量。
4:4:4 表示完全取样。
4:2:2 表示2:1的水平取样,垂直完全采样。
4:2:0 表示2:1的水平取样,垂直2:1采样。
4:1:1 表示4:1的水平取样,垂直完全采样。
最常用Y:UV记录的比重通常1:1或2:1,Video是以YUV4:2:0的方式记录,也就是我们俗称的I420,YUV4:2:0并不是说只有U(即Cb),V(即Cr)一定为0,而是指U:V互相援引,时见时隐,也就是说对于每一个行,只有一个U或者V分量,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0…以此类推。至于其他常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等。
YUV 4:4:4
完全取样,每个像素都有独立的Y/U/V值
为了方便对比,我们挑画面下方横条渐变色块6x5个像素放大40倍,看像素的YUV值(其它采样也取相同位置)。
从如下图所示,可以看出相邻的像素点的Y/U/V值不相等也可以看出每个像素都有独立的U/V值
YUV 4:2:2
每两个Y共用一对U/V值
422采样,水平方向每两个像素共用一对U/V值,下如图绿色框(U channel)和蓝色框(V channel)标记的一个框在内存中只有一个值。
YUV 4:2:0
每四个Y共用一对U/V值
420采样,因为是相邻的4个像素共用一对U/V,所以会出现如下图所示,每四个相邻的像素就出现4个相同的UV值。
YUV 4:1:1
与YUV 4:2:0类似,都是四个每四个Y共用一对U/V值,区别是4:1:1是水平方向的4个Y共享一对U/V,如下图所示,第1-4个Y使用同一对U/V值,第5-8个Y使用同一对U/V值,依次类推。。。
这里就不截图举例了,由于411采样的不太常用的以致于一般工具都不支持播放,有了422的例子其实也好更多,411相当于在422的基础上再在水平方向下采样,即水平方向每连续4个像素共用一对UV。
6、Planar Format
planar format
Packed (or Interleaved)
将YUV三个分量的素数值放在同一个阵列中,存储为单个阵列宏像素
将每个像素点的Y/U/V连续交叉存储
以UYVY、YUYV为例,由两个像素的Y/U/V组成一个宏像素,依次排列
UYVY
U0Y0V0Y1 U2Y2V2Y3 U4Y4V4Y5 U6Y6V6Y7 …
YUYV
Y0U0Y1V0 Y2U2Y3V2 Y4U4Y5V4 Y6U6Y7V6 …
Planar
每个分量存储为单独的数组,最终图像是三个单独平面的整合
以I420为例Y/U/V排列如下:
width: 图像分辨率的宽 height: 分辨率高 n = width * height m = width * height / 4 Y0Y1Y2Y3Y4Y5…Yn U0U1U2U3…Um V0V1V2V3…Vm
Semi-Planar
介于Pakced和Planar之间,即Y分量为一个阵列,UV交叉存储
NV12
width: 图像分辨率的宽 height: 分辨率高 n = width * height m = width * height / 4 Y0Y1Y2Y3Y4Y5…Yn U0V0U1V1U2V2U3V3…UmVm
Note: 格式的名称以“ p”结尾的一般都是planar格式,如在ffmpeg 中的yuvj420p格式 格式的名称以“ sp”结尾的一般都是semi-planar格式
7、关系图
8、计算
由于YUV格式是未经压缩并且只存储了Y/U/V三个通道的数据,播放或编码必须要知道分辨率和YUV具体的格式(如nv12/i420/yuvj420ple), 因此在YUV文件命名时建议名字包含YUV格式名称和分辨率信息
这里计算文件大小或者计算帧数中的采样率和位深可由YUV格式得到
YUV计算文件大小
已知YUV采样率、分辨率、和帧数
文件大小=宽 * 高 * 采样率 * 向上取整(位深/8) * 帧数
file size(byte) = width * height * rate * Ceil(bitdepth/8) * frames
以最常用的nv12/i420等8bit位深的420为例
文件大小 = 宽 * 高 * 1.5 * 帧数
YUV计算帧数
YUV帧数的计算和文件大小的计算类似
要求已知文件大小、采样率、分辨率
YUV帧数=文件大小/(宽 * 高 * 采样率 * 向上取整(位深/8))
YUV frames = file size(byte) / (width * height * rate * Ceil(bitdepth/8))
sample map
sample | rate |
4:4:4 | 3 |
4:2:2 | 2 |
4:2:0 | 1.5 |
4:1:1 | 1.5 |
大小端序(字节序)
当位深超过8bit时存在大小端模式的情况
big-edian(大端序): 低地址存放高位
little-endian(小端序): 低地址存放低位
格式名称以le为小端序,格式名称以be为小端序
相同名称只是后缀不一样的两种格式YUV排列是完全一样的, 如,yuv420p10le与yuv420p10be
9、一些常用格式
YUV格式关系
YUV格式名称比较多在不同的地方不同的名称有可能代表的是同一种格式,如在ffmpeg中的yuyv422与gstreamer 中的yuy2,以及其它不它的格式名称YUY2/YUYV/YUNV, 都是代表同一种YUV格式。
ffmpeg pix_fmt | gstreamer format | Duplicate formats | number of components | Bits per pixel | remark |
yuvj420p | i420 | IYUV/YU12 | 3 | 12 | full range |
yuv420p | - | 3 | 12 | limited range , 排列方式与yuvj420p完全一致,只是像素颜色范围是[16,235], 16表示黑色,235表示白色; UV范围[16,240] | |
nv12 | nv12 | 3 | 12 | - | |
nv21 | nv21 | 3 | 12 | - | |
yuyv422 | yuy2 | YUY2/YUYV/YUNV | 3 | 16 | YUYV 4:2:2 |
uyvy422 | uyvy | UYVY/IUYV/HDYC/ UYNV/Y422 | 3 | 16 | UYVY 4:2:2 |
yuv420p10le | i420-10le | 3 | 15 | 10 bit yuv | |
p010le | p010-10le | 3 | 15 | 10 bit yuv | |
yv12 | - | 3 | 12 | YV12 (3-planar) ——These formats are identical to YU12 except that the U and V plane order is reversed. |
10、常见的YUV格式存储排列方式
Define:
s = width * height
n = width * height // 4
m = width * height // 2
I420/IYUV/YU12: yuv420 planar 的一种, 排列方式: y1y2y3…ysu1u2u3…unv1v2v3…vn
nv12: 8bit YUV420 Semi-Planar的一种格式, 排列方式: y1y2y3…ysu1v1u2v2u3v3…unvn
nv21: 8bit YUV420 Semi-Planar的一种格式, 排列方式: y1y2y3…ysv1u1v2u2…vnun
i420-10le: 10bit YUV420 Planar的一种格式, 排列方式与i420一样, 只是每个值都用10bit低字节序来存储
p010-10le: 10bit YUV420 Semi-Planar的一种格式, 排列方式与nv12一样, 只是每个值都用高10bit低字节序来存储
YUY2/YUYV/YUNV: 8bit YUV 4:2:2格式, 排列方式: y1u1y2v1 y3u2y4v2 y5u3y6v3…yn-1umynvm
UYVY/IUYV/HDYC/UYNV/Y422: 8bit YUV 4:2:2格式, 排列方式: u1y1v1Y2 u2y3v2y4 u3y5v3y6…umyn-1vmyn
yv12: YUV420 Planar的一种,UV的顺序与i420相反, 排列方式: y1y2y3y…ynv1v2v3…vnu1u2u3…un
YUV422P/I422: y1y2y3…ysu1u2u3…umv1v2v3…vm
nv16: yuv422 Semi-Planar的一种: y1y2y3…ys u1v1u2v2u3v3…umvm
nv61: 与nv16类似,只是u/v的位置互换(V前U后)
yv16: yuv422 Planar的一种: y1y2y3…ysu1u2u3…umv1v2v3…vm
yuvj444p: Planar的一种: y1y2y3y…ys u1u2u3…us v1v2v3…vs
其它4:1:1采样的格式一般不太常见
Y41P: 是一种4:1:1packed格式,其中U和V每四个像素水平采样一次。每个宏像素在三个字节中包含8个像素,并具有以下字节布局:U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y7
Y41T与Y41P相同,除了每个Y样本的最低有效位指定色度键(0 =透明,1 =不透明)。
AI44是一种已标准化的YUV格式,每个样本8位。每个样本在4个最高有效位(MSB)中包含一个索引,在4个最低有效位(LSB)中包含一个alpha值。索引引用YUV调色板条目的数组,必须在该格式的媒体类型中定义。此格式主要用于子图片图像。