原文出处:https://www.vcodex.com/video-coding-walkthrough/
这里只是简单的翻译了一下,搬运请注明。
本示例说明如何对视频帧进行编码(压缩)和解码(解压缩)。该帧使用简单的运动补偿变换编码器进行处理,类似于早期的MPEG编解码器。但是,基本原理适用于更复杂的编解码器,例如H.264,VP8等。
原始帧取自CIF视频序列,这意味着图1所示的亮度或亮度分量宽352个样本,高288个样本。未显示的红色/蓝色色度分量均为176x144样本。(其实就是4:2:0的抽样,下图未展示色度分量而已)
图2示出了视频序列中的重构的前一帧。已对其进行了编码和解码(=重构),可以看到一些失真。图1和图2之间的差异没有运动补偿,如图3所示。显然,图3中仍然存在大量能量,尤其是在运动区域附近。



运动估计以16x16的块大小和半像素精度执行,为清晰起见,将图4所示的向量集叠加在当前帧上。许多向量为零,并显示为点,这意味着该宏块的最佳匹配在参考帧中的相同位置。在移动区域周围,向量指向块从其移动的方向。站在图片左侧的人正在向左侧行走;因此向量指向右边,即他来自哪里。某些矢量似乎不对应于“真实”运动,例如桌子上的那些,但仅表示最佳匹配不在参考系中的同一位置。像这样的“嘈杂”矢量经常出现在图片的参考帧中没有清晰对象特征的区域中。

图5示出了运动补偿的参考帧,即,每个块根据运动矢量移位的参考帧。行走的人已向左移动,以为当前帧中的同一人提供更好的匹配,而最左边的人的手已向下移动,以提供更好的匹配。从当前帧中减去经过运动补偿的参考帧,即可得到经过运动补偿的残差(图6)。与图3相比,能量明显减少了,特别是在运动区域附近。


图7显示了原始帧的宏块,取自右图的头部。图8是运动补偿后相同宏块的亮度分量。这称为残差。


使用离散余弦变换(DCT)对残差宏块内的每个块进行转换。将二维DCT应用于亮度样本的右上8x8块(表1)会产生表2中列出的DCT系数。每个系数的大小如图9所示。请注意,较大的系数聚集在左上角或直流系数。



使用前向量化器
Qcoeff = round(coeff/Qstep)
其中Qstep是量化器步长,在本示例中Qstep = 12。量化器的输出如表3所示。小数值系数在量化块中变为零,非零输出聚集在左上角(DC)系数周围。

从左上角开始,在锯齿形扫描(从左上角开始的Z字形扫描)中对量化块进行重新排序,以产生以下系数列表:
-1、2、1,-1,-1、2、0,-1、1,-1、2,-1,-1、0、0,-1、0、0、0,-1,- 1,0,0,0,0,0,1,0,…(此后的所有零)
处理此数组以产生一系列(运行,水平)对:
(0,-1)(0,2)(0,1)(0,-1)(0,-1)(0,2)(1,-1)(0,1)(0,-1) (0,2)(0,-1)(0,-1)(2,-1)(3,-1)(0,-1)(5,1)(EOB)
每对中的第一个数字表示前面的零的数量,第二个数字表示非零的“级别”。 “ EOB”(块末)表示其余系数为零。
每个(行程,级别)对均被编码为可变长度代码(VLC)。使用MPEG-4 Visual中的可变长度代码表,生成了表4中所示的VLC。

最终的VLC发出LAST = 1信号,表明这是该块的结尾。该宏块的运动矢量为(0,1),即矢量指向下方。运动矢量X和Y分量分别(差分)编码为(1)和(0010)。
宏块作为一系列VLC传输,包括每个8x8块的宏块头,编码运动矢量和变换系数。
在解码器处,对VLC序列进行解码,以提取每个块的标题参数,编码的运动矢量和(行程,水平)对。通过在每个(级别)之前插入(运行)零来重构64个元素的系数数组。然后对阵列进行排序,以产生与表3相同的8x8块。量化系数使用以下方法重新缩放:
Rcoeff = Qstep.Qcoeff
重新定标或逆量化会产生表5所示的系数块。由于量化过程,该块与原始DCT系数(表2)明显不同。应用逆DCT来创建解码后的残差块(表6),该块与原始残差块(表1)相似但不相同。比较图10中的原始残差块和解码残差块,很明显,由于高频DCT系数通过量化的损失,解码块的高频变化较小。



解码器重新创建原始运动矢量(0,1)。解码器使用此向量以及它自己的先前解码帧的副本(图2)来重构宏块。完整的解码帧如图11所示。由于进行了量化处理,因此引入了一些失真,例如,在诸如面部和板上书写等详细区域周围,并且沿8x8块边界存在一些明显的边缘。完整的序列被压缩了大约300倍,即编码序列所占的大小小于未压缩视频的大小的1/300。以相对较差的图像质量为代价实现了显着的压缩。

网友评论