视频压缩原理:三大冗余与三大编码思想

视频之所以能被大幅压缩,根本原因在于它包含大量冗余信息。H.264 的全部设计,本质上都是在回答一个问题:如何用更少的比特,去掉人眼几乎察觉不到或可以接受的信息损失。理解压缩原理,需要先看清视频中藏着哪三类冗余,再掌握对付它们的三种编码工具。

3.1 三类冗余:空间、时间与视觉

冗余意味着“重复”或“不敏感”。视频压缩的第一步,就是识别并利用这些特性。

  • 空间冗余:同一帧图像内,相邻像素之间通常高度相关。例如蓝天背景中,成片像素的蓝色分量几乎相同。如果逐像素存储,会浪费大量比特。
  • 时间冗余:视频相邻帧之间,场景内容往往只有微小变化。比如静止的演讲者,只有嘴唇和手势在动,背景几乎不变。逐帧独立存储,等于重复记录了大量相同信息。
  • 视觉冗余:人眼对亮度比对颜色更敏感,对低频信息比对高频细节更敏感,对平滑区域中的微小误差比对边缘附近的误差更不敏感。利用这些生理特性,可以丢弃或粗略化人眼不易察觉的信息。

核心结论:压缩率的上限,取决于这三类冗余被消除的程度。H.264 的目标不是“无损还原”,而是在人眼可接受的质量下,最大化消除冗余。

3.2 三大编码思想:预测、变换、熵编码

针对上述冗余,H.264 采用了三种基本编码工具,它们各自解决一类问题,并串联成完整的编码流程。

3.2.1 预测编码:消除空间与时间冗余

预测编码的核心思想是:不直接编码原始像素,而是编码“预测值与实际值之间的差值”。差值越小,需要编码的比特就越少。

  • 帧内预测(消除空间冗余):利用当前帧已编码的相邻像素,预测当前块。H.264 支持多种预测方向(如垂直、水平、DC、对角线等),对平坦区域效果极佳。
  • 帧间预测(消除时间冗余):在已编码的参考帧中寻找最匹配的块,计算运动矢量,只编码运动矢量和残差。H.264 支持多种块划分(16×16 到 4×4),并采用多参考帧提升匹配精度。

预测后的输出是残差块——通常数值很小,甚至接近零,这为后续变换编码创造了有利条件。

3.2.2 变换编码:消除视觉冗余

残差块中仍然存在空间相关性。变换编码将像素域的残差转换到频率域,使能量集中到少数低频系数上,高频系数趋近于零。H.264 使用 4×4 或 8×8 整数 DCT 变换(离散余弦变换),相比浮点 DCT,它避免了舍入误差,且计算更快。

变换后,通过量化(QP 控制)将小系数置零,这是有损压缩的主要环节。量化步长越大,置零系数越多,压缩率越高,但细节损失也越大。

3.2.3 熵编码:消除统计冗余

经过预测、变换、量化后,数据变成了“少量大数值 + 大量零”的序列。熵编码利用符号出现的概率分布,为高频符号分配短码字,为低频符号分配长码字,从而进一步压缩。H.264 支持两种熵编码方式:

  • CAVLC(基于上下文的自适应可变长编码):实现简单,适合低延迟或硬件实现。
  • CABAC(基于上下文的自适应二进制算术编码):压缩率比 CAVLC 高约 10%~15%,但计算复杂度更高。

3.3 编码器整体流程:从原始帧到码流

将上述工具串联起来,就构成了 H.264 编码器的主流程。下图展示了从输入原始帧到输出 H.264 码流的完整路径,以及重建帧如何参与后续帧的预测。

H.264 编码器主流程(预测 + 变换 + 熵编码) 原始帧 Fn 当前输入帧 帧内预测 消除空间冗余 帧间预测 消除时间冗余 选择 残差 Dn 原始 - 预测 变换 + 量化 DCT → 置零小系数 熵编码 CAVLC /CABAC H.264 码流 反变换 + 反量化 重建残差 重建帧 F'n 用于后续参考 参考帧 已编码重建帧 运动矢量 MV 图例说明 原始帧输入 预测模块(帧内/帧间) 残差计算 变换 + 量化(有损核心) 熵编码(无损压缩) 重建帧(反馈回路) 参考帧存储 正向数据流 重建回路 运动估计参考

图中可以看到一个关键设计:编码器内部必须重建出与解码端一致的参考帧。因为帧间预测时,编码器使用的参考帧必须和解码器已经解码出的帧完全相同,否则会产生漂移误差。因此,量化后的系数会经过反量化、反变换,与预测值相加得到重建帧,存入参考帧列表供后续帧使用。

3.4 案例:一段“静止背景 + 移动人脸”的视频

假设有一段 10 秒、30fps、720p 的视频,画面中人物头部缓慢转动,背景完全静止。如果不压缩,每帧约 1280×720×1.5 字节 ≈ 1.3 MB,10 秒共约 390 MB。

采用 H.264 编码后:

  1. 帧间预测:背景块在参考帧中能精确匹配,运动矢量接近零,残差几乎为零,只需极少比特表示“跳过”或“直接复制”。
  2. 帧内预测:人脸区域因旋转产生新像素,帧内预测利用相邻像素方向性,残差能量显著降低。
  3. 变换量化:残差经 DCT 后,能量集中在左上角低频系数,量化后大量高频系数变为零。
  4. 熵编码:零系数游程和概率分布被高效编码,CABAC 进一步压缩。

最终码率可能仅为 1~2 Mbps,10 秒约 1.25~2.5 MB,压缩比达到 150~300 倍。人眼几乎看不出明显差异,这正是三大冗余被有效消除的结果。

3.5 常见误区与复盘

误区一:认为“压缩就是降低分辨率或帧率”。分辨率降低是采样率变化,与编码压缩是两回事。H.264 在保持原始分辨率的前提下,通过消除冗余实现压缩。

误区二:混淆“量化”与“变换”。变换本身不损失信息(整数 DCT 有微小舍入),真正有损的是量化。变换只是让能量更集中,便于量化更有效地置零不重要的系数。

误区三:认为“帧内编码帧(I帧)不需要预测”。I帧不做帧间预测,但必须做帧内预测。帧内预测同样能大幅消除空间冗余,只是不依赖其他帧。

复盘要点:预测编码决定了“能压多狠”(残差越小越好),变换量化决定了“丢多少细节”(QP 控制),熵编码决定了“剩下的怎么存最省”。三者环环相扣,任何一环效率低,都会拖累整体压缩率。

3.6 编码参数与压缩效果对照

参数 作用对象 调高时效果 调低时效果
QP(量化参数) 变换系数 压缩率↑,画质↓,码率↓ 压缩率↓,画质↑,码率↑
参考帧数量 帧间预测 匹配更准,压缩率↑,延迟↑ 匹配受限,压缩率↓,延迟↓
运动搜索范围 帧间预测 大运动场景更准,耗时↑ 小运动场景足够,耗时↓
熵编码方式 熵编码 CABAC 压缩率更高,复杂度↑ CAVLC 压缩率略低,复杂度↓
GOP 长度 帧结构 I帧间隔大,码率↓,随机访问性↓ I帧频繁,码率↑,随机访问性↑

理解这些参数背后的原理,就能在实际编码时根据场景需求(如直播低延迟、存储高压缩、监控长时间录制)做出合理取舍。三大冗余和三大编码思想,是后续学习 H.264 码流结构、帧类型、率控算法等所有内容的基础。