数字视频基础:像素、分辨率、帧率、色彩空间与色度采样

各位同学,欢迎来到第二章。在正式接触 H.264 和 H.265 的码流之前,我们得先把地基打牢。说白了,视频编码处理的对象不是「画面」,而是「数据」。如果你不理解这些数据长什么样,后面看码流分析工具的输出,你会一头雾水。

我个人习惯把这一章叫做「视频的物理层」。像素、分辨率、帧率、色彩空间、色度采样——这五个概念,决定了原始视频的体积,也决定了编码器能压缩到什么程度。嗯,咱们一个一个来。

2.1 像素与分辨率

像素是图像的最小单元。你可以把它想象成一个「颜色点」。一张 1920×1080 的图,就是横向 1920 个点、纵向 1080 个点,总共约 207 万个点。

分辨率就是「宽×高」。但这里有个坑——分辨率不等于清晰度。我在项目中遇到过有人把 720p 强行拉伸到 1080p 显示,结果画面糊成一片。分辨率只决定像素总数,清晰度还取决于编码质量、码率、显示设备。

常见分辨率速查表
名称 分辨率 宽高比 像素总数
SD (480p) 720×480 3:2 345,600
HD (720p) 1280×720 16:9 921,600
Full HD (1080p) 1920×1080 16:9 2,073,600
4K UHD 3840×2160 16:9 8,294,400
8K UHD 7680×4320 16:9 33,177,600

你想想看,从 1080p 到 4K,像素数翻了 4 倍。如果直接存储原始 RGB 数据,一帧 4K 画面就要将近 100MB。这就是为什么我们需要编码——但这是后话。

2.2 帧率

帧率就是每秒显示多少帧画面,单位 fps。常见的帧率有 24fps(电影)、30fps(电视/直播)、60fps(体育/游戏)。

帧率越高,运动越流畅,但数据量也线性增长。60fps 的视频比 30fps 多一倍的帧,码率自然也要翻倍。

我的经验: 做直播编码时,如果网络带宽有限,我宁愿把帧率降到 25fps 也不降分辨率。人眼对流畅度的容忍度其实比清晰度更高——只要不低于 20fps,大多数观众不会抱怨。

帧率还有一个隐藏属性:时间戳。编码器处理的是帧序列,每一帧都有自己的 PTS(显示时间戳)和 DTS(解码时间戳)。这个后面讲 H.264 的 NAL 单元时会细说。

2.3 色彩空间:RGB vs YUV

这是本章最核心的概念。RGB 是显示器用的,YUV 是编码器用的。为什么编码器不用 RGB?

因为人眼对亮度敏感,对颜色不敏感。YUV 把亮度(Y)和色度(U、V)分开,编码器就可以对色度通道下重手压缩——反正你看不出来。

RGB 三个通道都是全分辨率,每个通道 8bit,一个像素就是 24bit。YUV 呢?Y 通道保留全分辨率,U 和 V 可以降采样。这就是后面要讲的色度采样。

RGB 与 YUV 的转换公式(简化版)
// BT.601 标准,用于标清
Y  =  0.299 * R + 0.587 * G + 0.114 * B
U  = -0.147 * R - 0.289 * G + 0.436 * B + 128
V  =  0.615 * R - 0.515 * G - 0.100 * B + 128

// BT.709 标准,用于高清
Y  =  0.2126 * R + 0.7152 * G + 0.0722 * B
U  = -0.0999 * R - 0.3360 * G + 0.4360 * B + 128
V  =  0.6150 * R - 0.5586 * G - 0.0564 * B + 128

注意看,Y 通道的系数加起来正好是 1.0,而 U、V 的系数加起来是 0。这意味着纯黑白画面(R=G=B)的 U、V 值就是 128——中性灰。我曾经调试一个编码器,发现画面偏绿,查了半天,结果是 YUV 转 RGB 时用了 BT.601 的系数去处理 1080p 的视频。嗯,标准搞错了,颜色全乱套。

2.4 色度采样:4:4:4 / 4:2:2 / 4:2:0

色度采样是 YUV 的精髓。它决定了 U、V 通道相对于 Y 通道的「分辨率」有多高。

先看一张结构图,把三种采样方式的关系理清楚。

色度采样结构对比 4:4:4 Y 全分辨率 U 全分辨率 V 全分辨率 4:2:2 Y 全分辨率 U 水平 1/2 V 水平 1/2 4:2:0 Y 全分辨率 U 水平 1/2 V 垂直 1/2 数据量:4:4:4 = 100% | 4:2:2 = 66.7% | 4:2:0 = 50% 2×2 像素块 Y: 4 个 U: 4 个 V: 4 个 2×2 像素块 Y: 4 个 U: 2 个 V: 2 个 2×2 像素块 Y: 4 个 U: 1 个 V: 1 个

从图上可以看得很清楚:

  • 4:4:4:Y、U、V 都是全分辨率。一个像素 24bit,数据量最大。一般用于专业影视后期、屏幕录制。
  • 4:2:2:U、V 在水平方向降采样一半。一个像素平均 16bit。常用于广播级设备。
  • 4:2:0:U、V 在水平和垂直方向都降采样一半。一个像素平均 12bit。H.264/H.265 最常用的格式,没有之一。

为什么 4:2:0 这么流行?因为人眼对色度的空间分辨率确实不高。你拿一张 4:4:4 的图和一张 4:2:0 的图放在一起,不放大到 200% 根本看不出区别。但数据量直接省了一半。

避坑指南: 我曾经接手过一个项目,编码器输出花屏。排查了三天,最后发现是输入源是 4:2:2,但编码器配置写死了 4:2:0。色度采样不匹配,解码器拿到数据后不知道如何插值,画面就崩了。记住:编码器的输入采样格式必须和配置一致。

2.5 数据量估算

把上面几个概念串起来,我们可以估算原始视频的数据量。

// 以 1080p 30fps 4:2:0 8bit 为例
每帧像素数 = 1920 × 1080 = 2,073,600
每像素比特数 = 8 (Y) + 8/4 (U) + 8/4 (V) = 12 bit
每帧数据量 = 2,073,600 × 12 / 8 = 3,110,400 字节 ≈ 3 MB
每秒数据量 = 3 MB × 30 = 90 MB/s

// 如果是 4K 60fps 4:4:4 10bit
每帧像素数 = 3840 × 2160 = 8,294,400
每像素比特数 = 10 + 10 + 10 = 30 bit
每帧数据量 = 8,294,400 × 30 / 8 = 31,104,000 字节 ≈ 30 MB
每秒数据量 = 30 MB × 60 = 1.8 GB/s

1.8GB/s 的原始数据,不压缩的话,一部 2 小时的电影就是 13TB。这就是为什么我们需要 H.264 和 H.265——它们能把数据压缩到原始体积的 1/100 甚至更低,而画质损失肉眼几乎不可见。

我的建议: 做编码开发时,先把原始数据量算清楚。这能帮你快速判断码率设置是否合理。比如 1080p 30fps 4:2:0,原始数据 90MB/s,你设 10Mbps 码率,压缩比就是 72:1。如果画面复杂,这个压缩比下必然出现块效应。

2.6 本章小结

像素、分辨率、帧率决定了视频的「时空规模」。色彩空间和色度采样决定了每个像素的「数据密度」。这五个参数组合起来,就是编码器的输入约束。

后面讲 H.264 的宏块、H.265 的 CTU 时,你会反复看到这些概念。尤其是色度采样——H.264 的色度插值、H.265 的色度预测,都依赖你对 4:2:0 的理解。嗯,先把基础打牢,后面才走得稳。