一句话总结:
当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帧 的第一个宏块:
-
参考帧同位块:在上一帧的(0,0)位置,该块MV为(2,3)。
-
当前块真实MV:实际运动是(3,4)。
-
MVP推导:
- 无邻居 → 使用同位块MV(2,3)作为MVP。
- 编码器存储差值:ΔMV = (3-2, 4-3) = (1,1)。
-
结果:比直接存MV(3,4)更省比特。
五、极端情况处理
-
参考帧同位块不存在(如首帧) :
- MVP强制设为(0,0),后续残差承担全部调整。
-
快速运动场景:
- MVP误差大 → 残差数据量增加,但整体仍比全存MV高效。
六、总结口诀
“P帧首块无邻居,参考帧里找同位。
同位有值直接抄,无值零矢来顶替。
残差修正保精度,编码省位有妙计!”