熵编码(Entropy Coding)是一类无损压缩方法,它根据符号出现概率分配比特表示:常见符号用更短编码,少见符号用更长编码,从而减少平均码长。
在视频编解码器中,熵编码通常位于预测、变换和量化之后,用来压缩运动向量、块类型、量化后的系数和其他语法元素。H.264(AVC) 和 H.265(HEVC) 都使用上下文自适应的熵编码工具。
核心问题
如果所有符号都用固定长度表示,会浪费常见模式的统计规律。例如一段量化后的残差系数里大量是 0,少数是较大数值。如果给每个符号同样长度,就没有利用“0 特别常见”这个事实。
核心机制
信息论里,一个概率为 p(x) 的符号 x 的信息量可以写成:
I(x) = -log2(p(x))x是某个符号,例如一个量化系数、一个运动向量差值或一个语法标志。p(x)是该符号出现的概率。log2表示以 2 为底的对数,结果单位是 bit。- 概率越高,
-log2(p(x))越小,意味着理论上可以用更少 bit 表示。
一个随机变量 X 的平均信息量是熵:
H(X) = -sum p(x) * log2(p(x))sum对所有可能符号x求和。H(X)给出理想无损编码的平均码长下界。- 实际编码器还要考虑有限精度、上下文模型、码流语法和解码速度。
视频标准中的 CABAC 一类算法不是简单查表编码,而是根据上下文动态估计当前符号的概率,再用接近算术编码的方式把符号压成比特流。解码端必须以同样顺序更新概率状态,所以这一步有较强串行依赖。
工程用途
- 在有损压缩已经完成量化后,进一步去除统计冗余。
- 在无损压缩中直接压缩符号序列。
- 让视频码流在保存同样语法信息的前提下降低码率。
- 在压缩格式设计中平衡压缩率、解码复杂度和硬件实现难度。
边界与常见坑
- 熵编码本身是无损的:画质损失通常主要来自量化、降采样和编码器取舍,不是熵编码直接丢信息。
- 压缩率受概率模型影响:模型越贴近真实分布,平均码长越接近熵下界。
- 不是所有数据都能继续压缩:已经接近随机的数据熵高,继续熵编码收益很小。
- 复杂熵编码会增加解码成本:上下文自适应和串行状态更新会限制并行度,影响软解码性能。
- 编码短不等于语义重要:符号短只是因为统计上常见,不代表业务上更重要。