h264的p帧 i帧

来源:互联网 发布:蚁群算法数学模型 编辑:程序博客网 时间:2024/05/13 06:04

h264的p帧的头是00 00 00 01 61

不属于以上的归为I帧,i帧的开头有1、00 00 00 01 67 ;2、00 00 00 01 08等。具体的打开一个h264文件看看就知道。

 //下面是转载

MPEG4格式

MPEG4的每一帧开头是固定的:00 00 01 B6,那么如何判断当前帧属于什么帧呢?在接下来的2bit,可以判定出来。注意:是2bit,不是byte,下面是各类型帧与2bit的对应关系:

    00:I Frame

    01:P Frame

    10:B Frame

示例:

    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的对应关系,是不是符合了呢?

下面给出一段C++代码以供参考:

 switch(buf[i]&(BYTE)0xC0)

 {

  case 0x00:

       // I Frame

       break;

  case 0x40:

       // P Frame

       break;

  case 0x80:

       // B Frame

       break;

  default:

       break;

 }

 

 

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帧不是参考帧,不会造成解码错误的扩散。

:IBP各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧,至于图像中的哪一帧是I,是随机的,一但确定了I,以后的各帧就严格按规定顺序排列