视频编解码概念

1. 概述

        视频是连续的图像序列,由连续的帧构成,一帧即为一幅图像。由于人眼的视觉暂留效应,当帧序列以一定的速率播放时,我们看到的就是动作连续的视频。由于连续的帧之间相似性极高,为便于储存传输,我们需要对原始的视频进行编码压缩,以去除空间、时间维度的冗余。

2. 信息熵与冗余

2.1 信息熵
        信息论之父 C. E. Shannon 在 1948 年发表的论文“通信的数学理论( A Mathematical Theory of Communication )”中指出,任何信息都存在冗余,冗余大小与信息中每个符号(数字、字母或单词)的出现概率或者说不确定性有关。Shannon 借鉴了热力学的概念,把信息中排除了冗余后的平均信息量称为“信息熵”。

  • 变量的不确定性越大,熵也就越大,把它搞清楚所需要的信息量也就越大。
  • 信息熵是信息论中用于度量信息量的一个概念。一个系统越是有序,信息熵就越低。
  • 反之,一个系统越是混乱,信息熵就越高。所以,信息熵也可以说是系统有序化程度的一个度量。

2.2 信息冗余
        冗余信息可分为空间冗余信息和时间冗余信息。

  • 空间域:如在图像的大片区域中,邻近像素几乎具有相同的数值。
  • 时间域:例如连续图像之间的相似部分。

        在所有的压缩系统编码器中都是将熵与冗余相分离,只有熵被编码和传输,而在解码器中再从编码器的发送的信号中计算出冗余。

3. 帧内编码

        帧内编码是空间域编码,利用图像空间性冗余度进行图像压缩,处理的是一幅独立的图像,不会跨越多幅图像。空间域编码依赖于一幅图像中相邻像素间的相似性和图案区的主要空间域频率。
        JPEG标准用于静止图像(即图片),只使用了空间域压缩,只使用帧内编码。

4. 帧间编码

        帧间编码是时间域编码,是利用一组连续图像间的时间性冗余度进行图像压缩。如果某帧图像可被解码器使用,那么解码器只须利用两帧图像的差异即可得到下一帧图像。比如运动平缓的几帧图像的相似性大,差异性小,而运动剧烈的几幅图像则相似性小,差异性大。当得到一帧完整的图像信息后,可以利用与后一帧图像的差异值推算得到后一帧图像,这样就实现了数据量的压缩。时间域编码依赖于连续图像帧间的相似性,尽可能利用已接收处理的图像信息来“预测”生成当前图像。
        MPEG标准用于运动图像(即视频),会使用空间域编码和时间域编码,因此是帧内编码和帧间编码结合使用。
4.1 运动矢量
        一组连续图像记录了目标的运动。运动矢量用于衡量两帧图像间目标的运动程度,运动矢量由水平位移量和垂直位移量二者构成。
4.2 运动补偿
        目标的运动降低了图像间的相似性,增加了差异数据量。而运动补偿则通过运行矢量来降低图像间的差异数据量。
        下图为运动补偿的示意图。当某一目标运动时,其位置会变化但形状颜色等基本不变。编码器则可利用运动矢量减低图像差值,解码器根据图像差值中的运动矢量移动目标到合适的位置即可。假设图中是理想情况,目标除移动位置外其他任何属性无任何变化,则两幅图像间的差值仅包含运动矢量这一数据量。显然运动补偿可以显著减少图像差值数据量。
视频编解码概念_第1张图片
4.3 双向预测
视频编解码概念_第2张图片
        连续的三幅图像中,目标块有垂直位置上的移动,背景块无位置移动。我们考虑如何取得当前帧图像(画面N):

  • 画面N中,目标向上移动后,露出背景块。
  • 画面N-1中,因为背景块被目标块遮挡住了,因此没有背景块相关信息。
  • 画面N+1中,完整包含背景块的数据,因此画面N可以从画面N-1中取得背景块。

        如何可以得到画面N呢?解码器可以先解码得到画面N-1和画面N+1,通过画面N-1中的目标块数据结合运动矢量即可得到画面N中的目标块数据,通过画面N+1中的背景块数据则可得到画面N中的背景块数据。三幅画面的解码顺序为:N-1, N+1, N。三幅画面的显示顺序为:N-1, N, N+1。画面N通过其前一幅画面N-1和后一幅画面N+1推算(预测,predicted)得到,因此这种方式称为双向预测(或前面预测、双向参考)。

