预计阅读本页时间:-
7.3.2 MPEG标准
最后,我们讨论问题的核心:MPEG(Motion Picture Experts Group,运动图像专家组)标准。这是用于压缩视频的主要算法,并于1993年成为国际标准。MPEG-1(第11172号国际标准)设计用于视频录像机质量的输出(对NTSC制式为352×240),它使用的位率为1.2 Mbps。MPEG-2(第13818号国际标准)设计用于将广播质量的视频压缩至4 Mbps到6 Mbps,这样就可以适应NTSC或PAL制式的广播频道。
MPEG的两个版本均利用了在电影中存在的两类冗余:空间冗余和时间冗余。空间冗余可以通过简单地用JPEG分别对每一帧进行编码而得到利用。互相连续的帧常常几乎是完全相同的,这就是时间冗余,利用这一事实可以达到额外的压缩效果。数字便携式摄像机使用的数字视频(Digital Video,DV)系统只使用类JPEG的方案,这是因为只单独对每一帧进行编码可以达到更快的速度,从而使编码可以实时完成。这一论断的因果关系可以从图7-2看出:尽管数字便携式摄像机与未压缩电视相比具有较低的数据率,但是却远不及MPEG-2。(为了使比较公平,请注意DV便携式摄像机以8位对亮度、以2位对每一色度进行采样,使用类JPEG编码仍然存在5倍的压缩率。)
对于摄像机和背景绝对静止,而有一两个演员在四周缓慢移动的场景而言,帧与帧之间几乎所有的像素都是相同的。此时,仅仅将每一帧减去前一帧并且在差值图像上运行JPEG就相当不错。然而,对于摇动或缩放摄像机镜头的场景而言,这一技术将变得非常糟糕。此时需要某种方法对这一运动进行补偿,这正是MPEG要做的事情;实际上,这就是MPEG和JPEG之间的主要差别。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
MPEG-2输出由三种不同的帧组成,观看程序必须对它们进行处理,这三种帧为:
1)I帧:自包含的JPEG编码静止图像。
2)P帧:与上一帧逐块的差。
3)B帧:与上一帧和下一帧的差。
I帧只是用JPEG编码的静止图像,沿着每一轴还使用了全分辨率的亮度和半分辨率的色度。在输出流中使I帧周期性地出现是十分必要的,其原因有三。首先,MPEG可以用于电视广播,而观众收看是随意的。如果所有的帧都依赖于其前驱直到第一帧,那么错过了第一帧的人就再也无法对随后的帧进行解码,这样使观众在电影开始之后就不能再进行收看。第二,如果任何一帧在接收时出现错误,那么进一步的解码就不可能再进行。第三,没有I帧,在进行快进或倒带时,解码器将不得不计算经过的每一帧,只有这样才能知道快进或倒带停止时帧的全部值。有了I帧,就可以向前或向后跳过若干帧直到找到一个I帧并从那里开始观看。由于上述原因,MPEG每秒将I帧插入到输出中一次或两次。
与此相对照,P帧是对帧间差进行编码。P帧基于宏块(macroblock)的思想,宏块覆盖亮度空间中16×16个像素和色度空间中8×8个像素。通过在前一帧中搜索宏块或者与其只存在轻微差异的宏块实现对一个宏块的编码。
P帧的用途在图7-10所示的例子中可以看出。在图7-10中我们看到三个连续的帧具有相同的背景,但是在一个人所在的位置上存在差异。对于摄像机固定在三脚架上,而演员在摄像机面前活动的情形中,这种场景是常见的。包含背景的宏块是严格匹配的,但是包含人的宏块在位置上存在某一未知数量的偏移,编码时必须追踪到前一帧中相应的宏块。

MPEG标准没有规定如何搜索、搜索多远以及如何计算一个匹配的好坏,这些都留给每一具体的实现。例如,一种实现可能在前一帧中的当前位置以及所有在x方向偏移±∆x、在y方向偏移±∆y的位置搜索一个宏块。对于每个位置,可以计算出亮度矩阵中匹配的数目。具有最高得分的位置将成为获胜者,只要其得分高于某一预设的阈值。否则,宏块就被称为失配。当然,更复杂的算法也是可能的。
如果一个宏块被找到,则通过以其值与前一帧中的值求差对其进行编码(针对亮度和两个色度),然后,对这些差值矩阵进行JPEG编码。输出流中宏块的值是运动矢量(宏块在每一方向从其前一位置移动多远的距离),随后是以JPEG进行编码的与前一帧的差值。如果宏块在前一帧中查找不到,则当前值以JPEG进行编码,如同在I帧中一样。
B帧与P帧相类似,不同的是它允许参考宏块既可以在前一帧中,也可以在后续的帧中,既可以在I帧中,也可以在P帧中。这一额外的自由可以改进运动补偿,并且在物体从前面(或后面)经过其他物体时非常有用。例如,在一场垒球比赛中,当三垒手将球掷向一垒时,可能存在某些帧其中垒球遮蔽了在背景中移动的二垒手的头部。在下一帧中,二垒手的头部可能在垒球的左面有一部分可见,头部的下一个近似可以从垒球已经通过了头部的后续的帧中导出。B帧允许一个帧基于未来的帧。
要进行B帧编码,编码器需要在内存中同时保存三个解码的帧:过去的一帧、当前的一帧和未来的一帧。为了简化解码,各帧必须以依赖的顺序而不是以显示的顺序出现在MPEG流中。因而,当一段视频通过网络被观看时,即使有完美的定时,在用户的机器上也需要进行缓冲,对帧进行记录以便正常地显示。由于这一依赖顺序和显示顺序间的差异,试图反向播放一部电影而没有相当可观的缓冲和复杂的算法是无法工作的。
有许多动作以及快速剪切(比如战争电影)的电影需要许多I型帧。而那种在导演对准了摄像机之后便出去喝咖啡,只留下演员背台词(比如爱情故事)的电影,就可以使用长段的P帧与B帧,而这两种帧结构与I帧相比使用很少的存储空间。从磁盘效率的角度来看,一个运营多媒体服务的公司应该尝试得到尽可能多的女性消费群体。