原文地址: http://www.cnblogs.com/ManMonth/archive/2010/02/09/1666328.html
I-P-B frame简介
三种帧类型
——I-frame的缩写,即关键帧。关键帧是构成一个帧组(GOP,Group of Picture)的第一个帧。IF保留了一个场景的所有信息。压缩比为1:7。
——P-frame的缩写,即未来单项预测帧,只储存与之前一个已解压画面的差值。压缩比为1:20。
——B-frame的缩写,即双向预测帧,除了参考之前解压过了的画面外,亦会参考后面一帧中的画面信息。压缩比为1:50。
(在 MPEG-4 里面正确的名称是 B-VOP)的
- a. Forward 顺向预测,参考前一张画面,记录和前一张画面的差距。和 P-Frame 的预测方法一样。
- b. Backward 逆向预测,参考下一张画面,记录和下一张画面的的差距。
- c. Bi-Directionally 双向预测,参考前面和后面两张画面,记录的是和「前后两张画面的平均值」的差距。也叫做内插预测,压缩率最高。
- d. Direct Mode,不搜寻、纪录动作向量,直接由下一张的 P Frame推导出动作向量。譬如说 I B P,我们可以预测 B画面的动作必然是介于 I 和 P 两个画面之间,所以我们可以直接用 P 的 MV/2 作为B 的动作向量,这样可以省去记录 MV 的空间。
压缩 B-Frame 的时候会从上面几种预测模式中选压出来最小的一个模式来使用。
MPEG-2图像压缩的原理是利用了图像中的两种特性:空间相关性和时间相关性。这两种相关性使得图像中存在大量的冗余信息。如果我们能将这些冗余信息去除,只保留少量非相关信息进行传输,就可以大大节省传输频带。而接收机利用这些非相关信息,按照一定的解码算法,可以在保证一定的图像质量的前提下恢复原始图像。一个好的压缩编码方案就是能够最大限度地去除图像中的冗余信息。
MPEG-2的编码图像被分为三类,分别称为I帧,P帧和B帧。
- I帧图像采用帧内编码方式,即只利用了单帧图像内的空间相关性,而没有利用时间相关性。
- P帧和B帧图像采用帧间编码方式,即同时利用了空间和时间上的相关性。
- P帧图像只采用前向时间预测,可以提高压缩效率和图像质量。
- P帧图像中可以包含帧内编码的部分,即P帧中的每一个宏块可以是前向预测,也可以是帧内编码。
- B帧图像采用双向时间预测,可以大大提高压缩倍数。
I,B,P frame
B帧
B帧(B frame)
基本概念
B帧法是双向预测的帧间压缩算法。当把一帧压缩成B帧时,它根据相邻的前一帧、本帧以及后一帧数据的不同点来压缩本帧,也即仅记录本帧与前后帧的差值。只有采用B帧压缩才能达到200:1的高压缩。
B帧的模式
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 的形式,所以画面上的蓝线就是「一长一短、一长一短」这样排列。
关键帧和过渡帧的联系与区别
1、两个关键帧的中间可以没有过渡帧(如逐帧动画),但过渡帧前后肯定有关键帧,因为过渡帧附属于关键帧;
2、关键帧可以修改该帧的内容,但过渡帧无法修改该帧内容。
3、关键帧中可以包含形状、剪辑、组等多种类型的元素或诸多元素,但过渡帧中对象只能是剪辑(影片剪辑、图形剪辑、按钮)或独立形状。 图像(帧)是靠尽可能去除图像空间冗余信息来压缩传输数据量的帧内编码图像; P图像(帧)是通过充分将低于图像序列中前面已编码帧的是间冗余信息来压缩传输数据量的编码图像,也叫预测帧; B图像(帧)是既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧;一般地,I帧压缩效率最低,P帧较高,B帧最高。
mpeg4视频中,I帧、p帧、B帧的判定
mpeg4的每一帧开头是固定的:00 00 01 b6,那么我们如何判断当前帧属于什么帧呢?在接下来的2bit,将会告诉我们答案。注意:是2bit,不是byte,下面是各类型帧与2bit的对应关系:
- : I Frame
- : P Frame
- : B Frame
为了更好地说明,我们举几个例子,以下是16进制显示的视频编码:
00 00 01 b6 34 78 97 09 87 06 57 87 …… I帧
00 00 01 b6 78 34 20 cc 66 b3 89 …… P帧
00 00 01 b6 88 99 06 54 34 78 90 98 …… B帧
下面我们来分析一下为什么他们分别是I、P、B帧
0x10 = 01 0000
0x50 = 01 0000
0x96 = 01 0100
大家看红色的2bit,再对照开头说的帧与2bit的对应关系,是不是符合了呢?
下面给出一段c++代码供大家参考:
switch(buf[i] & (BYTE)0xc0)
{
case 0x00:
//I Frame
break;
case 0x40:
//P Frame
break;
case 0x80:
//B Frame
break;
default:
break;
}