引言:变换量化是压缩效率的"第二引擎"
如果说预测消除的是像素间的相关性,那么变换与量化消除的就是残差信号的统计冗余。H.266/VVC在HEVC的基础上引入了MTS(Multiple Transform Selection)、LFNST(Low-Frequency Non-Separable Transform)、依赖量化(Dependent Quantization)等一系列新工具,使变换量化阶段的编码效率较HEVC提升约8-12%。
然而,这些工具也带来了显著的计算复杂度增长。MTS使变换核候选数从1种扩展至最多6种,LFNST引入了不可分矩阵乘法,依赖量化使量化状态空间翻倍。若不加优化地全量启用,编码耗时将增加2-3倍,对于实时编码器而言完全不可接受。
本文从算法原理到工程落地,系统梳理VVC变换与量化的关键技术,并给出可复用的优化策略与配置模板。
MTS多核变换:从单一DCT到自适应核选择
核心思想
HEVC仅使用DCT-II一种变换核(帧内亮度4×4块额外使用DST-VII)。VVC引入MTS,允许编码器在DCT-II、DCT-VIII、DST-VII之间自适应选择最优变换核。
MTS的直觉:不同残差分布适合不同的变换基函数。例如,残差能量集中在左上角时DCT-II最优;能量偏向一侧时DCT-VIII或DST-VII可能更优。
变换核候选集
VVC根据CU的预测类型与尺寸,定义不同的MTS候选集:
| 场景 | 候选核组合 | 索引数 |
|---|---|---|
| 帧内亮度 | DCT-II / DST-VII / DCT-VIII | 最多5种 |
| 帧间亮度(≤32×32) | DCT-II / DST-VII / DCT-VIII | 最多4种 |
| 帧间亮度(>32×32) | 仅DCT-II | 1种 |
| 色度 | 继承亮度或仅DCT-II | 1-2种 |
MTS索引通过熵编码传输,开销约1-2bit/CU。
工程优化策略
全搜索所有MTS候选的RDO代价过高,x266采用以下剪枝策略:
- SATD预筛选:对每种变换核计算SATD代价,仅保留Top-2进入完整RDO
- 尺寸约束:>32×32的CU跳过MTS,仅用DCT-II
- 帧间快速跳过:当帧间CU的merge模式且残差能量极低时,直接跳过MTS搜索
- 早期终止:若DCT-II的RD代价已远低于阈值,跳过其他核测试
实测表明,上述策略使MTS搜索耗时降低约70%,BD-rate损失<0.1%。
LFNST低频不可分变换:矩阵乘法的压缩增益
为什么需要不可分变换?
传统DCT/DST是可分变换,即二维变换可分解为两次一维变换(先行后列)。这假设水平和垂直方向的残差统计特性相互独立。但实际上,许多残差块存在斜向纹理或对角相关性,可分变换无法充分去相关。
LFNST通过不可分矩阵乘法,在低频区域(通常是左上4×4或8×8系数)进行二次变换,进一步压缩能量。
LFNST的工作流程
- 对残差块进行主变换(DCT-II/DST-VII/DCT-VIII)
- 提取左上低频系数(4×4或8×8)
- 根据帧内模式查表选择LFNST矩阵(共35种矩阵可选)
- 对低频系数进行矩阵乘法二次变换
- 高频系数置零(即不传输)
关键约束:LFNST仅当CU尺寸≥4×4且非色度时才启用;与MTS互斥(启用LFNST时MTS索引固定);量化后非零系数数超过阈值时自动禁用。
工程取舍
LFNST在VTM中贡献约0.8-1.2% BD-rate增益,但带来以下代价:
- 矩阵乘法计算量大(尤其是8×8矩阵)
- 解码端需同步实现逆LFNST
- 与硬件加速不友好(矩阵乘法难以流水线化)
推荐策略:
- 实时编码器:仅对帧内亮度4×4/8×8小块启用LFNST,其他场景跳过
- 离线编码器:全场景启用,但限制矩阵类型为Top-8(而非全35种)
- 硬件编码器:考虑用查找表近似替代矩阵乘法
依赖量化:用状态机换取量化精度
从标量量化到依赖量化
HEVC使用标量均匀量化,每个系数独立量化。VVC引入依赖量化,将量化过程建模为一个2状态或4状态有限状态机,当前系数的量化步长依赖于之前已量化系数的奇偶性。
直觉:自然图像的变换系数存在局部相关性,相邻系数的奇偶性并非独立。依赖量化利用这一统计特性,在不增加比特的前提下降低量化失真。
实现机制
依赖量化的核心是一个状态转移表:
状态0: 偶数系数 → 状态0, 奇数系数 → 状态1 状态1: 偶数系数 → 状态2, 奇数系数 → 状态3 状态2: 偶数系数 → 状态0, 奇数系数 → 状态1 状态3: 偶数系数 → 状态2, 奇数系数 → 状态3每个状态对应不同的量化偏移,编码器通过动态规划(Viterbi算法)选择最优量化路径。
工程挑战
依赖量化使量化复杂度增加约40%,主要瓶颈在于Viterbi路径搜索。x266的优化策略:
- 仅对亮度分量启用依赖量化
- 限制搜索深度(回溯长度≤8个系数)
- 使用定点算术替代浮点运算
- 对高频区域跳过依赖量化(高频系数近似独立)
依赖量化在VTM中贡献约0.4-0.6% BD-rate增益,在x266实时配置下增益约0.2-0.3%,建议在中高码率场景中启用,极低码率场景可关闭以避免过量化。
残差编码:Cabac与上下文建模
残差语法元素
VVC残差编码的语法元素包括:
| 语法元素 | 含义 | 编码方式 |
|---|---|---|
| CBF | 编码块标志,指示是否有非零系数 | CABAC |
| Last Position | 最后一个非零系数的位置 | CABAC |
| Coeff Level | 系数绝对值 | 前缀CABAC + 后缀Exp-Golomb |
| Coeff Sign | 系数符号 | Bypass编码 |
上下文模型优化
VTC(Video Coding Team)对残系数的上下文模型进行了精细设计:
- CBF上下文:根据相邻块的CBF状态选择不同上下文模型
- 系数Level上下文:根据已编码系数的Level总和(localSumAbs)自适应选择上下文
- 位置依赖:扫描顺序上靠前的系数使用更精细的上下文,靠后的系数使用简化模型
工程提示:上下文模型的更新频率直接影响编码效率与并行度。x266采用"延迟更新"策略,每4个系数批量更新一次上下文,在效率损失<0.05%的前提下提升吞吐量约20%。
VTM与x266变换量化对比
| 特性 | VTM(参考软件) | x266(实时编码器) |
|---|---|---|
| MTS搜索 | 全候选 | SATD预筛选Top-2 |
| LFNST | 全35种矩阵 | 仅Top-8 + 小块启用 |
| 依赖量化 | 全场景启用 | 仅亮度 + 中高频跳过 |
| 量化步长 | 浮点精确 | 定点近似 |
| 残差上下文 | 全更新 | 延迟批量更新 |
| 4K@60fps | 不可行 | 可达(需SIMD加速) |
实战配置模板
低延迟直播场景
# x266 RC+变换量化相关参数 --mts 1 # 启用MTS(简化搜索) --lfnst 1 # 仅小块启用LFNST --dep-quant 0 # 关闭依赖量化(降低延迟) --tskip 1 # 启用变换跳过(对屏幕内容有效) --quant-b-adapt 1 # 自适应量化步长高质量点播场景
--mts 3 # 全MTS搜索 --lfnst 2 # 全场景LFNST --dep-quant 1 # 启用依赖量化 --tskip 1 # 启用变换跳过 --aq-mode 2 # 方差自适应量化 --vbv-maxrate 0 # 无码率上限,追求质量AI训练数据集场景
--mts 2 # 中等MTS搜索 --lfnst 0 # 关闭LFNST(避免过度平滑) --dep-quant 1 # 启用依赖量化 --crf 18 # 恒定质量模式 --no-aq # 关闭感知量化(保留原始统计特性)结语:变换量化是精度与速度的永恒博弈
VVC的变换与量化工具箱已经相当丰富,但没有任何一种配置能通吃所有场景。MTS对自然视频增益显著,对屏幕内容收益有限;LFNST在小块上表现优异,在大块上性价比低;依赖量化在中高码率下有效,极低码率下可能适得其反。
建议建立"变换量化增益画像",针对不同内容类型、不同码率区间、不同延迟约束,配置差异化的工具启用策略。让编码器理解残差的统计特性,而非盲目全开。
变换与量化是编码流水线的最后一道关卡,它的效率直接决定了最终码流的压缩质量。愿每一位视频编码工程师,都能在系数与步长之间找到属于自己的最优平衡点。