视频编码中的I帧,P帧和B帧以及IDR帧

资料转自http://blog.sina.com.cn/s/blog_9ac492410100y6zc.html


MPEG图像编码包含3个成分:I帧,P帧和B帧。MPEG编码过程中,一些图像压缩成I帧,一些压缩成P帧,另一些压缩成B帧。I帧压缩可以得到61的压缩比而不产生任何可觉察的模糊现象。I帧压缩的同时使用P帧压缩,可以达到更高的压缩比而无可觉察的模糊现象。B帧压缩可以达到2001的压缩比,其文件尺寸一般为I帧压缩尺寸的15%,不到P帧压缩尺寸的一半。I帧压缩去掉图像的空间冗余度,P帧和B帧去掉时间冗余度,下文将进一步解释。

        I帧压缩采用基准帧模式,只提供帧内压缩,即把帧图像压缩到I帧时,仅仅考虑了帧内的图像。I帧压缩不能除去帧间冗余度。帧内压缩基于离散余弦变换(DCT),类似于JPEGH.261图像中使用DCT的压缩标准。

           P帧采用预测编码,利用相邻帧的一般统计信息进行预测。也就是说,它考虑运动特性,提供帧间编码。P帧预测当前帧与前面最近的I帧或P帧的差别。
B
帧为双向帧间编码。它从前面和后面的I帧或P帧中提取数据。B帧基于当前帧与前一帧和后一帧图像之间的差别进行压缩。

           MEPG数据流开始时对CCIR-601规定的SIF分辨率的未压缩数字图像进行抽样。SIF分辨率,对于NTSC制,就是亮度信号为352240各像素,每个色度信号都为176120个象素。各信号都是每秒30帧。MPEG压缩器决定了当前帧以I帧,P帧还是B帧。帧确定之后就采用DCT变换,对结果进行量化,舍入,行程编码即变长编码。编码后的典型图像帧序为:IBBPBBPBBPBBIBBPBBPBBPBBI…

         B帧和P帧要求计算机有更强的功能。有些压缩器不能产生B帧或者连P帧也不能产生,则图像的压缩结果将有很明显的间断。

DR帧属于I帧,但是I帧不一定是IDR帧。解码器收到IDR帧时,将驱动器参数块(DPB)清空。而I帧不会。(我自己理解为即把参考帧列表刷新从新更新,就是不再参考idr前面的帧)由此可见,在编码器端,每发一个IDR,就相应地发一个nal。当然在现在的编码中,为了取得更高的图像质量,在一个视频文件中有好多个IDR帧,这些IDR帧把视频文件分成了片,但是每片中第一个帧是IDR,而且仅此一个

例如:存在这样一段视频:

码流 

 IDR 

   B

   B   

   P   

   B   

   B   

   P   

……

帧号

   1

   2   

   3

   4

   5

   6

   7

……

IDR帧的处理(I帧的处理相同)(1) 进行帧内预测,决定所采用的帧内预测模式。(2) 像素值减去预测值,得到残差。(3) 对残差进行变换和量化。(4) 变长编码和算术编码。(5) 重构图像并滤波,得到的图像作为其它帧的参考帧。

这里要提一下,当编码器处理完IDR帧遇到B帧时,编码期先把其放入缓存器中存放起来。直接对P进行编码。即编码器中编码的实际顺序是IDR P B B P B B…..1423756……

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

P:前向预测编码帧。
P帧的预测与重构:P帧是以I帧为参考帧,I帧中找出P某点的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P某点的预测值并与差值相加以得到P某点样值,从而可得到完整的P帧。

P帧特点:

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

B:双向预测内插编码帧。
B帧的预测与重构
B帧以前面的IP帧和后面的P帧为参考帧,“找出”B某点的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中找出(算出)”预测值并与差值求和,得到B某点样值,从而可得到完整的B帧。

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

 

例如
亮度变化 ->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 的形式,所以画面上的蓝线就是「一长一短、一长一短」这样排列。

 

I 帧与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 帧了。


你可能感兴趣的:(音视频编解码相关)