4. 编码原理总览
一段 1080p、30fps、8bit 的原始视频,每秒数据量约为 1920×1080×3×30 ≈ 186 MB,一分钟就超过 11 GB。如果不做压缩,无论是网络传输、磁盘存储还是内存解码,都无法承受。视频编码的本质,就是在“尽量不被人眼察觉”的前提下,把视频数据量降低两到三个数量级。要做到这一点,编码器必须系统性地消除视频中存在的多种冗余。
一、视频中的四类冗余
原始视频之所以“可压缩”,是因为它包含大量重复和可预测的信息。这些重复信息被称为冗余,主要分为四类:
- 空间冗余:同一帧画面内相邻像素高度相似。例如一面白墙、一片天空,相邻像素值几乎相同,直接逐像素存储是浪费。
- 时间冗余:相邻帧之间内容变化很小。30fps 下,前后两帧往往只有少量物体移动,大部分背景完全一致。
- 视觉冗余:人眼对亮度敏感、对色度不敏感,对低频细节敏感、对高频细节不敏感,对静止区域敏感、对快速运动区域不敏感。超出人眼感知能力的信息可以被丢弃。
- 统计冗余:像素值或变换系数的出现概率并不均匀,某些符号出现频率远高于其他符号,可以用变长编码进一步压缩。
二、有损压缩与无损压缩
无损压缩只去除统计冗余,解码后可以完全恢复原始像素,典型代表是 Huffman 编码、算术编码、游程编码。无损压缩的压缩比通常只有 2:1 到 3:1,远不能满足视频需求。
有损压缩则允许解码结果与原始像素存在差异,只要差异在人眼可接受范围内即可。H.264/H.265 属于有损压缩,其压缩比可达 100:1 甚至更高。有损压缩的关键在于“量化”:把变换后的小系数直接置零或粗化,从而大幅减少需要编码的数据。量化越粗,压缩比越高,但画质损失越大。
| 压缩类型 | 是否可完全恢复 | 典型压缩比 | 主要手段 | 在 H.264/H.265 中的位置 |
|---|---|---|---|---|
| 无损压缩 | 可以 | 2:1 ~ 3:1 | 熵编码、游程编码 | CABAC/CAVLC 熵编码阶段 |
| 有损压缩 | 不可以 | 50:1 ~ 200:1 | 量化、预测、变换 | 预测、变换、量化阶段 |
三、混合编码框架的基本组成
H.264 和 H.265 都采用“混合编码框架”,即把预测编码、变换编码和熵编码组合在一起。其基本流程可以概括为:输入帧先被划分为宏块或编码树单元,然后依次经过预测、变换、量化、熵编码,最终形成码流。解码则是逆过程。
下面这张图展示了混合编码框架的核心数据流与模块关系:
四、案例:一帧画面如何被压缩
假设有一帧 1920×1080 的会议画面,背景是静止的白墙,人物头部有轻微移动。编码器大致会这样处理:
- 把画面划分为若干 CTU,每个 CTU 再递归划分为更小的 CU。
- 对背景区域,帧间预测发现与前一帧几乎相同,运动矢量接近 (0,0),残差接近零。
- 对人物头部区域,帧间预测找到匹配块,记录运动矢量,残差只包含头部边缘的少量变化。
- 对残差做 DCT 变换,能量集中在左上角低频系数。
- 量化时,大量高频系数被置零,只保留少数非零系数。
- 熵编码对非零系数、运动矢量、预测模式进行算术编码,最终码流可能只有原始数据的 1/100。
五、常见误区与复盘
- 误区一:压缩比越高越好。压缩比过高意味着量化过粗,会出现块效应、模糊、振铃等失真。实际编码需要在码率和质量之间做权衡。
- 误区二:无损压缩可以解决视频存储问题。无损压缩比通常只有 2:1 到 3:1,对原始视频来说杯水车薪,必须依赖有损压缩。
- 误区三:帧间预测只记录“移动了多少”。帧间预测还包括参考帧选择、亚像素插值、加权预测等复杂机制,运动矢量只是其中一部分。
- 误区四:量化只是简单除法。量化步长由 QP 控制,QP 与码率、画质呈非线性关系,是编码器最核心的调节旋钮之一。
总结来看,视频编码之所以必要,是因为原始视频数据量远超传输和存储能力;而视频之所以能被大幅压缩,是因为它同时存在空间、时间、视觉和统计四类冗余。H.264/H.265 的混合编码框架,正是围绕这四类冗余设计的系统性解决方案:预测去空间和时间冗余,变换与量化去视觉冗余,熵编码去统计冗余。理解这条主线,后续学习帧内预测、帧间预测、变换量化、熵编码和环路滤波时,就能清楚每个模块在整个框架中的位置和作用。