ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

VVC仿射运动补偿:从原理到实践,提升视频编码效率的关键技术

2026/8/21 9:38:28 拓冰建站 浏览量
VVC仿射运动补偿:从原理到实践,提升视频编码效率的关键技术 1. 从“平移”到“形变”为什么VVC需要仿射运动补偿在视频编码的世界里运动补偿预测Motion Compensation Prediction, MCP是压缩效率的基石。它通过描述并利用相邻帧之间的像素运动即运动矢量来预测当前块的像素值从而大幅减少需要编码的残差信息。在H.265/HEVC及其之前的编码标准中运动补偿模型主要基于平移模型。简单来说它假设一个编码块比如一个16x16的块内所有像素的运动方向和速度是完全一致的就像一块完整的瓷砖被整体挪动了一个位置。这个模型在大多数场景下工作得不错但对于现实世界中更复杂的运动就显得力不从心了。想象一下一个旋转的风扇叶片、一个正在挥手的人、或者一个逐渐放大的镜头——这些场景中物体上不同点的运动方向和速度是变化的。如果强行用一个统一的运动矢量来描述整个块预测出的画面就会产生明显的“撕裂”或“模糊”导致残差能量巨大压缩效率急剧下降。H.266/VVCVersatile Video Coding引入的仿射运动补偿预测正是为了解决这个核心痛点。它不再将编码块视为一个刚体而是允许块内的运动呈现一种更符合物理规律的“形变”。仿射模型能够描述包括平移、旋转、缩放和剪切在内的多种运动形式。这意味着对于一个正在旋转的物体编码器现在可以用一组参数精确地描述块内每个像素点因旋转而产生的不同位移从而得到质量高得多的预测帧残差自然就小多了。我处理过不少包含复杂运动的素材比如航拍的城市转弯镜头或者体育赛事中的慢动作回放。在HEVC下这些片段要么码率飙升要么在相同码率下出现令人不快的块状模糊。而一旦切换到支持仿射模式的编码方案如VVC或某些优化后的编码器同等主观质量下码率能有肉眼可见的下降这就是运动模型进化带来的直接收益。2. 仿射运动模型的核心原理从参数到像素位移理解仿射运动补偿关键在于搞懂“仿射变换”这个数学工具如何被应用到视频的像素预测上。我们不需要成为数学家但必须清楚其映射关系。一个二维仿射变换可以用一个2x3的矩阵来表示它建立了当前帧预测帧中一个像素点坐标(x, y)与参考帧中对应像素点坐标(x‘, y’)之间的关系。在VVC中主要定义了两种仿射模型对应不同复杂度的运动2.1 4参数仿射模型简化模型这个模型适用于描述平移、旋转和均匀缩放各向同性缩放的组合运动。它需要4个参数(a, b, c, d)。其运动矢量场Motion Vector Field, MVF由以下公式定义v_x a * x b * y e v_y c * x d * y f其中(v_x, v_y)是位于(x, y)的像素相对于某个参考点的运动矢量。(e, f)代表该参考点本身的平移分量。更直观地VVC的实现通常基于控制点。对于4参数模型它使用一个编码块左上角和右上角的两个控制点的运动矢量MV_0和MV_1来推导出所有参数。假设块左上角(0, 0)的运动矢量为MV_0 (mv_0_x, mv_0_y)。假设块右上角(w, 0)的运动矢量为MV_1 (mv_1_x, mv_1_y)其中w是块的宽度。那么块内任意一点(x, y)的运动矢量(v_x, v_y)可以通过线性插值得到v_x mv_0_x (mv_1_x - mv_0_x) * x / w (mv_2_x - mv_0_x) * y / h v_y mv_0_y (mv_1_y - mv_0_y) * x / w (mv_2_y - mv_0_y) * y / h对于4参数模型我们假设不存在垂直方向的剪切因此mv_2_x - mv_0_x和mv_2_y - mv_0_y相关的项实际上由模型约束为特定的关系或视为0最终简化为仅由MV_0和MV_1决定。实际上标准中直接给出的推导方式是v_x mv_0_x (mv_1_x - mv_0_x) * (x / w) - (mv_1_y - mv_0_y) * (y / w) v_y mv_0_y (mv_1_y - mv_0_y) * (x / w) (mv_1_x - mv_0_x) * (y / w)这个形式能更清楚地看出(mv_1_x - mv_0_x)和(mv_1_y - mv_0_y)共同决定了缩放和旋转的参数。2.2 6参数仿射模型完整模型这个模型是完整的仿射变换在4参数模型的基础上增加了剪切变换的能力。它需要6个参数由三个控制点的运动矢量来定义。在VVC中这三个控制点通常是块的左上角、右上角和左下角对应的运动矢量分别为MV_0,MV_1,MV_2。此时块内任意一点(x, y)的运动矢量计算公式为v_x mv_0_x (mv_1_x - mv_0_x) * (x / w) (mv_2_x - mv_0_x) * (y / h) v_y mv_0_y (mv_1_y - mv_0_y) * (x / w) (mv_2_y - mv_0_y) * (y / h)这个公式非常直观(mv_1_x - mv_0_x)/w代表了水平方向在x轴上的变化率水平缩放/剪切(mv_2_x - mv_0_x)/h代表了水平方向在y轴上的变化率水平剪切垂直方向同理。一个关键的操作细节由于像素坐标是整数而计算出的(x/w)和(y/h)可能是小数VVC采用了高精度的定点数运算来保证插值的准确性。通常w和h会被归一化并使用位移操作来高效实现除法。在实际解码或预测生成时需要按照标准规定的精度如1/16或1/64像素精度来计算每个子块或像素的运动矢量。注意VVC通常不以单个像素为单位应用仿射运动矢量而是将一个大块如8x8或4x4划分为更小的子块如4x4为每个子块的中心点计算一个运动矢量然后这个子块内的所有像素都使用这个运动矢量进行平移运动补偿。这是一种在精度和复杂度之间的折中称为“仿射子块运动补偿”。3. 编码端的仿射运动估计如何找到那组最优参数对于解码端来说只要收到几个控制点的运动矢量按照公式计算即可。但对于编码器最大的挑战在于如何为当前编码块找到那一组最能准确预测其内容的仿射模型参数这是一个高维、非线性的优化问题计算复杂度远高于传统的平移运动估计。主流编码器如VTMVVC的参考软件一般采用多阶段、启发式的搜索策略来平衡精度和复杂度3.1 仿射模式的触发与候选列表构建并非所有块都适合使用仿射模式。编码器会先进行快速判断例如块大小通常只对足够大的块如面积大于等于64像素才考虑仿射模式因为小块的形变运动不明显且参数开销相对较大。时空邻域信息检查当前块的时空相邻块左边、上边、右上、左下等是否采用了仿射模式。如果是它们的控制点运动矢量CPMV是极佳的初始候选。编码器会构建一个仿射Merge候选列表和仿射AMVP高级运动矢量预测候选列表。Merge模式直接继承邻块的运动模型参数包括控制点矢量。如果邻块是仿射编码的则将其模型参数作为候选也可以由多个平移邻块的矢量组合推导出仿射参数。编码器只需传输一个候选索引效率极高。AMVP模式需要传输运动矢量差MVD。编码器同样先构建一个预测器列表基于邻块推导然后对每个控制点的运动矢量进行精细搜索并将搜索得到的矢量与预测器之差MVD进行编码。3.2 参数搜索与迭代优化当从候选列表中获得一个初始的仿射模型参数后编码器会进行迭代细化以提升精度。一个经典的方法是基于梯度的搜索例如“仿射运动估计的迭代细化”。误差表面建模假设当前块使用一组仿射参数P进行预测产生的预测块与原始块的残差为SAD(P)绝对误差和。我们的目标是找到使SAD最小的P。梯度计算在初始点P0编码器可以估计SAD相对于每个仿射参数如a, b, c, d, e, f的梯度。这通常通过给每个参数施加一个微小扰动如±1像素偏移重新计算预测和SAD来近似。参数更新沿着梯度下降的方向更新仿射参数。例如P_new P_old - step * Gradient。步长step需要精心选择。迭代与终止重复步骤2和3直到SAD的变化小于某个阈值或达到最大迭代次数。由于对6个参数进行全精度搜索计算量巨大实践中会采用多种加速策略分层搜索先在低分辨率下采样的图像上进行粗搜索锁定大致区域再在全分辨率上细化。单向预测优先先尝试单向仿射预测只用一个参考帧列表如果效果很好则可能跳过双向预测的复杂搜索。提前终止如果当前仿射模式的率失真代价RD Cost在早期就远高于最好的平移模式则提前终止对该仿射模式的进一步搜索。我的实操心得在调优编码器参数时仿射搜索的复杂度配置如迭代次数、搜索范围、是否启用快速算法对编码速度和压缩效率的平衡影响巨大。对于实时通讯场景我通常会大幅限制仿射搜索的深度和范围甚至只启用Merge模式而关闭AMVP模式的精细搜索。而对于点播存储场景则可以放开限制追求极致压缩率。另一个关键点是仿射模式在具有明显旋转、缩放前景的视频中收益最大在静态背景或简单平移的视频中开启它只会徒增编码时间。4. 解码端与预测信号生成从比特流到重建像素解码端接收到的关于仿射模式的信息远比我们想象的“精简”。它不需要接收6个浮点数参数。解码过程体现了现代视频编码标准的精巧设计。4.1 比特流中的信息解析解码器从比特流中解析出以下关键信息预测模式标志pred_mode_flag指示当前块是帧内、帧间平移还是帧间仿射预测。仿射模式类型如果是仿射预测一个标志位指示是4参数还是6参数模型。Merge索引或MVD如果使用Affine Merge模式解码器解析一个候选列表索引。根据这个索引从已重建的邻块信息中推导出当前块的控制点运动矢量CPMV。解码器自身维护着与编码器完全相同的候选列表构建规则因此能推导出完全相同的CPMV。如果使用Affine AMVP模式解码器需要解析 a. 一个预测器索引用于从AMVP候选列表中获得每个控制点运动矢量的预测值mvp。 b. 每个控制点对应的运动矢量差MVD这些MVD是经过熵编码如CABAC的数值。 然后计算真实运动矢量mv mvp mvd。4.2 运动矢量场推导与子块划分获得控制点运动矢量MV_0, MV_1, MV_2后解码器需要为块内每个像素生成预测值。直接为每个像素计算一个仿射MV并取参考像素是不现实的复杂度太高。VVC的方案是划分子块将当前编码块划分为多个小的子块例如对于亮度分量最小子块尺寸为4x4。每个子块将共享一个运动矢量。计算子块MV以每个子块的中心点坐标(x_c, y_c)代入第2章中的仿射公式计算出该子块的中心运动矢量。这个MV的精度会取整到标准规定的运动矢量精度如1/16像素。存储子块MV计算出的子块MV会被存储下来用于后续块的时空预测以及用于后续的解码端运动矢量细化DMVR或双向光流BDOF等工具。4.3 预测像素生成对于每个4x4的子块解码器将其运动矢量视为一个传统的平移运动矢量。运动补偿插值根据这个平移MV去到指定的参考帧中使用VVC定义的8抽头插值滤波器对于亮度分量获取对应的预测像素块。这个过程和普通的平移运动补偿完全一样。生成预测块将所有子块的预测块拼接起来就形成了整个当前编码块的仿射预测块。这里有一个极易被忽略但至关重要的细节参考像素的存取与边界处理。由于仿射运动会导致子块的运动矢量指向不同的方向整个编码块所访问的参考帧区域可能是一个不规则的四边形而不是一个规整的矩形。这要求解码器的运动补偿引擎必须具备高效访问非对齐、非连续内存的能力。此外当运动矢量指向参考帧边界之外时需要进行边界填充PaddingVVC有明确的边界扩展规则。如果处理不当会在物体边缘产生不可预测的像素值影响解码正确性和后续帧的预测。提示在实现或调试解码器时仿射预测模块的单元测试必须包含大量极端案例大旋转角、大缩放比、运动矢量指向参考帧边界、以及不同块大小和子块划分的组合。我曾遇到过因为子块MV取整精度与标准不一致导致在特定序列下解码画面出现细微错位的Bug排查起来非常耗时。5. 率失真优化与模式决策编码器的权衡艺术编码器最终是否为一个块选择仿射模式是一个经典的率失真优化RDO问题。它需要在编码比特数Rate和重建失真Distortion之间找到最佳平衡点。5.1 率失真代价计算对于每一个待选的预测模式包括各种尺寸的平移模式、仿射Merge、仿射AMVP等编码器都会模拟编码过程计算其率失真代价JJ D λ * RD是失真度通常用SSE误差平方和或SATDHadamard变换后的绝对误差和来度量代表预测块与原始块的差异。R是估计的编码该模式所需的总比特数。这包括模式标志位帧内/帧间/仿射的比特。参考帧索引的比特。运动矢量预测器索引的比特。运动矢量差MVD的比特对于AMVP模式。以及后续残差变换系数编码的比特虽然RDO中会粗略估计但精确计算需要在模式决定后进行。λ是拉格朗日乘子一个与量化参数QP正相关的关键参数。QP越大压缩越狠λ越大编码器越倾向于选择节省比特的模式即使失真稍大。对于仿射模式其R部分通常高于平移模式因为它可能需要传输多个控制点的信息尽管有预测。因此只有当它带来的D的减少足够大足以抵消R的增加时即J_affine J_translation编码器才会选择仿射模式。5.2 仿射模式的竞争力分析在复杂的模式决策舞台上仿射模式需要与众多对手竞争大块平移模式对于大块一个简单的平移MV也可能有不错的效果且码率开销极低。小块合并将当前块分割成多个更小的块每个小块用平移模式可能更灵活。帧内模式在纹理复杂或没有好的时间预测参考时空间预测可能更优。编码器的决策流程通常是层次化的快速粗筛使用低复杂度度量如SAD、梯度快速评估平移、仿射Merge等少数几个候选淘汰明显差的。精细RDO对通过初选的候选模式进行更精确的代价计算包括变换、量化、熵编码的粗略估计。最终抉择选择J值最小的模式作为最终编码模式。仿射模式的优势区间非常明显在中高码率下对于包含明显非平移运动的中大型块。在低码率下λ很大编码器极度“抠门”仿射模式多出来的那点比特开销往往让它失去竞争力此时宁愿用平移模式产生大一点的残差然后用粗量化压掉。在超高分辨率如4K/8K视频中物体在画面中的运动更可能包含透视变化仿射模式的用武之地更大。6. 实际应用中的挑战、调试与性能观测将仿射运动补偿从理论标准落实到实际编码器如VTM、x266或解码器中会遇到一系列工程挑战。6.1 计算复杂度瓶颈仿射运动估计是编码器计算复杂度的主要贡献者之一。一次6参数仿射搜索涉及多次运动补偿插值每次插值都需要8抽头滤波计算密集。在VTM的默认配置下仿射搜索可能占据整个编码时间的15%-30%。优化策略硬件指令集优化利用SIMD指令如AVX2, AVX-512并行化插值滤波器和SAD计算。这是提升速度最有效的手段。搜索算法优化如前所述采用更智能的梯度下降法、更严格的提前终止条件。精度权衡在运动估计阶段使用低精度插值如4抽头滤波器进行快速评估仅在最终确定模式后使用标准8抽头滤波器生成预测块。6.2 与其它编码工具的交互仿射模式不是孤立的它与VVC的其它高级工具紧密交互可能产生“112”或相互冲突的效果。解码端运动矢量细化仿射模式计算出的子块MV可以作为DMVR的初始矢量在解码端进行二次精细化搜索进一步提升预测精度。双向光流BDOF在生成双向预测的最终像素时会利用块内的运动矢量场信息。仿射模式提供的更精确的每子块MV能为BDOF提供更好的输入提升其效果。几何划分模式GPM将块沿斜线分割两部分分别用不同的运动矢量。对于分割后形状不规则的区域仿射模型有时比平移模型能提供更好的预测。编码器需要在GPM和仿射模式之间进行RDO选择。帧内块复制IBC主要用于屏幕内容。仿射模式与IBC通常互斥因为IBC假设块在当前帧内能找到完全匹配的平移块。6.3 客观与主观质量评估在测试仿射模式性能时不能只看BD-rate客观码率节省。BD-rate显示在随机接入配置下仿射模式能为自然视频带来约1%-3%的码率节省相对于关闭仿射。但这个数字因序列特性差异巨大对于BasketballDrive快速全局运动或BQTerrace摄像机运动这类序列节省可能超过3%。对于静态或简单谈话头部序列节省可能接近于0甚至因为模式决策开销略有负收益。更重要的是主观质量。在快速旋转或缩放边缘仿射模式能显著减少“锯齿”或“模糊”感使运动更加平滑自然。这种主观提升在中等码率下尤为明显。评测时需要重点关注这些运动复杂区域的视觉质量对比。6.4 调试与问题排查在开发或集成仿射功能时典型的调试问题包括解码 mismatch编码器和解码器重建画面不一致。这通常源于控制点MV的推导逻辑不一致尤其是Merge候选列表的构建顺序和填充规则。子块MV的计算精度或取整方式与标准不符。参考帧边界处理不一致。编码效率低下仿射模式使用率远低于预期。需要检查运动估计搜索范围是否足够大仿射搜索的起点候选质量是否高RDO计算中的λ值或比特率估计模型是否对仿射模式过于苛刻快速跳过算法是否过于激进在早期就错误地跳过了潜在的优秀仿射候选我的经验是建立一个针对仿射模式的可视化调试工具至关重要。例如将最终采用仿射模式的块用特定颜色高亮并叠加显示其控制点MV和子块MV箭头。这能直观地看出编码器在哪些区域、为何选择了仿射模式是验证算法行为和进行性能分析的神器。仿射运动补偿是VVC超越HEVC的关键技术之一它将运动建模从“整体平移”推进到了“局部形变”的时代。理解其原理、实现细节以及与编码器其他模块的协同对于深入掌握现代视频编码技术、进行高效的编码器开发或应用选型都至关重要。尽管它增加了编码复杂度但在处理日益丰富的视频内容尤其是高分辨率、高动态范围、高帧率视频时其所带来的压缩效率提升是不可或缺的。在实际项目中是否启用、如何配置仿射功能需要根据具体的应用场景实时、存储、画质优先、速度优先做出精细的权衡。