什么是B帧、I帧、P帧

来源:互联网 发布:数据魔方招聘 编辑:程序博客网 时间:2024/04/30 11:06

简单来说,视频压缩时,其实是把每帧当作一幅静止图像压缩,这个大家应该不会有问题。

在实际压缩时,会采取各种算法减少数据的容量,其中I帧、P帧、B帧就是最常见的。

I表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)
P表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)

如果你明白P的意思,那么B就比较好理解了。

B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,但我这样说简单些,有兴趣可以看看我上面提供的资料),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。

下图比较好地解释了IPB的关系,留意箭头表示解码这个帧时需要的其他帧提供的数据。
[attach]4782[/attach]

最后就是讨论了。

从上面的解释看,我们知道I和P的解码算法比较简单,资源占用也比较少,I只要自己完成就行了,P呢,也只需要解码器把前一个画面缓存一下,遇到P时就使用之前缓存的画面就好了,如果视频流只有I和P,解码器可以不管后面的数据,边读边解码,线性前进,大家很舒服。

但网络上的电影很多都采用了B帧,因为B帧记录的是前后帧的差别,比P帧能节约更多的空间,但这样一来,文件小了,解码器就麻烦了,因为在解码时,不仅要用之前缓存的画面,还要知道下一个I或者P的画面(也就是说要预读预解码),而且,B帧不能简单地丢掉,因为B帧其实也包含了画面信息,如果简单丢掉,并用之前的画面简单重复,就会造成画面卡(其实就是丢帧了),并且由于网络上的电影为了节约空间,往往使用相当多的B帧,B帧用的多,对不支持B帧的播放器就造成更大的困扰,画面也就越卡。

回顾M6/M3,就是不支持B帧的,(大家可以看我n年前的有关帖子),所以有些朋友会发现有些片子转换后反而大了,其中一个原因就是P帧和I帧没有B帧那么节约空间。

一般平均来说,I的压缩率是7(跟JPG差不多),P是20,B可以达到50,可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。

 

 

B 帧在 MPEG-4 中有四种参考模式,如果是同时参考前后的画面压缩,
则记录的是 和 (前画面 pixel 值 + 后画面 pixel 值)/2 的差值,
也就是 和 「前后画面的平均」的差值。
所以记录的差值个数和 P 帧一样,只有一个,没有增加。
而因为 B 帧位于前后画面的中间,以「前后画面的平均」,也就是「前后画面的中间值」
来作为预测数值(预测 B 帧的 pixel 数值为多少?如果有误差,再记录差值),
这样这个预测数值会比单独使用前一个画面来预测,更接近目前真正的 B 帧的数值,
可想而知,如此所需要记录的差值就会很小甚至可以根本不用记录,
所以便可以省下很多的 bits,提高压缩率。
例如
亮度变化 ->
I B P
7 8 9
如果 B 只参考前一个画面压缩,则需记录差值 1。
如果以 (I + P)/2 压缩,则差值为 0,不需记录差值。
(虽然要记录两个矢量,不过矢量也可以再做进一步预测压缩,总的来说,
还是会比单独参考前一个画面压缩来得小很多)
如果画面不是这样变化怎么办?通常来讲画面都会是这样变化,
如果不是这样变化我们就不使用 B 帧
就算变化不是如此规则,换个方式想,B 帧可以参考的画面还是比 P 帧多,
再怎么找,也还是 B 帧可以找到误差更小的方块来使用的机率大
(因为可以选择、参考的对象较多),所以 B 帧还是比 P 帧的压缩率来得高。
(而且高很多,差距非常大)
除了压缩率以外,B 帧对画质的影响.....
是有的,因为 B 帧这种参考前后画面的特性,等于有内插(interpolation)的效果,所以可以减少噪讯。
MPEG-4 中的 B 帧,也是非常具有威力的,除了以前的三种参考模式,
还有 Direct Mode,连矢量的纪录都省了。
虽然 MPEG-4 之中有 4MV 的功能,可以记录四个矢量,不过编码器在压缩的时候会判断,
到底是使用 4MV 压出来的结果小,还是使用传统的方法压出来的结果小?
如果使用传统的方法压出来的结果小,便使用传统的方法记录,
如果使用 4MV 压出来的结果小,才使用 4MV 来记录。
(ps. 4MV 不会用在 backward 预测)
您可以观察 VirtualDub 压缩时画面上显示的蓝线,您会发现蓝线和蓝线之间通常会有很短的
蓝线插在中间,造成空隙,而且差距很大,这个就是夹在 P 之间的 B 在发挥压缩威力
如果是用 DivX 5 更明显,因为 DivX 5 只能够使用 IBPBPBPB... 这种一个 B 接一个 P 的形式,
所以画面上的蓝线就是「一长一短、一长一短」这样排列。

 

 

 

IDR可以看这个帖子:http://www.movie007.com/thread-23320-1-1.html
译注:
按照原文恐怕不太容易理解,这里译者以自己的理解来讲解一下IDR 帧。举个例子,在一段视频中,
存在以下帧:I P B P B P B B P I P B…
如果这段视频应用了多重参照帧,那么蓝色的P 帧在参照他前面的I 帧(红色)的同时,还可能会参
照I 帧之前的P 帧(绿色),由于I 帧前后的场景可能会有很大的反差甚至根本不同,所以此时P 帧参考I
帧之前的帧不但会没有意义,反而会造成很多问题。
所以一种新型的帧被引入,那就是IDR 帧。如果这段视频应用了多重参考帧的同时采用了IDR 帧,那
么帧的顺序就会变成这样:I P B P B P B B P IDR P B…
由于IDR 帧禁止后面的帧向自己前面的帧参照,所以这回那个蓝色的P 帧就不会参照绿色的P 帧了。


转自http://www.movie007.com/viewthread.php?action=printable&tid=23328