视频压缩相关概念介绍-IPB与GOP

x33g5p2x  于2021-11-18 转载在 Go  
字(7.6k)|赞(0)|评价(0)|浏览(607)

摘要

  1. 视频为什么要压缩?有哪几种压缩方式?都有什么特点?
  2. IPB是啥意思?哪些是基准帧,哪些是参考帧(差别帧)?
  3. I帧、B帧以及P帧的编码序列和显示序列一样吗?
  4. 视频编码的基本的单位是啥?为什么要按GOP进行编解码?
  5. IDR帧和I帧之间的关系是什么,有什么区别?

一. 基本概念

  1. 压缩及其分类
    压缩是清除多余信息以减少数字信号中的数据的过程。这种处理不但降低了传输数据所需要的带宽,而且减少了存储数据所需要的存储空间。进一步地,降低所需带宽可以在同一时间内传输更多的数据,提升视频质量和观感体验。
    视频的压缩方式可以归为两类:无损压缩有损压缩。无损压缩的特征是完整重建包含在原始影像中所有的原始数据。比如,文档压缩就是一种无损压缩,压缩后的文档在内容上必须和原始文档一模一样,而不能近似。但是在视觉世界中,无损压缩会使影像包含大量的重复信息,其压缩率一般为2~5。无损压缩广泛用于文本数据,程序和特殊应用场合的图像数据(如指纹图像,医学图像等)的压缩。
    有损压缩的特征是重建影像近似于原始影像,但不是完全复制原始影像,可以对视频进行有效压缩。当重建或者解压缩一个有损影像,不是所有压缩过程中被忽略的数据都会被完全恢复,也就是说这个过程是有损可逆的。为了让可见的数据损失最小,有损压缩技术通常压缩影像中人眼较不敏感的部分,或者包含较少重要影像数据的部分。
  2. 压缩的基本手段
    视频文件通常包含多余信息,这些信息可用来降低数据的存储量。通过比较一帧之内(帧内)和若干帧之间(帧间)的差异可以实现这一点,而不必存储每一帧的全部信息。帧内(Intraframe)压缩也称为空间压缩(Spatial compression),利用的是空间冗余或者说帧内空间的重复数据来定义可以丢弃的数据。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,达不到很高的压缩比。
    帧间压缩(Interframe compression)也称为时间压缩(Temporal_compression),是基于许多视频或动画的连续前后两帧具有很大的相关性(即连续的视频其相邻帧之间具有冗余信息)的特点来实现的。时间相关性的统计分析结果表明,在间隔1~2帧的图像中,各像素只有10%以下的点其亮度差值变化超过2%,而色度差值的变化只有1%以下(人类对亮度的敏感度高于色度,因此视频一般采用YUV模型进行编码,提高压缩率,具体见《音视频处理入门基础知识》)。通过比较时间轴上不同帧之间的数据采用差值编码和运动补偿等方式实施压缩,提高压缩比。一般采用有损压缩。
    视频压缩中,每帧代表一幅静止的图像。而在实际传输视频流中,我们会想尽办法通过各种算法来减少数据的容量,这里最为常见的为IPB(Intracoded frames, Predicted pictures, and Bi-directional predictive pictures)。简单地说,I帧是关键帧,属于帧内压缩。P帧和B帧都是基于I帧来压缩数据,即属于帧间压缩,P是向前搜索的意思,B是双向搜索的意思。
  3. I帧,P帧,B帧
    I帧表示关键帧,你可以理解为这一帧画面的完整保留,解码时只需要本帧数据就可以完成(因为包含完整画面);
    P帧是单向差别帧,表示的是这一帧跟之前的一个关键帧或P帧的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别即可生成最终画面。也就是说,P帧是一个差别帧,没有完整的画面数据,只包含与前一帧画面差别的数据;
    B帧是双向差别帧,也就是说,B帧记录的是本帧与前后帧的差别。换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧的压缩率最高,但是解码时CPU会比较累(很耗费算力)~。
    总之,采用的压缩方法主要包括:
    a. 定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;
    b. 预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;
    c. 数据传输:最后将I帧数据与预测的差值信息进行存储和传输。

