MPEG1运动估计/补偿

use*_*071 5 mpeg

我看到了MPEG 1的运动估计/补偿的以下解释,只是想知道它是否正确:

为什么我们不编码当前块和参考块之间的原始差异? 因为残差的数字通常要小得多.例如,假设一个物体在整个图像中加速.11帧中的x位置是以下数字.12 16 20 25 31 38 48 59 72 84 96原始差异为x 4 4 5 6 7 10 11 13 12 12因此预测值为xx 20 24 30 37 45 58 70 85 96因此残差为xx 0 1 1 1 3 1 2 -1 0

帧[i + 1] =(帧[i] - 帧[i-1])+帧[i]的预测是将前两个参考帧的运动矢量加到最近的参考帧上吗?然后我们编码预测残差,它是帧[i + 1] - 预测帧[i + 1]的实际捕获镜头并将其发送给解码器?

Bit*_*ank 3

MPEG1解码(运动补偿)的工作原理如下:

预测和运动矢量将参考帧转变为下一(当前)帧。以下是计算新帧的每个像素的方法:

对于每个宏块,您都有一组预测值(与参考帧的差异)。运动矢量是相对于参考帧的值。

// Each luma and chroma block are 8x8 pixels
    for(y=0; y<8; y++)
    {
       for (x=0; x<8; x++)
       {
          NewPixel(x,y) = Prediction(x,y) + RefPixel(x+motion_vector_x, y+motion_vector_y)
       }
    }
Run Code Online (Sandbox Code Playgroud)

对于 MPEG1,您有 I、P 和 B 帧。I帧完全是帧内编码的(例如类似于JPEG),不引用其他帧。P 帧使用前一帧(I 或 P)的预测进行编码。B 帧使用来自两个方向(前一帧和下一帧)的预测进行编码。B帧的处理使视频播放器变得稍微复杂一些,因为它可能会引用下一帧,因此每一帧都有一个序列号,B帧会导致序列是非线性的。换句话说,您的视频解码器在解码流(上一个、当前和下一个)时需要保留可能的 3 帧。