5. 帧

        视频压缩中,每帧代表一幅静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。简单地说,I帧是关键帧,属于帧内压缩,就是和AVI的压缩是一样的。P是向前搜索的意思。B是双向搜索。他们都是基于I帧来压缩数据。
5.1 I帧
        I图像(帧)是靠尽可能去除图像空间冗余信息来压缩传输数据量的帧内编码图像。
        I帧又称为内部画面 (intra picture),I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩(做为随机访问的参考点)可以当成图象。在MPEG编码的过程中把部分视频帧序列压缩成为I帧,部分压缩成P帧,还有部分压缩成B帧。I帧法是帧内压缩法(P、B为帧间),也称为“关键帧”压缩法。I帧法是基于离散余弦变换DCT(Discrete Cosine Transform)的压缩技术,这种算法与JPEG压缩算法类似。采用I帧压缩可达到1/6的压缩比而无明显的压缩痕迹。
I帧特点:

  • 它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输。
  • 解码时仅用I帧的数据就可重构完整图像。
  • I帧描述了图像背景和运动主体的详情。
  • I帧不需要参考其他画面而生成。
  • I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量)。
  • I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧。
  • I帧不需要考虑运动矢量。
  • I帧所占数据的信息量比较大。

I帧编码流程:

  • 进行帧内预测,决定所采用的帧内预测模式。
  • 像素值减去预测值,得到残差。
  • 对残差进行变换和量化。
  • 变长编码和算术编码。
  • 重构图像并滤波,得到的图像作为其它帧的参考帧。

5.2 P帧
        P图像(帧)是通过充分降低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧。
        在针对连续动态图像编码时,将连续若干幅图像分成P,B,I三种类型,P帧由在它前面的P帧或者I帧预测而来,它比较与它前面的P帧或者I帧之间的相同信息或数据,也即考虑运动的特性进行帧间压缩。P帧法是根据本帧与相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据。采取P帧和I帧联合压缩的方法可达到更高的压缩且无明显的压缩痕迹。
P帧的预测与重构:
        P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。
P帧特点:

  • P帧是I帧后面相隔1-2帧的编码帧。
  • P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差)。
  • 解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像。
  • P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧。
  • P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧。
  • 由于P帧是参考帧,它可能造成解码错误的扩散。
  • 由于是差值传送,P帧的压缩比较高。

5.3 B帧
        B图像(帧)是既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧。
        B帧法是双向预测的帧间压缩算法。当把一帧压缩成B帧时,它根据相邻的前一帧、本帧以及后一帧数据的不同点来压缩本帧,也即仅记录本帧与前后帧的差值。只有采用B帧压缩才能达到200:1的高压缩。一般地,I帧压缩效率最低,P帧较高,B帧最高。
B帧的预测与重构:
        B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。
B帧特点:

  • B帧是由前面的I或P帧和后面的P帧来进行预测的。
  • B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量。
  • B帧是双向预测编码帧。
  • B帧压缩比最高,因为它只反映2参考帧间运动主体的变化情况,预测比较准确。
  • B帧不是参考帧,不会造成解码错误的扩散。

P帧和B帧编码的基本流程为:

  1. 进行运动估计,计算采用帧间编码模式的率失真函数(节)值。P 帧 只参考前面的帧,B 帧可参考后面的帧。
  2. 进行帧内预测,选取率失真函数值最小的帧内模式与帧间模式比较,确定采用哪种编码模式。 计算实际值和预测值的差值。
  3. 对残差进行变换和量化。
  4. 若编码,如果是帧间编码模式,编码运动矢量。

        请注意:I、B、P各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧,至于图像中的哪一帧是I帧,是随机的,一但确定了I帧,以后的各帧就严格按规定顺序排列。

