我一直在尝试理解现代编码器(特别是H264)如何工作,特别是视频编码的过程。文档中经常提到,残差帧是从当前p帧和上一个i帧之间的差异中创建的(假设以下帧不用于预测)。我知道使用了YUV颜色空间(可能是YV12),并且一幅图像被“减去”另一幅图像,然后形成残差。但我不明白这种减法是如何进行的。我认为它不是差异的绝对值,因为那会有歧义。请问每个像素的公式是什么?
减法只是视频编码中的一小步骤;大多数现代视频编码背后的核心原理是运动估计,然后是运动补偿。基本上,运动估计的过程会生成向量,显示连续帧之间宏块之间的偏移量。然而,这些向量总是存在一定误差。因此,编码器将同时输出向量偏移和“残差”。残差并不是简单地两个帧之间的差异;它是考虑了运动估计之后两个帧之间的差异。在补偿方面,可以参考维基百科文章中的“运动补偿差”图像,清楚地说明了这一点--请注意,运动补偿差远远小于“愚蠢”的残差。 这里有一份不错的PDF文件,介绍了一些基础知识。 还有几点需要注意: 是的,YUV总是被使用,并且通常大多数编码器都使用YV12或其他色度抽样格式。 减法运算必须分别在Y、U和V帧上进行(将它们视为三个独立的通道,所有这些通道都需要被编码--然后就很清楚减法运算应该如何进行了)。运动估计可能会在Y、U和V平面上发生;有时编码器只对Y(亮度)值进行运动估计,以节省一些CPU而牺牲一些质量。