引言:帧间预测是压缩效率的"主力引擎"
视频序列中相邻帧之间存在大量时间冗余,帧间预测通过运动估计与运动补偿,用参考帧预测当前帧,仅编码残差信息,是视频压缩中增益最大的模块。
H.266/VVC在HEVC的基础上,对帧间预测进行了多项革新:引入仿射运动补偿 处理旋转、缩放等复杂运动,引入双向光流(BDOF) 细化双向预测,增强几何划分模式(GPM) ,使帧间预测环节较HEVC提升约4-6% BD-rate增益。
但仿射运动补偿的计算复杂度远高于传统平移模型,BDOF的逐像素光流计算也带来显著开销。如何在预测精度与编码速度之间取得平衡,是工程落地的核心挑战。
本文从算法原理到工程实践,系统梳理VVC帧间预测的关键技术,并给出可复用的优化策略与配置模板。
仿射运动补偿
核心思想
HEVC的运动补偿仅支持平移模型------一个CU内所有像素使用相同的运动矢量。但实际视频中常出现旋转、缩放、剪切等复杂运动(如摄像机转动、物体旋转),平移模型无法准确描述。
VVC引入仿射运动补偿,用仿射变换模型描述CU内的运动场:
vx = a × x + b × y + c
vy = d × x + e × y + f
其中 (x, y) 为像素坐标,(vx, vy) 为该像素的运动矢量,a~f 为仿射参数。
4参数与6参数模型
VVC支持两种仿射模型:
| 模型 | 参数数量 | 自由度 | 适用场景 |
|---|---|---|---|
| 4参数 | 4 | 平移+旋转+缩放 | 简单旋转/缩放 |
| 6参数 | 6 | 平移+旋转+缩放+剪切 | 复杂运动 |
4参数模型(简化仿射):
vx = a × x - b × y + c
vy = b × x + a × y + d
仅需2个控制点的运动矢量即可推导全部参数。
6参数模型(完整仿射):
vx = a × x + b × y + c
vy = d × x + e × y + f
需要3个控制点的运动矢量。
控制点运动矢量
仿射CU的运动矢量由**控制点运动矢量(CPMV)**推导:
- 4参数模型:使用左上角(CP0)和右上角(CP1)两个控制点
- 6参数模型:使用左上角(CP0)、右上角(CP1)、左下角(CP2)三个控制点
CPMV推导流程:
- 对每个控制点进行运动估计,得到CPMV
- 根据CPMV计算仿射参数
a~f - 对CU内每个4×4子块,根据像素坐标计算子块运动矢量
子块划分
仿射CU被划分为4×4子块,每个子块使用独立的运动矢量进行运动补偿:
子块MV(x, y) = 仿射变换(子块中心坐标)
子块大小:VVC固定使用4×4子块,HEVC中AMVP的子块大小可变。
运动矢量精度 :仿射子块MV使用1/16像素精度(高于传统MV的1/4像素精度),需要更精细的插值滤波。
仿射合并模式
VVC引入仿射合并模式,从相邻块继承仿射运动信息:
- 仿射Merge:从空间/时间相邻块继承CPMV
- 仿射AMVP:构建CPMV候选列表,编码器选择最优
候选列表构建:
- 检查空间相邻块(左、上、右上、左下、左上)
- 检查时间相邻块(同位置Col块)
- 构造CPMV组合候选
- 最多保留N个候选(VVC中通常为5-6个)
压缩增益与复杂度
- 压缩增益:仿射运动补偿可使整体码率降低约2-3%,对旋转/缩放场景增益更大(5-8%)
- 复杂度:仿射模式需要多控制点运动估计和逐子块运动补偿,占编码总耗时约10-15%
工程实践:VVenC默认启用仿射模式,对低复杂度场景可以关闭。
双向光流
核心思想
双向预测(Bi-prediction)使用两个参考帧(前向和后向)的平均值作为预测值。但简单平均假设物体在两个参考帧之间做匀速直线运动,实际运动中可能存在加速度或非刚性形变。
**双向光流(Bidirectional Optical Flow, BDOF)**通过逐像素光流计算,细化双向预测值,使预测更贴合真实运动。
算法流程
BDOF的处理流程:
1. 初始双向预测
对当前CU,使用传统双向预测得到两个参考块 pred0 和 pred1。
2. 光流计算
对每个4×4子块,计算光流位移 (vx, vy):
vx = - (∂I/∂x) × Δt / (∂I/∂t)
vy = - (∂I/∂y) × Δt / (∂I/∂t)
其中 ∂I/∂x、∂I/∂y 为空间梯度,∂I/∂t 为时间梯度,Δt 为时间间隔。
3. 预测细化
根据光流位移,对 pred0 和 pred1 进行亚像素偏移,得到细化后的预测值:
pred_bdoF = (pred0(x+vx, y+vy) + pred1(x-vx, y-vy)) / 2
4. 平滑约束
对光流位移施加平滑约束,避免噪声干扰。
启用条件
BDOF并非对所有CU启用,需满足以下条件:
- CU使用双向预测
- 两个参考帧分别在当前帧的前后
- CU尺寸不小于8×8
- 未使用加权预测
- 编码器RDO决策认为BDOF增益大于开销
压缩增益与复杂度
- 压缩增益:BDOF可使整体码率降低约0.5-1%,对复杂运动场景增益更大
- 复杂度:BDOF需要逐子块计算梯度与光流,占编码总耗时约3-5%
工程实践:VVenC默认启用BDOF,对实时编码场景可以关闭。
其他帧间预测增强
几何划分模式
VVC增强了几何划分模式(GPM),支持将CU按任意角度划分为两个三角形区域,每个区域独立进行运动补偿。
增益:GPM对物体边界处的运动不连续场景增益明显,整体码率降低约0.5-1%。
改进的TMVP
VVC改进了时域运动矢量预测(TMVP),使用更灵活的时间候选位置,提高运动矢量预测精度。
运动矢量分辨率自适应
VVC支持自适应运动矢量分辨率(AMVR),根据CU特性选择MV精度:
- 1/4像素:默认精度
- 1像素:对大运动场景减少信令开销
- 整数像素:对屏幕内容等场景
实战配置模板
高质量编码场景
bash
# VVenC参数
--preset slower
--affine 1 # 启用仿射运动补偿
--bdof 1 # 启用双向光流
--gpm 1 # 启用几何划分模式
--amvr 1 # 启用自适应MV分辨率
--max-affine-merge 5 # 仿射合并候选数
实时编码场景
bash
--preset fast
--affine 0 # 关闭仿射(节省计算)
--bdof 0 # 关闭BDOF
--gpm 1 # 保留GPM(增益/开销比高)
--amvr 1 # 启用AMVR
屏幕内容编码场景
bash
--preset slower
--affine 0 # 屏幕内容中仿射增益有限
--bdoF 0 # 关闭BDOF
--gpm 1 # 启用GPM
--amvr 2 # 使用整数MV精度
--screen-content 1 # 启用屏幕内容优化
低复杂度场景
bash
--preset faster
--affine 0 # 关闭仿射
--bdoF 0 # 关闭BDOF
--gpm 0 # 关闭GPM
--amvr 0 # 使用默认MV精度
帧间预测的工程优化
仿射模式快速决策
VVenC使用多级快速决策策略:
- 预筛选:对平坦区域跳过仿射模式
- 早期终止:当传统Merge模式RD代价足够小时,跳过仿射搜索
- 候选裁剪:限制仿射合并候选数量
- 子块MV缓存:缓存已计算的子块MV,避免重复计算
加速效果:该策略可将仿射编码耗时降低约50-60%,压缩损失小于0.2%。
BDOF快速算法
VVenC对BDOF使用以下优化:
- CU尺寸阈值:仅对大于16×16的CU启用BDOF
- 梯度预筛选:对梯度较小的区域跳过BDOF
- SIMD加速:使用AVX2指令加速梯度计算与光流求解
加速效果:BDOF耗时降低约40%,压缩损失可忽略。
运动估计加速
VVenC使用以下策略加速运动估计:
- 分层搜索:从粗到细的多层搜索策略
- TZ搜索:三元组搜索算法,快速收敛
- MV预测:利用相邻块MV作为搜索起点
- 参考帧选择:根据QP自适应选择参考帧数量
结语:帧间预测是压缩效率的主力引擎
VVC的帧间预测已经从HEVC的平移模型,演进为仿射运动补偿+BDOF+GPM的多元体系。仿射模型能准确描述旋转、缩放等复杂运动,BDOF能细化双向预测,GPM能灵活划分物体边界。
但仿射和BDOF的计算复杂度显著增加,工程取舍变得尤为重要。建议在高质量编码场景中启用所有帧间预测工具,在实时编码场景中优先保留GPM和AMVR,关闭仿射和BDOF。
帧间预测是压缩效率的主力引擎,也是提升压缩比最直接的手段。愿每一位视频编码工程师,都能在仿射、BDOF与GPM之间找到预测精度与编码速度的最佳平衡点。