引言:编码链路的最后一环
在前几篇文章中,我们依次解析了H.265的CTU划分、帧内/帧间预测、变换量化以及环路滤波模块。经过这些处理后,视频数据已被转化为一系列语法元素(Syntax Elements)------如预测模式索引、运动矢量差值、量化系数、SAO参数等。
然而,这些语法元素仍然是"符号",需要进一步压缩为紧凑的二进制比特流,才能存储和传输。这一最终压缩步骤就是熵编码(Entropy Coding)。
H.265主要采用**CABAC(Context-Adaptive Binary Arithmetic Coding,基于上下文的自适应二进制算术编码)**作为熵编码方案,在极少数低复杂度场景下也支持CAVLC(基于上下文的自适应变长编码)。本文将重点解析CABAC的工作原理与核心优势。
CABAC的三大核心步骤
CABAC的编码流程可分为三个关键阶段:二进制化(Binarization) 、上下文建模(Context Modeling) 和算术编码(Arithmetic Coding)。
第一步:二进制化
CABAC只能处理二进制数据(0和1),因此所有非二进制的语法元素必须先转换为二进制串。H.265支持多种二进制化方法,根据语法元素的统计特性选择最优方案:
- 一元码(Unary Code) :适用于小数值分布集中的场景。例如数值3编码为
1110(三个1后跟一个0)。 - 截断一元码(Truncated Unary Code):在一元码基础上设置最大值上限,超出部分用固定长度码表示。
- 指数哥伦布码(Exp-Golomb Code):适用于数值分布范围广但小值概率高的场景,如运动矢量差值。
- 定长码(Fixed-Length Code):当所有取值概率相近时使用,如某些索引值。
二进制化的目标是将原始语法元素转化为尽可能短的二进制串,同时保持前缀性质(无前缀码),确保解码无歧义。
第二步:上下文建模
这是CABAC"自适应"能力的核心。不同语法元素、甚至同一语法元素的不同比特位,其0和1的出现概率往往差异很大。上下文建模通过维护多个概率模型(Context Model),为每个二进制位选择最合适的概率估计。
上下文选择策略
- 基于语法元素类型:不同语法元素使用不同的上下文集合。
- 基于相邻块信息:例如编码当前块的预测模式时,参考左侧和上方相邻块的预测模式,选择对应的上下文。
- 基于比特位位置:同一语法元素的二进制串中,不同位置的比特位具有不同的统计特性,使用不同的上下文。
概率自适应更新
每个上下文模型维护两个状态变量,分别估计0和1的出现概率。编码过程中,模型会根据实际编码结果动态更新概率估计------如果某上下文中1出现频繁,则提高1的概率估计值。这种自适应机制使CABAC能够紧跟画面内容的统计变化,始终保持较高的编码效率。
第三步:算术编码
算术编码是一种区间划分编码方法。其基本思想是:将整个[0, 1)区间按照符号的概率分布逐步细分,最终得到一个代表整个符号序列的小数区间,该区间内的任意一个数都可以作为编码输出。
CABAC的具体流程如下:
- 初始化区间:设定初始区间为[0, 1)。
- 逐位细分:对于二进制串中的每一位,根据上下文模型给出的概率,将当前区间划分为0子区间和1子区间。
- 选择子区间:根据实际比特值(0或1),选择对应的子区间作为新的当前区间。
- 输出比特:当区间缩小到一定程度,输出已确定的高位比特,并对区间进行重归一化。
- 结束编码:处理完所有比特位后,输出最终区间内的一个代表值。
算术编码的优势在于:它能够以接近信息熵的极限效率进行编码,理论上可以达到最优压缩比。
CABAC vs CAVLC
H.265主要使用CABAC,但也保留了CAVLC作为低复杂度替代方案。两者的核心区别如下:
表格
| 特性 | CABAC | CAVLC |
|---|---|---|
| 压缩效率 | 高(约节省10%~15%码率) | 较低 |
| 计算复杂度 | 高 | 低 |
| 并行性 | 较差(串行依赖强) | 较好 |
| 适用场景 | 主流编码场景 | 低延迟、低功耗场景 |
CAVLC使用预定义的变长码表,无需概率建模和自适应更新,实现简单但压缩效率有限。CABAC虽然计算复杂,但其自适应能力带来的码率节省使其成为H.265的主流选择。
H.265对CABAC的优化
相比H.264,H.265在CABAC层面做了以下改进:
- 更多的上下文模型:针对新增的语法元素(如Merge索引、SAO参数等)设计了专用的上下文集合。
- 简化的概率更新:采用更高效的概率状态更新机制,减少计算开销。
- 并行编码支持:引入了熵切片(Entropy Slice)机制,允许在一定程度上并行处理CABAC编码,缓解串行瓶颈。
实际收益与性能对比
- 码率节省:相比CAVLC,CABAC可带来约10%~15%的码率节省,是H.265高压缩效率的重要贡献者。
- 解码复杂度:CABAC解码端的计算量相对可控,主要复杂度集中在编码器端。
- 并行化挑战:CABAC的强串行依赖限制了并行加速,H.265通过熵切片等机制部分缓解了这一问题。
结语
CABAC是H.265编码链路中的最后一环,也是将各类语法元素高效压缩为紧凑比特流的关键技术。通过二进制化、上下文建模和自适应算术编码三个步骤,CABAC能够紧跟内容统计特性,以接近信息熵极限的效率完成压缩,为H.265的整体压缩效率做出了重要贡献。
至此,我们已经完成了H.265核心编码模块的系列解析------从CTU结构、帧内/帧间预测、变换量化、环路滤波到熵编码。在下一篇文章中,我们将进行阶段性总结,梳理H.265各模块之间的协同关系,并展望H.266/VVC的演进方向。