3. 视频压缩原理

视频之所以能被压缩到原始数据量的几十分之一甚至几百分之一,根本原因在于原始视频中存在大量“冗余”。编码器的任务,就是把这些冗余识别出来、去掉,再用尽量紧凑的方式重新表达。理解空间冗余、时间冗余、视觉冗余这三类冗余,以及变换、量化、熵编码这三步核心流程,是理解 H.264 与 H.265 差异的基础。

一、三类冗余:压缩的“原料”

空间冗余指同一帧画面内部相邻像素之间的强相关性。例如一面白墙、一片天空,相邻像素亮度几乎相同,直接逐像素存储非常浪费。编码器通过帧内预测,用已编码的邻近像素去“猜”当前块,只记录残差,从而消除空间冗余。

时间冗余指相邻帧之间内容高度相似。摄像机每秒 25/30 帧,多数情况下画面只是轻微移动。编码器通过帧间预测,在参考帧中搜索最匹配的块,只记录运动矢量与残差,而不是整帧重传。这是视频压缩收益最大的来源。

视觉冗余指人眼对某些信息不敏感。人眼对亮度远比对色度敏感,对低频轮廓比对高频细节敏感,对静止区域比对运动区域敏感。因此可以色度下采样、对高频系数粗量化,用“看不出来”的代价换取码率下降。

三类冗余对应三种手段:帧内预测消除空间冗余,帧间预测消除时间冗余,量化与色度处理利用视觉冗余。三者叠加,才构成完整的视频压缩链路。

二、核心流程:预测 → 变换 → 量化 → 熵编码

无论 H.264 还是 H.265,主流程都可归纳为一条混合编码流水线:先把图像划分成块,做预测得到残差,再对残差做变换,然后量化,最后熵编码输出码流。解码端则反向执行。

视频混合编码主流程(编码方向) 输入帧 划分宏块/CTU 预测 帧内 / 帧间 变换 DCT 类整数变换 量化 有损,控码率 熵编码 CABAC / CAVLC 参考帧缓冲 已重建帧 帧间参考 反量化 + 反变换 重建残差 重建回路 三类冗余与对应手段 空间冗余 → 帧内预测 同帧邻近像素预测 时间冗余 → 帧间预测 运动估计 + 运动补偿 视觉冗余 → 量化 / 色度下采样 丢弃不敏感信息

三、各环节的基本思想

  • 预测:不直接编码像素,而是编码“预测值 + 残差”。预测越准,残差越小,后续编码越省码率。帧内预测利用同帧已重建的邻居,帧间预测利用参考帧中匹配块。
  • 变换:把残差从空间域转到频率域。能量集中在低频少数系数上,便于后续压缩。H.264 使用 4×4/8×8 整数 DCT,H.265 使用 4×4 到 32×32 的整数变换。
  • 量化:用 QP(量化参数)控制每个变换系数的精度。QP 越大,量化越粗,系数被压得越小甚至归零,码率下降但失真增加。这是唯一不可逆的有损环节。
  • 熵编码:对量化后的系数、运动矢量、预测模式等做无损压缩。H.264 支持 CAVLC 与 CABAC,H.265 仅保留 CABAC 并增强上下文建模,压缩效率更高。

四、参数与效果对照

环节 作用 关键参数 对码率/质量的影响
帧内预测 消除空间冗余 预测模式、块大小 模式越丰富,残差越小,码率越低
帧间预测 消除时间冗余 运动矢量精度、参考帧数 搜索越精细,残差越小,但计算量上升
变换 能量集中 变换块尺寸 大块利于平坦区,小块利于细节区
量化 有损压缩核心 QP QP 每增 6,码率约减半,质量下降
熵编码 无损压缩 CABAC/CAVLC CABAC 比 CAVLC 省约 10%~15% 码率

五、案例与场景

以一段 1080p、25fps 的会议视频为例。画面中人物基本静止,背景固定。编码器对背景区域大量使用帧间预测,运动矢量接近零,残差极小;对人物面部细节使用较小变换块和较细量化,保证清晰度;对大面积纯色背景使用大块变换并粗量化,系数大量归零。最终码率可从原始约 1.5Gbps 降到 2~4Mbps。

典型编码参数示例(H.264):
profile      = High
level        = 4.1
QP           = 26
GOP          = 50
参考帧数     = 3
熵编码       = CABAC

六、常见误区与复盘

误区一:压缩就是“丢帧”。 实际上帧间预测保留的是运动信息与残差,帧并没有被简单丢弃,而是被更紧凑地表达。

误区二:QP 越小越好。 QP 过小会导致码率暴涨,带宽和存储无法承受;应根据目标码率和画质要求折中。

误区三:变换和量化是一回事。 变换本身可逆,量化才是有损环节。把两者混为一谈,容易误判画质损失的来源。

复盘时可按“预测是否准确 → 变换块是否匹配内容 → QP 是否合理 → 熵编码是否高效”的顺序排查。多数码率异常,根源在预测与量化,而非熵编码本身。

掌握这三类冗余与四步流程后,再对比 H.264 与 H.265 时就能看清:H.265 的收益主要来自更灵活的块划分、更丰富的帧内预测模式、更精细的运动补偿以及更强的 CABAC 上下文建模,而底层思想仍然是“预测 + 变换 + 量化 + 熵编码”这条主线。