关于YUV420P的笔记

Written by: algebnaly

Date: 2026-02-17T08:28:45.000Z

YUV420P的解释

YUV是指由亮度(Y), 和色度 (U&V) 来编码图像。

首先YUV420P并不是指每个数据单元中Y存4份, U存2份, V存0份, 我一开始确实是存在这样的认为的, 但这实际上是一个误解, 详细的解释如下。

420是指什么

首先考虑一个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这样的名称引起的误解之深。

P的含义

注意到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属性, 可以告诉播放器窗口的大小。