一句话说透计算机视频编码里面的 P 帧的第一个宏块的 MVP 怎么得到呢?

295 阅读2分钟

一句话总结:
当P帧的第一个宏块周围没有可参考的邻居时,编码器会“无中生有”——用默认值或参考帧的中间位置来猜运动方向,就像迷路时随便选条路先走!


一、MVP 是什么?

  • 运动矢量预测值(MVP) :根据周围已编码块的运动矢量(MV),推测当前块的运动方向,减少数据量。
  • 核心作用:不直接存完整MV,而是存MVP与真实MV的差值(更省空间)。

二、第一个宏块的困境:没邻居可参考

  • 位置:位于图像左上角(0,0),左侧和上方无已编码块。
  • 问题:无法用常规的左侧(A)、上方(B)、右上(C)块预测MVP。

三、解决策略:四步推导法

1. 检查左侧(A)和上方(B)块是否存在

  • 对于第一个宏块,A和B都不存在 → 跳过。

2. 使用参考帧中的“同位块”运动矢量

  • 同位块:参考帧中同一位置的宏块。
  • 若同位块有MV → 将其MV作为MVP候选。
  • 若同位块无MV(如I帧)  → MVP设为(0,0)。

3. 中值预测法的替代方案

  • 常规中值法:MVP = 中值(A的MV, B的MV, C的MV)。
  • 无邻居时:强制使用同位块的MV或默认(0,0)。

4. 实际编码器处理(以x264为例)

  • 默认MVP:若同位块无效,直接设MVP=(0,0)。
  • 残差编码:即使MVP不准,后续通过残差调整(最终画面正确)。

四、示例场景

假设编码一个 P帧 的第一个宏块:

  1. 参考帧同位块:在上一帧的(0,0)位置,该块MV为(2,3)。

  2. 当前块真实MV:实际运动是(3,4)。

  3. MVP推导

    • 无邻居 → 使用同位块MV(2,3)作为MVP。
    • 编码器存储差值:ΔMV = (3-2, 4-3) = (1,1)。
  4. 结果:比直接存MV(3,4)更省比特。


五、极端情况处理

  • 参考帧同位块不存在(如首帧)

    • MVP强制设为(0,0),后续残差承担全部调整。
  • 快速运动场景

    • MVP误差大 → 残差数据量增加,但整体仍比全存MV高效。

六、总结口诀

“P帧首块无邻居,参考帧里找同位。
同位有值直接抄,无值零矢来顶替。
残差修正保精度,编码省位有妙计!”