二. I帧

I帧是靠尽可能去除图像空间冗余信息来压缩传输数据量的帧内编码图像。I帧又称为内部画面 (intra picture),通常是每个GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩(做为随机访问的参考点)可以当成图象。在MPEG编码的过程中,部分视频帧序列压缩成为I帧,部分压缩成P帧,还有部分压缩成B帧。I帧法是帧内压缩法,也称为“关键帧”压缩法。I帧是基于离散余弦变换DCT(Discrete Cosine Transform)的压缩技术,这种算法与JPEG压缩算法类似。采用I帧压缩可达到压缩比6而无明显的压缩痕迹。

  1. I帧的特点
    a. 它是一个全帧压缩编码帧,将全帧图像信息进行JPEG压缩编码及传输;
    b. 解码时仅用I帧的数据就可重构完整图像;
    c. I帧描述了图像背景和运动主体的详情;
    d. I帧不需要参考其他画面而生成;
    e. I帧是P帧和B帧的参考帧,其质量直接影响到同组中以后各帧的质量;
    f. 一般地,I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
    h. I帧所占数据的信息量比较大。
  2. I帧编码流程
    a. 进行帧内预测,决定所采用的帧内预测模式;
    b. 像素值减去预测值,得到残差;
    c. 对残差进行变换和量化;
    d. 变长编码和算术编码;
    e. 重构图像并滤波,得到的图像作为其它帧的参考帧。

三. P帧

P帧是通过充分降低图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫 预测帧。在针对连续动态图像编码时,将连续若干幅图像分成P/B/I三种类型,P帧由在它前面的P帧或者I帧预测而来,它比较与它前面的P帧或者I帧之间的相同信息或数据,也即考虑运动的特性进行帧间压缩。P帧法是根据本帧与相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据。采取P帧和I帧联合压缩的方法可达到更高的压缩且无明显的压缩痕迹。

  1. P帧的预测与重构
    P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。
  2. P帧特点
    a. P帧是I帧后面相隔1-2帧的编码帧;
    b. P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);
    c. P帧属于前向预测的帧间编码,它只参考前面最靠近它的I帧或P帧;
    d. P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;
    e. 由于P帧是参考帧,它可能造成解码错误的扩散;
    f. 由于是差值传送,P帧的压缩比较高。

四. B帧

B帧是既考虑源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧。B帧法是双向预测的帧间压缩算法。当把一帧压缩成B帧时,它根据相邻的前一帧、本帧以及后一帧数据的不同点来压缩本帧,也即仅记录本帧与前后帧的差值。只有采用B帧压缩才能达到200的高压缩比。一般地,I帧压缩效率最低,P帧较高,B帧最高。

  1. B帧的预测与重构
    B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。
  2. P帧特点
    a. B帧是由前面的I或P帧和后面的P帧来进行预测的;
    b. B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
    c. B帧是双向预测编码帧;
    d. B帧压缩比最高,因为它只反映两参考帧间运动主体的变化情况,预测比较准确;
    e. B帧不是参考帧,不会造成解码错误的扩散。
  3. P帧和B帧编码的基本流程
    a. 进行运动估计,计算采用帧间编码模式的率失真函数(节)值。P帧只参考前面的帧,B帧可参考后面的帧;
    b. 进行帧内预测,选取率失真函数值最小的帧内模式与帧间模式比较,确定采用哪种编码模式;
    c. 计算实际值和预测值的差值;
    d. 对残差进行变换和量化;
    e. 若编码,如果是帧间编码模式,编码运动矢量。

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

五. IPB帧的显示序与编码序

