Written by: algebnaly
Date: 2026-02-17T08:28:45.000Z
YUV是指由亮度(Y), 和色度 (U&V) 来编码图像。
首先YUV420P并不是指每个数据单元中Y存4份, U存2份, V存0份, 我一开始确实是存在这样的认为的, 但这实际上是一个误解, 详细的解释如下。
首先考虑一个4x2的像素网格。
图1 像素网格
YUV420P中的420需要分成三个数字来看, 分别使用变量J(4):a(2):b(0)表示.
这里的J表示基准宽度, 这里是4, a(2)表示图1中, 第1行有几个色度样本(采样一对Cb+Cr算一个色度样本), b(0)表示第2行中有几个新的色度样本。 由于b等于0, 即第二行没有新的色度样本, 因此延续使用第一行的色度样本.
编码的过程可以参考如下的图示
首先从一个4x2的网格开始, 灰色方块表示明度,样本, 相同颜色的圆表示同一个色度样本。
接下来, 由于a=2, 所以第一行采样2次,取得2个色度样本
然后, 由于b=0, 于是第二行使用上一行的色度样本
同理, 我们可以展示422下的采样情况, 注意, 第二行采样了2次
图2 subsampling的解释
上面的描述基于所谓的subsampling pattern notation, 这个链接指向一篇专门描述”Chrominance Subsampling in Digital Images”的论文, 足足有15页, 可见YUV420P这样的名称引起的误解之深。
注意到YUV420P中有个P, 它代表明度/色度样本在内存中的排列方式, 存放的单位为帧, 特别地, 它指的排列方式为Planar,即明度数据和色度数据分开存放, 且U和V也分开存放。除此以外, 还有Packed模式, 它将明度和色度交替排列, 例如YUY2/YUYV格式。还有Semi-Planar模式, 它将明度数据和色度数据分开存放, 但是U和V交替存放, 例如NV12(NV12听起来和NVIDIA有关系, 但实际上关系不大, NV指的是Non-Video或Near-Video)。
下面是一个Planar排列方式的示意图:
[YYY…][UUU…][VVV…]
然后是Packed模式(这里以YUV422Packed为例):
[YUYV…YUYV…]
还有Semi-Planar模式:
[YYY…][UVUV…]
YUV420P这种编码方式要求图像都是由4x2的块组成, 如果图像的大小不是4x2的整数倍如何? (实际上H264中的一个宏块的大小是16x16)
一些编码器会选择直接报错。
另一些编码器会选择主动Padding, 将数据补齐到规整的尺寸, 并在码流元数据中标记实际的尺寸。例如H264就有Crop语法: frame_crop_left_offset, frame_crop_right_offset, frame_crop_top_offset, frame_crop_bottom_offset。
视频的容器也有描述可见区域的元数据, 例如MP4容器的TrackHeaderBox 中就有width和height属性, 可以告诉播放器窗口的大小。