I、B、P帧

帧——就是影像动画中最小单位的单幅影像画面,相当于电影胶片上的每一格镜头。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。

1、基本概念

I frame :帧内编码帧 又称intra picture,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。

P frame: 前向预测编码帧 又称predictive-frame,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;

B frame: 双向预测内插编码帧 又称bi-directional interpolated prediction frame,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧;


PTS:Presentation Time Stamp。PTS主要用于度量解码后的视频帧什么时候被显示出来
DTS:Decode Time Stamp。DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码。
ps:在没有B帧存在的情况下DTS的顺序和PTS的顺序应该是一样的。

2、I、B、P的特点

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帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差); 
3.解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像; 
4.P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧; 
5.P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧; 
6.由于P帧是参考帧,它可能造成解码错误的扩散; 
7.由于是差值传送,P帧的压缩比较高。
B帧:双向预测内插编码帧。
B帧的预测与重构
B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢
量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测
值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。

B帧特点
1.B帧是由前面的I或P帧和后面的P帧来进行预测的; 
2.B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量; 
3.B帧是双向预测编码帧; 
4.B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确; 
5.B帧不是参考帧,不会造成解码错误的扩散。
注:I、B、P各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧,至于图像
中的哪一帧是I帧,是随机的,一但确定了I帧,以后的各帧就严格按规定顺序排列

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

3、GOP

GOP:Group of Pictures 画面组 

  GOP(Group of Pictures)策略影响编码质量:所谓GOP,意思是画面组,一个GOP就是一组连续的画面。MPEG编码将画面(即帧)分为I、P、B三种,I是内部编码帧,P是前向预测帧,B是双向内插帧。简单地讲,I帧是一个完整的画面,而P帧和B帧记录的是相对于I帧的变化。没有I帧,P帧和B帧就无法解码,这就是MPEG格式难以精确剪辑的原因,也是我们之所以要微调头和尾的原因。   MPEG-2 帧结构 

  MPEG-2压缩的帧结构有两个参数,一个是GOP(Group Of Picture)图像组的长度,一般可按编码方式从1-15;另一个是I帧和P帧之间B帧的数量,一般是1-2个。前者在理论上记录为N,即多少帧里面出现一次I帧;后者描述为多少帧里出现一次P帧,记录为M。

下面举例说明:



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




4、mpeg4视频中IBP的判定

    mpeg4的每一帧开头是固定的:00 00 01 b6,那么我们如何判断当前帧属于什么帧呢?在接下来的2bit,将会告诉我们答案。注意:是2bit,不是byte,下面是各类型帧与2bit的对应关系:

  00: I Frame
  01: P Frame
  10: B Frame 

为了更好地说明,我们举几个例子,以下是16进制显示的视频编码:

  00 00 01 b6 10 34 78 97 09 87 06 57 87 ……                             I帧

  00 00 01 b6 50 78 34 20 cc 66 b3 89 ……                                  P帧

  00 00 01 b6 96 88 99 06 54 34 78 90 98 ……                              B帧

下面我们来分析一下为什么他们分别是I、P、B帧

  0x10 = 0001 0000

  0x50 = 0101 0000

  0x96 = 1001 0100 

大家看红色的2bit,再对照开头说的帧与2bit的对应关系,是不是符合了呢?

下面给出一段代码供大家参考:

//寻找00 00 01 b6的下一个bit所在的索引值
static char*Find_VOP_Start(unsigned char *addrp, unsigned int FindSizes)
{
    int i = 0;
    while(i < FindSizes)
    {
        if(addrp[i] == 0x00)
            if(addrp[i + 1] == 0x00)
                if(addrp[i + 2] == 0x01)
                    if(addrp[i + 3] == 0xB6)
                        break;
        i++;
    }
    if(i < FindSizes - 4)
       return addrp + i + 4;
    else
        return 0;
}

//打印该帧的类型
unsigned int *p;
p=(int*)Find_VOP_Start(inbuf,recv_size);
 switch((*p) & 0xC0)
        {
            case 0x00:
                fprintf(stdout,"The typeof frame is:I\n");// I Frame
                break;
            case 0x40:
                fprintf(stdout,"The typeof frame is:P\n");// P Frame
                break;
            case 0x80:
               fprintf(stdout,"The type of frame is:B\n");// B Frame
                break;
            default:
                fprintf(stdout,"No properframe !\n");
                exit(1);
        }

如果是MPEG2视频,则先找到00 00 01 00,然后根据其后的3bit来判断,001是I帧,011是B帧,010是P帧,判断方法和MPEG4的判断方法完全相同,不同的是在于相关的类型标识比特位。

如果是H.264视频,要先把H264的ES流数据解析出来,然后分析出每一个NAL(Network Abstract Layer,网络抽象层),再解析出哪些NAL为一个Frame,最后解析Slice类型,根据Slice类型就可以判断这个Frame的IPB类型。判断方法较MPEG2与MPEG4复杂。


参考地址:http://blog.csdn.net/abcjennifer/article/details/6577934
          http://www.cnblogs.com/ManMonth/archive/2010/02/09/1666328.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值