I帧采用帧内预测编码,仅仅使用前一个基准帧来编码的帧被称为P帧,同时使用前一个显示帧和未来帧作为基准帧进行编码的帧称为B帧 (注,只有I帧和P帧才是基准帧/参考帧)。在通常的场景中,编解码器编码一个I帧,然后向前跳过几个帧,用编码I帧作为基准帧对一个未来P帧进行编码,然后跳回到I帧之后的下一个帧。编码的I帧和P帧之间的帧被编码为B帧。之后,编码器会再次跳过几个帧,使用第一个P帧作为基准帧编码另外一个P帧,然后再次跳回,用B帧填充显示序列中的空隙。这个过程不断继续。 P帧由前一个I帧或P帧图像来预测,而B帧由前后的两个P帧或一个I帧和一个P帧来预测,因而编解码和帧的显示顺序有所不同,如图1所示。同样,图2以更清晰的方式说明了I帧P帧和B帧的编码序显示序之间的区别。
                I B B P B B P…B B I   I P B B P B B … I B B
                1 2 3 4 5 6 7 …     1 4 2 3 7 5 6 …
                (a) 显示顺序      (b) 编解码顺序
                   图1 IPB帧编码序和显示序
              

通常,更换场景后的第一帧就是I帧,I帧应当全帧传送。 从压缩的程度来看,I画面的压缩量最少;P画面次之,它是以I画面为基础;B画面压缩最多。为了加大压缩比,通常在I帧后面相隔2帧(最多3帧)设置1个P帧,在I、P帧之间都是B帧,在两个P帧之间也是设置2~3帧B帧。B帧传送它与I帧或P帧之间的差值信息,或者P帧与后面P帧或I帧之间的差值信息,或者它与前后I、P帧或P、P帧平均值之间的差值信息。当主体内容变化愈大时,两个I画面之间的帧数值越小;当主体内容变化小时,I面画的间隔可以适当大一些。 或者说,B帧、P帧所占比例越大,图像压缩比越高。
下面以15帧为例,说明VCD图像帧的排列顺序。I、P、B三种画面的典型设置方式,对NTSC制共约需半秒时间。节目输入顺序是按实际出现顺序排列的,即I、B、B、P、B、B、P、B、B、I、B、B、P;但为了解码时便于从I、P画面插补得到B画面,在编码录制节目时,将顺序改变了,即按照I、P、B、B顺序,即改为按原来0、3、1、2、6、4、5、9、7、8的画面顺序。解码时先解出0帧、3帧,再由其插补预测计算得出1帧、2帧等等。为此,须在解码器内设置动态存储器,将I、P帧先解码并存储,再计算出各个B帧。不过最后输出时,还是应当按照实际播放顺序重组读出,按正确顺序输出。

DTS、PTS 的概念
  • DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据;
  • PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。

需要注意的是,虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时,就回到了我们前面说的问题:解码顺序和播放顺序不一致了。比如一个视频中,帧的显示顺序是:I B B P,现在我们需要在解码 B 帧时知道 P 帧中信息,因此这几帧在视频流中的顺序可能是:I P B B,这时候就体现出每帧都有 DTS 和 PTS 的作用了。DTS 告诉我们该按什么顺序解码这几帧图像,PTS 告诉我们该按什么顺序显示这几帧图像。 顺序大概如下:
Stream: I P B B
PTS: 1 4 2 3
DTS: 1 2 3 4

六. GOP

视频的编码(压缩)是按照“组”来进行的,每一个组叫作GOP(Group of Picture,图像组),表示一组连续的画面。通常意义上的GOP由I帧开始,到下一个I帧之前的帧结束(严格意义上讲,GOP由IDR帧开始,到下一个IDR帧之前的帧结束,这种情形下一个GOP中会有多个I帧。不过,一般而言,I帧基本上都是IDR帧。)。 GOP与GOP之间是没有联系的,编码关系只在GOP之间产生。每一个GOP必须由关键帧开始和结束,以保证其作为围绕它的B帧和P帧的参考。一个GOP在I帧之间可以只包含P帧,也可以B帧和P帧都包含。关键帧是一幅完整的画面,GOP中间的帧都是不完整的,需要由关键帧、前面帧以及后面帧等一起运算得到。关键帧的间隔调节会影响GOP的长度,进而影响到读取GOP的速度,为防止运动变化,一个GOP组内帧数不宜取多。如果关键帧的间隔设置过大的话(GOP长度过大),在必须用到关键帧的场合就可能被迫使用B/P帧来代替,这就会降低画面质量。关键帧是帧间压缩的基础,典型的GOP(IBP帧包)结构一般是:IBBPBBPBBPBBPBBPBB。这时假设I帧损坏,那么整个GOP结构就坏掉了,即IBBPBBPBBPBBPBBPBB这么多帧一起坏掉,因此设置过长的间隔也会导致编码出来的东西不稳定。理论上,一个GOP组内的所有帧独立于其之前的GOP及其后面的GOP。但是在实际应用中,为了得到更大的压缩比,出现的Open GoP和Closed GoP之分:

  • Closed GOP:传统意义的GOP,即一个GOP内的所有帧不能依赖该GOP之前或者之后的GOP,只能依赖该GOP内的帧;
  • Open GOP:GOP以1个或多个B帧开始,这些B帧参考前一个GOP最后的P帧和当前GOP的第一个I帧进行编码,也可认为这些B帧是前一个GOP不以P帧结尾,而是以B帧结尾,这些B帧参考所在GOP的最后一个P帧及下一个GOP的起始I帧进行编码。总之,Open GOP相比于Closed GOP扩展出1个或者多个B帧,具有更高的压缩率。
    图3说明了Open GOP和Closed GOP之间的区别。 
               
