熵编码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 一类算法不是简单查表编码,而是根据上下文动态估计当前符号的概率,再用接近算术编码的方式把符号压成比特流。解码端必须以同样顺序更新概率状态,所以这一步有较强串行依赖。

工程用途

  • 在有损压缩已经完成量化后,进一步去除统计冗余。
  • 在无损压缩中直接压缩符号序列。
  • 让视频码流在保存同样语法信息的前提下降低码率。
  • 在压缩格式设计中平衡压缩率、解码复杂度和硬件实现难度。

边界与常见坑

  • 熵编码本身是无损的:画质损失通常主要来自量化、降采样和编码器取舍,不是熵编码直接丢信息。
  • 压缩率受概率模型影响:模型越贴近真实分布,平均码长越接近熵下界。
  • 不是所有数据都能继续压缩:已经接近随机的数据熵高,继续熵编码收益很小。
  • 复杂熵编码会增加解码成本:上下文自适应和串行状态更新会限制并行度,影响软解码性能。
  • 编码短不等于语义重要:符号短只是因为统计上常见,不代表业务上更重要。

相关术语