6. GOP

        GOP(Group Of Pictures, 图像组)是一组连续的图像,由一个I帧和多个B/P帧组成,是编解码器存取的基本单位。GOP结构常用的两个参数M和N,M指定GOP中首个P帧和I帧之间的距离,N指定一个GOP的大小。例如M=1,N=15,GOP结构为:IPBBPBBPBBPBBPB,GOP有两种:

  • 开放式GOP:开放式GOP中的B帧解码时可能要用到其前一个GOP或后一个GOP的某些帧。码流里面包含B帧的时候才会出现开放式GOP。
  • 闭合式GOP:闭合式GOP只需要参考本GOP内的图像即可,不需参考前后GOP的数据。这种模式决定了,闭合式GOP的显示顺序总是以I帧开始以P帧结束。

        开放式GOP和闭合式GOP中I帧、P帧、B帧的依赖关系如下图所示:
视频编解码概念_第3张图片

7. DTS和PTS

  • DTS(Decoding Time Stamp, 解码时间戳),表示packet的解码时间。
  • PTS(Presentation Time Stamp, 显示时间戳),表示packet解码后数据的显示时间。

        音频中DTS和PTS是相同的。视频中由于B帧需要双向预测,B帧依赖于其前和其后的帧,因此含B帧的视频解码顺序与显示顺序不同,即DTS与PTS不同。当然,不含B帧的视频,其DTS和PTS是相同的。下图以一个开放式GOP示意图为例,说明视频流的解码顺序和显示顺序。
视频编解码概念_第4张图片

  • 采集顺序:指图像传感器采集原始信号得到图像帧的顺序。
  • 编码顺序:指编码器编码后图像帧的顺序。存储到磁盘的本地视频文件中图像帧的顺序与编码顺序相同。
  • 传输顺序:指编码后的流在网络中传输过程中图像帧的顺序。
  • 解码顺序:指解码器解码图像帧的顺序。
  • 显示顺序:指图像帧在显示器上显示的顺序。

        采集顺序与显示顺序相同,编码顺序、传输顺序和解码顺序相同。
        图中“B[1]”帧依赖于“I[0]”帧和“P[3]”帧,因此“P[3]”帧必须比“B[1]”帧先解码。这就导致了解码顺序和显示顺序的不一致,后显示的帧需要先解码。

8. 实际应用

        从上面的解释看,我们知道I和P的解码算法比较简单,资源占用也比较少,I只要自己完成就行了,P呢,也只需要解码器把前一个画面缓存一下,遇到P时就使用之前缓存的画面就好了,如果视频流只有I和P,解码器可以不管后面的数据,边读边解码,线性前进,大家很舒服。
        但网络上的电影很多都采用了B帧,因为B帧记录的是前后帧的差别,比P帧能节约更多的空间,但这样一来,文件小了,解码器就麻烦了,因为在解码时,不仅要用之前缓存的画面,还要知道下一个I或者P的画面(也就是说要预读预解码),而且,B帧不能简单地丢掉,因为B帧其实也包含了画面信息,如果简单丢掉,并用之前的画面简单重复,就会造成画面卡(其实就是丢帧了),并且由于网络上的电影为了节约空间,往往使用相当多的B帧,B帧用的多,对不支持B帧的播放器就造成更大的困扰,画面也就越卡。
         一般平均来说,I的压缩率是7(跟JPG差不多),P是20,B可以达到50,可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。
视频编解码概念_第5张图片
        在如上图中,GOP (Group of Pictures)长度为13,S0~S7 表示 8个视点,T0~T12 为 GOP的 13个时刻。每个 GOP包含帧数为视点数 GOP 长度的乘积。在该图中一个 GOP 中,包含94 个 B帧。B 帧占一个 GOP 总帧数的 90.38%。GOP 越长,B 帧所占比例更高,编码的率失真性能越高。下图测试序列 Race1 在不同 GOP 下的率失真性能对比。
视频编解码概念_第6张图片

你可能感兴趣的:(音视频)