IDR(Instantaneous Decoding Refresh)

IDR帧全称叫做Instantaneous Decoder Refresh,是I帧的一种。它的作用是立刻刷新,重新算一个新的序列开始编码,使错误不致传播,而I帧不具有随机访问的能力。准确的说,IDR会导致DPB(DecodedPictureBuffer 参考帧列表)清空,而I不会。也就是说,解码到当前帧,解码器就可以把缓存全清了——之前的所有帧信息都没用了;后续帧不会再去参照它们。 比如,第1000帧是IDR帧,那么这一帧相当于一个分水岭,从1001帧开始,所有的帧都不能再参照1000帧之前的帧。在closed GOP规定下0~999帧也不允许参照这个IDR帧以及之后的帧。等于说IDR帧将视频分割成两个独立的部分:前面的(closed GOP规定下)不能参照后面的,后面的不能参照前面的。 这个性质在播放的时候额外有用:如果我直接从第1000帧开始播放,我可以毫无问题的播放下去,因为我不需要 参照1000帧之前的内容完成解码。我从开头播放,直到999帧的时候,我都不需要参照1000帧及它后面的东西; 1000帧之后的数据都损坏了,0~999帧也能正常播放。

  1. IDR帧特性
    a. IDR帧一定是I帧,严格来说I帧不一定是IDR帧(但一般I帧就是IDR帧);
    b. 对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容。与此相反,对于普通的I帧来说,位于其之后的B和P帧可以引用位于普通I帧之前的I帧(普通I帧有被跨帧参考的可能);
    c. 播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。因此,视频开头的I帧一定是IDR帧;

七. 实际应用

从上面的解释看,我们知道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帧,这样在相同码率下,可以提供更好的画质。
           

在如上图中,GOP (Group of Pictures)长度为13,S0~S7 表示 8个视点,T0~T12 为 GOP的 13个时刻。每个 GOP包含帧数为视点数 GOP 长度的乘积。在该图中一个 GOP 中,包含94个B帧(GOP 总帧数=13*8=104)。B 帧占一个 GOP 总帧数的 90.38%。GOP 越长,B 帧所占比例更高,编码的率失真性能越高。下图测试序列 Race1 在不同 GOP 下的率失真性能对比。
          

引用

视频中的关键帧,https://blog.csdn.net/cds9527/article/details/53302683
视频流中的 I帧 P帧 B帧,https://blog.csdn.net/qq_15807167/article/details/52343570
数字视频编码IPB帧编码序列,显示序列及GoP相关知识,https://www.cnblogs.com/wangyujoy/archive/2012/12/12/2814803.html
H.264中普通I帧和IDR帧究竟有什么区别,https://blog.csdn.net/Liu1314you/article/details/77185215
H2.64中I帧和IDR帧的区别(转),https://blog.csdn.net/heanyu/article/details/6255111
I帧和IDR帧,https://blog.csdn.net/dancing_night/article/details/46004693
音视频中GOP、 PTS 和 DTS,https://blog.csdn.net/lipengshiwo/article/details/79160316

相关文章