我看到了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]的实际捕获镜头并将其发送给解码器?
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 帧。
| 归档时间: |
|
| 查看次数: |
918 次 |
| 最近记录: |