之所以写这篇文章是因为有朋友对IPB帧的设置比较感兴趣,回复中说得比较简单,因此在这里详细的写一下,虽然说一般情况下我们很少去设置这个IPB帧,不过,如果真的学好了,并且清楚的了解了这个IPB帧的概念和设置后,我们能够在渲染成品的时候更加好的掌控视频的质量与体积。

在说怎么设置之前,我们先了解一下IPB帧的概念,网络上其实蛮多的,我这里稍微做一点自己的改变和理解,这样更加方便我们理解。

首先说到IPB帧,就不得不说一下帧内压缩和帧间压缩:关于压缩,我想不需要做更多的解释,简单点,就是为了在保证我们可以接受的质量前提下,尽可能缩小原始音视频的体积,这样的一个过程就是压缩。

帧内压缩(Intraframe compression),也称之为空间压缩。就是指在压缩时,只计算单帧画面内的信息,不考虑前后帧的关联,单帧压缩会丢掉该帧内无用的信息或者根据设置,丢掉更多我们认为不重要的画面信息,因此,相对而言,帧内压缩可以极大程度保留画面清晰度、色彩范围以及其他信息。同时,因为帧内压缩是对单帧画面的完整压缩,不牵涉到其他相邻的帧画面,因此在播放器解码时,所需要消耗的资源也是比较小的。因为其不考虑与其他帧的冗余信息,因此,和我们一般常用的静态图像压缩类似,属于有损压缩。

帧间压缩(Interframe compression),也称之为时间压缩。是指在压缩时,需要计算相邻帧之间的画面信息差异,即在相邻的单帧画面中,会存在冗余信息,压缩这些冗余信息就可以进一步提高压缩量,减少压缩比。采用帧间压缩的方式,就是专门用于处理连续图像的一种编码压缩,这样的压缩,会导致画面信息更多的丢失,但是,却可以极大的减小音视频文件的体积,所以,我们现在大部分使用的压缩编码,都是以帧间压缩为主,帧内压缩为辅的方式。

那么,提到了帧间压缩,我们就会牵涉到最常见的IPB帧的概念:
I帧表示关键帧,I帧画面完整保留,只采取帧内压缩,解码时只需要本帧数据就可以完成(因为包含完整画面)。
P帧是向前预测编码帧(也叫差别帧),表示这一帧跟之前的一个关键帧(或P帧)的差别,P帧没有完整画面数据,只有与前一帧的画面差别的数据,因此解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。
B帧是双向预测编码帧(双向差别帧),B帧记录的是当前帧与前后帧的差别,换言之,解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。


其中P帧与B帧的压缩都基于I帧,显而易见B帧压缩率最高,但是解码时CPU会不断的进行前后帧的对比,因此会消耗大量的系统资源。

我们经常会在摄像机或者记录下的视频文件中看到自己拍摄视频所采用的压缩算法,常见的有All-I,以及IPB。
如果视频流只采用了All-I压缩(全部帧都是I帧关键帧),那么解码器可以不管后面的数据,边读边解码,线性前进。如果视频流压缩采用了IPB,有B帧,则需要缓存前面和当前的视频帧,待后面视频帧获得后,再进行解码。

在当前的网络流媒体中,为什么很多网络直播会有延时,很大程度上就是因为IPB的压缩算法,在网络条件较好的地区,延时会少很多,或许只有几秒钟,网络条件差的地方,以及计算机配置不太好的服务器和播放端,延迟的时间就会比较长。

说了以上那么多,相信有的人已经一头雾水了,其实关于IPB帧,他们自己还有很多专属的特点,这里不一一赘述。接下来,我们引入一个概念:GOP(帧组)。

简单的理解GOP就是两个I帧之间的间隔。
我们可以打一个比方,假设我们现在有一个每秒15帧,时长3秒的动画视频,我们设定第一帧为I帧关键帧,设定第15帧为P帧差别帧,那么,中间第2帧~第14帧则为B帧双向差别帧。这总共15帧就组成了一个GOP帧组,也即是说,这个时长3秒的动画视频,一共有3个GOP。
在流媒体服务器上,都会设定是否在客户请求时直接将缓存数据发送给客户,还是等到有I帧的时候再发送。如果设定的是有I帧的时候发送,那么播放客户端只有在获得I帧后才会有完整的视频流,客户端缓冲时间较长,但是延迟至少是一个GOP,套用刚才的例子就是1秒。如果直接发送,不等I帧,客户端得到的画面会残缺,但是延迟则较低。

当然,实际的情况中我们可以自行设定多少才是一个完整的GOP,一般情况下,一个GOP,短的可以设置5~6秒钟,即第1帧为I帧,第5帧为P帧,2、3、4帧为B帧,那么在这样的设置下,我们即可以得到一个压缩比较高,但是画面信息也相对更完整的视频流。

我这里使用Vegas中的Mpeg-2的IPB帧设置来进行参考。(其他的编码虽然在Vegas中没有IPB帧的设置,但并非不存在,只是因为IPB是Mpeg-2的标准压缩方式)
<ignore_js_op>总结:
现在我们做片子,已经很少会牵涉到IPB帧的设置了一般默认就可以,而恒定码率和动态码率的设置,根据现在的全国网速来看,其实也已经没有太大的关系。当年网络流媒体需要设置动态码率,是因为带宽普遍只有2M甚至更低,而这个参数在如今的网速面前,其实已经没有什么必要,因此,一般采用默认的IPB,恒定码率,就已经可以满足在线视频的高清流畅播放了。

 

转载自:

  [原创] 关于IPB帧与恒定比特率、动态比特率的详解

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-13
  • 2021-09-14
猜你喜欢
  • 2022-02-10
  • 2022-12-23
  • 2021-09-22
  • 2021-07-06
  • 2021-11-26
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案