在哪个字段有判断I,B,P帧的信息[整理]

在哪个字段有判断I,B,P帧的信息[整理]

在哪个字段有判断I,B,P帧的信息?(MPEG2, H.264) .

1.根据TS包头中的PID找到TS流里的PAT表,其TS的PID为0x00;
2.找到PAT表后,根据其中携带的PMT表的TS包PID找到PMT表;
3.找到PMT表后,根据其中携带视频的TS包PID就可以判断出包含视频数据的TS包;
4.对于mpeg-1和mpeg-2视频,一般在TS复用时一个PES包包含一个picture,对于mpeg-2   video,picture可以是桢图像(frame)或场图像(field)
5.找到视频TS包中一个包含PES头的TS包(PID为PMT中的视频PID,TS包头中payload_unit_start_indicator标志为1),这个包里会包含picture   header信息
6 .找到picture   header(以0x00000100开始)后,根据其中的 picture_coding_type信息判断其为I,P,B或D桢,注意,D桢只在mpeg-1   video中使用

有关TS,PES,PAT,PMT信息见13818-1,有关picture   header,picture_coding_type信息见13818-2和11176-2

我根据取得的 ES包找到00000100,然后根据其后2个字节的第11-13位判断,001是I帧,011是B帧,010是P帧,多谢指点


如果视频是h264呢,怎样判断i、b、p帧

H264的IPB帧判断,要先解出来H264的es流数据,然后分析出每一个NAL,再解析出那些Nal为一个Frame,再解析Slice类型,当fisrt_mb_in_slice=0时,表示一帧的开始,再根据Slice类型就可以判断这个Frame的IPB类型


MPEG4解析VOL和VOP
H.264解析PPS
MPEG2跟MPEG4一样,只是头的规定不一样。

ffmpeg中获取frame的type在:

mpeg1:

mpeg1_decode_picture

mpeg2:

mpeg_decode_picture_coding_extension

mpeg4:

decode_vop_header

h263:

ff_intel_h263_decode_picture_header

h263_decode_picture_header

 

flv:

ff_flv_decode_picture_header

 

mpeg4视频中,I帧、p帧、B帧的判定

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


代码:

 switch (pTsc->mStreamType)
        {
             case STREAM_TYPE_VIDEO_H264:
                {
                    U8 nal_unit_type = apBuf[aOffset-1] & 0x1F;
                    switch (nal_unit_type)
                    {
                        case 7: // seq_parameter_set
                            {
                                pTsc->mCurrFrameType = FRAME_I;
                                pTsc->mCurrentStartCode = 0;
                                return;
                            }
                            break;
                            
                        case 9: // access_unit_delimiter
                        case 1: // slice_layer
                            {
                                pTsc->mCurrFrameType = FRAME_B;
                                pTsc->mCurrentStartCode = 0;


                                if (nal_unit_type == 1)
                                    return;
                            }
                            break;
                    }
                }
                break;


            case STREAM_TYPE_VIDEO_MPEG1:
            case STREAM_TYPE_VIDEO_MPEG2:
                {
                    switch (pTsc->mCurrentStartCode)
                    {
                        case MPEG2_SEQUENCE_HEADER_START_CODE_LONG://视频序列,下一个为I帧
                            pTsc->mCurrFrameType = FRAME_I;
                            break;


                        case START_CODE_PREFIX_LONG:
                            if (aOffset+2 > aBufLen) 
                                return;


                            pos += 4;
                            U8  picture_code_type = (apBuf[aOffset+1] & 0x3F) >> 3;
                            if (picture_code_type != FRAME_I)
                            {
                                pTsc->mCurrFrameType=picture_code_type;
                            }
                            return;
                    }
                }
                break;


             default:
                return;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值