引言:帧间预测是P/B帧压缩的"引擎"
如果说帧内预测是I帧的灵魂,那么帧间预测就是P/B帧的引擎。视频序列中相邻帧之间存在极强的时间相关性,帧间预测通过运动估计找到参考帧中最佳匹配块,仅编码残差和运动信息,可将P/B帧的码率降低80-90%。
H.266/VVC在HEVC的帧间预测基础上,引入了更精细的运动信息推导机制(AMVP/Merge)、更丰富的Merge候选(MMVD/CIIP/TPM)、更精准的子块级运动补偿(GPM/PROF)、以及更智能的运动矢量细化(DMVR),使帧间编码效率较HEVC提升约10-20%。
但工具越多,运动搜索和模式决策的计算量也越大。VVC中帧间编码耗时约占总编码时间的40-50%,其中运动估计和Merge候选构建占据了绝大部分。如何在保持压缩效率的同时降低帧间决策复杂度,是工程编码器的核心挑战。
本文从算法原理到工程落地,系统梳理VVC帧间预测的关键技术,并给出可复用的优化策略与配置模板。
AMVP与Merge:运动信息推导的双轨制
核心思想
VVC中每个PU的运动信息通过两种方式之一获得:
- AMVP:编码器通过运动估计找到最优MV,将MVP索引和MVD编码到码流中,解码端用MVP+MVD重建MV
- Merge:编码器从候选列表中选择一个已有的运动信息(MV+参考帧索引+预测方向),仅编码Merge索引,不传MVD
关键区别:AMVP需要编码MVD(有码率开销),但MV更精确;Merge不编码MVD(零码率),但MV受限于候选列表。编码器通过RDO在两者之间选择最优方案。
Merge候选列表构建
VVC的Merge候选列表最多包含6个候选,按以下顺序构建:
- 空间候选:从当前PU的5个空间相邻块(A1、B1、B0、A0、B2)获取运动信息,最多取4个
- 时间候选:从共位PU(Collocated PU)获取时间方向的运动信息,最多取1个
- 历史候选:从之前已编码CU的运动信息中获取(HMVP机制),最多取5个,但总列表不超过6个
- 双向候选:由两个单向候选组合生成(仅B帧)
- 零MV候选:MV=(0,0)的兜底候选
HMVP机制:VVC引入了基于历史的MVP候选(History-based MVP),维护一个FIFO队列,存储最近编码的CU的运动信息。HMVP显著提升了Merge候选的质量,贡献约0.3-0.5% BD-rate增益。
AMVP候选列表构建
AMVP候选列表最多包含2个候选:
- 空间候选:从当前PU的相邻块获取MVP,优先选择与当前PU参考帧相同的相邻块
- 时间候选:从共位PU获取时间方向的MVP
- 零MVP候选:MV=(0,0)的兜底候选
工程优化:AMVP候选数量少(仅2个),但每个候选都需要进行运动估计。VVenC的优化策略:
- 对空间候选进行去重(相同MV仅保留一个)
- 优先搜索高质量候选(与当前PU参考帧相同的候选)
- 对小PU(≤8×8)跳过AMVP,直接使用Merge
MMVD/CIIP/TPM:Merge模式的三大增强
MMVD:Merge模式下的运动矢量细化
MMVD(Merge Mode with Motion Vector Difference)在Merge模式的基础上,允许对选定的Merge候选进行小幅MV修正,兼具Merge的零MVD优势和AMVP的MV精度优势。
MMVD的工作流程:
- 从Merge列表中选择基础MV(Base MV)
- 从预定义的MV偏移表中选择一个偏移量(步长+方向)
- 将偏移量加到基础MV上,得到修正后的MV
- 仅编码MMVD索引(基础MV索引+步长索引+方向索引)
MV偏移表包含8个步长(1/4、1/2、1、2、4、8、16、32像素)和4个方向(上/下/左/右),共32种偏移组合。
压缩增益:MMVD贡献约0.3-0.5% BD-rate增益,主要受益场景:
- 小幅运动(摄像机抖动、物体微动)
- 低码率场景(MVD码率开销大,MMVD的索引编码更高效)
- 小PU(运动估计精度受限,MMVD可提供亚像素级修正)
工程实现:MMVD的32种偏移组合需要逐一进行RDO搜索,计算量较大。VVenC的优化策略:
- 仅对Merge列表前2个候选启用MMVD
- 对小步长(≤1像素)进行SATD预筛选
- 对大PU(≥32×32)跳过MMVD(增益极小)
CIIP:帧内帧间融合预测
CIIP(Combined Inter and Intra Prediction)对PU同时使用帧间预测和帧内预测,将两者加权融合:
PCIIP=w⋅Pinter+(1−w)⋅PintraPCIIP=w⋅Pinter+(1−w)⋅Pintra
其中 PinterPinter 为帧间预测值, PintraPintra 为帧内预测值(使用Planar模式), ww 为融合权重。
CIIP的工作流程:
- 从Merge列表中选择运动信息,生成帧间预测 PinterPinter
- 使用Planar模式进行帧内预测,生成 PintraPintra
- 根据PU与相邻块的编码模式关系,选择融合权重 ww :
- 相邻块均为帧间模式: w=1/4w=1/4 (偏帧间)
- 相邻块均为帧内模式: w=3/4w=3/4 (偏帧内)
- 其他情况: w=1/2w=1/2 (等权融合)
压缩增益:CIIP贡献约0.2-0.4% BD-rate增益,主要受益场景:
- 遮挡区域(帧间预测失效,帧内预测可补偿)
- 物体边缘(帧间块效应明显,帧内平滑可改善)
- 低码率场景(帧内预测的平滑效果更显著)
工程实现:CIIP需要额外进行帧内预测,计算开销中等。VVenC对CIIP全量启用,x266默认关闭(增益/复杂度比不够高)。
TPM:三角形划分模式
TPM(Triangle Partition Mode)将CU沿对角线划分为两个三角形区域,每个三角形独立使用不同的Merge候选进行帧间预测,然后在边界处进行自适应加权融合。
TPM的工作流程:
- 选择划分方向(对角线或反对角线)
- 为两个三角形区域分别从Merge列表中选择运动信息
- 对两个三角形区域分别进行运动补偿
- 在三角形边界处进行加权融合(权重从边界向两侧衰减)
压缩增益:TPM贡献约0.3-0.5% BD-rate增益,主要受益场景:
- 物体边界(两个物体沿对角线分隔)
- 旋转运动(不同区域运动方向不一致)
- 中等码率场景
工程实现:TPM的搜索空间较大(2种划分方向 × Merge候选组合)。VVenC的优化策略:
- 仅对≥8×8的CU启用TPM
- 用SATD预筛选划分方向
- 对每个三角形仅搜索Merge列表前4个候选
GPM:广义双向预测
核心思想
GPM(Generalized Bi-Prediction)是HEVC中双向预测的扩展。HEVC的双向预测对L0和L1参考帧的预测值进行等权平均,而GPM允许对两个双向预测候选进行加权融合,权重由编码器通过RDO选择。
GPM的工作流程:
- 从Merge列表中选择两个不同的双向预测候选
- 对两个候选的预测值进行加权融合:
PGPM=w⋅P1+(1−w)⋅P2PGPM=w⋅P1+(1−w)⋅P2
- 权重 ww 从预定义的权重表中选择(共64种权重组合)
与TPM的区别:TPM是空间划分(不同区域用不同MV),GPM是全CU加权融合(整个CU用两个MV的加权和)。两者可以组合使用。
压缩增益
GPM贡献约0.2-0.4% BD-rate增益,主要受益场景:
- 光照变化(两个参考帧亮度不一致,加权可补偿)
- 半透明物体(两个参考帧的内容混合)
- 中等码率场景
工程实现:GPM的64种权重组合需要逐一进行RDO搜索,计算量较大。VVenC的优化策略:
- 仅对双向预测PU启用GPM
- 用SATD预筛选Top-8权重组合
- 对大PU(≥32×32)跳过GPM
IBC:屏幕内容的"帧内帧间"
核心思想
IBC(Intra Block Copy)是一种特殊的帧间预测模式,参考帧不是时间上的前一帧,而是当前帧中已重建的区域。IBC本质上是在当前帧内进行"块复制",特别适合屏幕内容中大量重复的文本、图标、UI元素。
IBC的工作流程:
- 在当前CTU左侧和上方的已重建区域中搜索最佳匹配块
- 将匹配块的位置编码为块矢量(BV)
- 用匹配块作为预测值,仅编码残差
关键特性:IBC在码流中被标记为帧间模式(使用Merge/AMVP机制),但参考帧是当前帧,因此被称为"帧内帧间"。
压缩增益
IBC对屏幕内容贡献约3-5% BD-rate增益,是屏幕内容编码中增益最大的工具之一。但对自然视频增益极小(<0.1%),因此通常仅在屏幕内容模式下启用。
工程实现:IBC的运动搜索范围受限于当前CTU的左侧和上方区域(通常限制为当前CTU左侧2个CTU宽度的区域)。VVenC的优化策略:
- 使用哈希匹配加速搜索(对4×4子块预计算哈希值)
- 对自然视频自动关闭IBC
- BV编码使用与AMVP相同的MVD机制
DMVR:解码端运动矢量细化
核心思想
DMVR(Decoder-side Motion Vector Refinement)允许解码端对双向预测的MV进行小幅修正,无需编码器传输额外的MVD信息。编码器在编码时假设解码端会进行DMVR细化,因此编码器端的RDO也使用细化后的MV计算率失真代价。
DMVR的工作流程(解码端):
- 对双向预测PU,从初始MV出发
- 在初始MV周围搜索25个点(5×5网格,步长1像素)
- 对每个搜索点,计算L0和L1预测块之间的匹配代价(SAD)
- 选择匹配代价最小的点作为细化后的MV
- 用细化后的MV进行双向预测
关键特性:DMVR在解码端执行,不增加码率开销,但提升预测精度。
压缩增益
DMVR贡献约0.3-0.5% BD-rate增益,主要受益场景:
- 双向预测PU
- 中等码率场景
- 运动复杂的区域
工程挑战:DMVR在解码端执行,增加了计算复杂度。VVenC的优化策略:
- 仅对≥8×8的双向预测PU启用DMVR
- 对平坦区域跳过DMVR(增益极小)
- 用SIMD加速SAD计算
PROF:子块级双向光流
核心思想
PROF(Prediction Refinement with Optical Flow)在双向预测的基础上,使用光流模型对预测值进行子块级修正,补偿局部运动的不一致性。
PROF的工作流程:
- 对双向预测PU,将CU划分为4×4子块
- 对每个子块,计算L0和L1预测值之间的光流修正量:
ΔP=∂P∂x⋅Δvx+∂P∂y⋅ΔvyΔP=∂x∂P⋅Δvx+∂y∂P⋅Δvy
其中 ∂P∂x∂x∂P 和 ∂P∂y∂y∂P 为预测值的梯度, ΔvxΔvx 和 ΔvyΔvy 为L0和L1 MV的差值
3. 将修正量加到双向预测值上
关键特性:PROF对双向预测的预测值进行后处理修正,不改变MV本身,因此解码端可以独立执行。
压缩增益
PROF贡献约0.2-0.3% BD-rate增益,主要受益场景:
- 旋转运动(子块级运动不一致)
- 形变运动(物体局部运动差异大)
- 高码率场景
工程实现:PROF涉及梯度计算和光流修正,计算开销中等。VVenC对PROF全量启用,x266默认关闭。
运动估计加速策略
分层搜索
运动估计是帧间编码中最耗时的操作。VVC采用分层搜索策略:
- 整数像素搜索:使用菱形搜索或六边形搜索,在整数像素精度下找到最佳匹配
- 半像素搜索:在整数像素最佳点周围进行半像素精度的搜索
- 四分之一像素搜索:在半像素最佳点周围进行1/4像素精度的搜索
工程优化:VVenC使用改进的钻石搜索(Diamond Search),将搜索点数从HEVC的9个减少到5-7个,加速比约1.5×。
早期终止
在运动搜索过程中,若当前搜索点的代价已超过已知最优代价的(1+θ)倍,则提前终止搜索:
if (current_SAD > best_SAD × (1 + θ)): skip_remaining_search()θ的取值取决于预设:
| 预设 | θ值 | 加速比 | BD-rate损失 |
|---|---|---|---|
| fast | 0.5 | 3× | ~0.5% |
| medium | 0.2 | 1.8× | ~0.2% |
| slow | 0.05 | 1.2× | ~0.05% |
内容自适应搜索范围
根据PU的运动特征动态调整搜索范围:
- 小运动(相邻块MV小):缩小搜索范围(±16像素)
- 大运动(相邻块MV大):扩大搜索范围(±128像素)
- 平坦区域(方差低):跳过运动估计,直接使用零MV
- 纹理区域(方差高):全范围搜索
VTM vs VVenC/x266:帧间预测实现对比
| 特性 | VTM(参考软件) | VVenC(工程编码器) | x266 |
|---|---|---|---|
| AMVP | 全候选搜索 | 空间候选去重 | 简化候选列表 |
| Merge | 6候选全搜索 | HMVP+FIFO优化 | 4候选简化 |
| MMVD | 32偏移全搜索 | Top-2候选+预筛选 | 关闭 |
| CIIP | 全启用 | 全启用 | 关闭 |
| TPM | 全搜索 | SATD预筛选 | 关闭 |
| GPM | 64权重全搜索 | Top-8预筛选 | 关闭 |
| IBC | 全范围搜索 | 哈希加速+CTU限制 | 关闭 |
| DMVR | 全启用 | ≥8×8启用 | 关闭 |
| PROF | 全启用 | 全启用 | 关闭 |
| SIMD | 无 | AVX2/NEON | SSE4.2 |
| 并行策略 | 无 | CTU行并行+WPP | CTU行并行 |
关键洞察:帧间预测是VVC中工程裁剪空间最大的模块之一。VVenC通过候选预筛选+早期终止+SIMD加速,将帧间编码耗时降低约60%,BD-rate损失仅0.3-0.5%。
实战配置模板
低延迟直播场景
# VVenC参数 --preset fast --qp 32 # 目标码率 --mmvd 0 # 关闭MMVD(降低复杂度) --ciip 0 # 关闭CIIP --tpm 0 # 关闭TPM --gpm 0 # 关闭GPM --dmvr 0 # 关闭DMVR(解码端开销) --prof 0 # 关闭PROF --ibc 0 # 关闭IBC(自然视频) --hme 1 # 启用分层运动估计加速高质量点播场景
--preset slower --qp 22 # 目标码率 --mmvd 1 # 启用MMVD --ciip 1 # 启用CIIP --tpm 1 # 启用TPM --gpm 1 # 启用GPM --dmvr 1 # 启用DMVR --prof 1 # 启用PROF --ibc 0 # 关闭IBC(自然视频) --hme 1 # 启用分层运动估计屏幕内容场景
--scm 1 # 启用屏幕内容模式 --mmvd 1 # 启用MMVD --ciip 0 # 关闭CIIP(屏幕内容帧内已足够好) --tpm 0 # 关闭TPM(屏幕内容运动简单) --gpm 0 # 关闭GPM --dmvr 0 # 关闭DMVR --prof 0 # 关闭PROF --ibc 1 # 启用IBC(屏幕内容核心工具) --hme 0 # 关闭分层运动估计(IBC需要精确搜索)动画/卡通内容场景
--mmvd 1 # 启用MMVD --ciip 1 # 启用CIIP(卡通边缘需要帧内补偿) --tpm 1 # 启用TPM(卡通物体边界清晰) --gpm 0 # 关闭GPM(卡通色彩均匀,双向加权增益小) --dmvr 1 # 启用DMVR --prof 0 # 关闭PROF(卡通运动刚性,光流增益小) --ibc 0 # 关闭IBC帧间模式快速决策:工程编码器的核心战场
四级决策框架
工程编码器通常采用四级决策框架来加速帧间模式选择:
第一级:快速Skip/Direct检测
对每个PU,先检测是否可以直接使用Skip或Direct模式:
- 若相邻块均为Skip模式,且当前PU残差极小,则直接使用Skip
- 若当前PU为双向预测且MV接近零,则使用Direct
加速效果:约30%的PU可直接跳过后续搜索。
第二级:Merge候选快速筛选
对Merge候选列表进行SATD预筛选,仅对Top-3候选进行完整RDO:
SATD_cost = Σ|Hadamard(residual)|第三级:AMVP快速运动估计
对AMVP模式,使用简化运动估计(缩小搜索范围+早期终止),仅当AMVP代价优于Merge时才进行完整运动估计。
第四级:增强模式条件启用
对MMVD/CIIP/TPM/GPM等增强模式,仅在基础模式代价较低时启用:
if (best_merge_cost < threshold): enable_MMVD/CIIP/TPM/GPM()内容自适应决策
根据PU的局部特征动态调整搜索策略:
- 平坦区域(方差低):仅使用Merge Skip,跳过运动估计
- 纹理区域(方差高):全模式搜索
- 运动区域(相邻块MV大):扩大搜索范围,启用MMVD/DMVR
- 静止区域(相邻块MV小):缩小搜索范围,跳过增强模式
结语:帧间预测是时间相关性的极致挖掘
VVC的帧间预测工具箱已经从HEVC的AMVP/Merge扩展到AMVP/Merge + MMVD/CIIP/TPM/GPM + IBC + DMVR/PROF的多元体系,每一个工具都在试图更精准地捕捉视频的时间结构和运动规律。但工具越多,搜索空间越大,工程取舍就越重要。
建议建立"帧间工具增益画像",针对不同内容类型(自然视频/屏幕内容/动画)、不同PU尺寸、不同QP范围,配置差异化的模式搜索策略。让编码器理解运动,而非盲目全搜。
帧间预测是P/B帧压缩的引擎,也是整个编码流水线的核心。愿每一位视频编码工程师,都能在运动矢量与光流修正之间找到