【问题标题】:MPEG1 motion estimation / compensationMPEG1 运动估计/补偿
【发布时间】:2012-02-15 17:54:57
【问题描述】:

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

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

frame[i+1] = (frame[i] - frame[i-1]) + frame[i]的预测,即将前两个参考帧的运动向量相加到最新的参考框架?然后我们对预测残差进行编码,即实际捕获的帧[i+1] - 预测帧[i+1] 并将其发送到解码器?

【问题讨论】:

  • 我建议您阅读我的这个答案以消除您的大部分疑虑:dsp.stackexchange.com/questions/986/… 阅读此内容后 - 您可以完善您的问题。
  • 嗨 dipan..老实说,我以前看过这样的答案..我的问题更基本..我想知道的是,帧 [i+1] 的预测是否预测为 i在我的第一篇文章中概述。或者是帧预测如下: 预测帧[i+1] = (frame[i+1]-frame[i]) + frame[i] 即是使用前 2 个参考帧计算的当前帧的运动向量.还是使用当前帧和前一个参考帧计算?谢谢
  • frame[i+1] = (frame[i] - frame[i-1]) + frame[i] 错了!请阅读我的回答,它将回答您的前提actual captured shot of frame[i+1] - prediction frame[i+1]是否正确。

标签: mpeg


【解决方案1】:

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)
       }
    }

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

【讨论】:

    猜你喜欢
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多