mpeg4 esds及帧判断

esds box中主要是存放Element Stream Descriptors(ESDs),该box的前四个字节为version&flag,一般为0x 00 00 00 00;

从偏移第四个字节开始,为ESDs。

ESDs中可以分为三层,每层为包含关系,分别为MP4ESDescr,MP4DecConfigDescr,MP4DecSpecificDescr,每层的结构都类似如下:

typedef esdsStruct{

uint8_t tag;

<不定长,最长4字节> size;

uint8_t[size] data;

}esdsStruct;

各层的起始标签如下:

  1. #define MP4ESDescrTag                   0x03  
  2. #define MP4DecConfigDescrTag            0x04  
  3. #define MP4DecSpecificDescrTag          0x05  

起始标签后,为data size(不包含tag和size字节数),指示该层data的字节数。

其中,MP4DecConfigDescr层的data[0] 为objectTypeIndication<http://www.mp4ra.org/object.html>(一般来说,为esds box的data[11]),用于指示codec类型,定义如下:

  1. /* http://www.mp4ra.org */  
  2. /* ordered by muxing preference */  
  3. const AVCodecTag ff_mp4_obj_type[] = {  
  4.     { CODEC_ID_MOV_TEXT  , 0x08 },  
  5.     { CODEC_ID_MPEG4     , 0x20 },  
  6.     { CODEC_ID_H264      , 0x21 },  
  7.     { CODEC_ID_AAC       , 0x40 },  
  8.     { CODEC_ID_MP4ALS    , 0x40 }, /* 14496-3 ALS */  
  9.     { CODEC_ID_MPEG2VIDEO, 0x61 }, /* MPEG2 Main */  
  10.     { CODEC_ID_MPEG2VIDEO, 0x60 }, /* MPEG2 Simple */  
  11.     { CODEC_ID_MPEG2VIDEO, 0x62 }, /* MPEG2 SNR */  
  12.     { CODEC_ID_MPEG2VIDEO, 0x63 }, /* MPEG2 Spatial */  
  13.     { CODEC_ID_MPEG2VIDEO, 0x64 }, /* MPEG2 High */  
  14.     { CODEC_ID_MPEG2VIDEO, 0x65 }, /* MPEG2 422 */  
  15.     { CODEC_ID_AAC       , 0x66 }, /* MPEG2 AAC Main */  
  16.     { CODEC_ID_AAC       , 0x67 }, /* MPEG2 AAC Low */  
  17.     { CODEC_ID_AAC       , 0x68 }, /* MPEG2 AAC SSR */  
  18.     { CODEC_ID_MP3       , 0x69 }, /* 13818-3 */  
  19.     { CODEC_ID_MP2       , 0x69 }, /* 11172-3 */  
  20.     { CODEC_ID_MPEG1VIDEO, 0x6A }, /* 11172-2 */  
  21.     { CODEC_ID_MP3       , 0x6B }, /* 11172-3 */  
  22.     { CODEC_ID_MJPEG     , 0x6C }, /* 10918-1 */  
  23.     { CODEC_ID_PNG       , 0x6D },  
  24.     { CODEC_ID_JPEG2000  , 0x6E }, /* 15444-1 */  
  25.     { CODEC_ID_VC1       , 0xA3 },  
  26.     { CODEC_ID_DIRAC     , 0xA4 },  
  27.     { CODEC_ID_AC3       , 0xA5 },  
  28.     { CODEC_ID_DTS       , 0xA9 }, /* mp4ra.org */  
  29.     { CODEC_ID_VORBIS    , 0xDD }, /* non standard, gpac uses it */  
  30.     { CODEC_ID_DVD_SUBTITLE, 0xE0 }, /* non standard, see unsupported-embedded-subs-2.mp4 */  
  31.     { CODEC_ID_QCELP     , 0xE1 },  
  32.     { CODEC_ID_MPEG4SYSTEMS, 0x01 },  
  33.     { CODEC_ID_MPEG4SYSTEMS, 0x02 },  
  34.     { CODEC_ID_NONE      ,    0 },  
  35. };  

当objectTypeIndication为0x40时,为MPEG-4 Audio(MPEG-4 Audio generally is thought of as AAC but there is a whole framework of audio codecs that can go in MPEG-4 Audio including AAC, BSAC, ALS, CELP, and something called MP3On4),如果想更细分format为aac还是mp3,可以读取MP4DecSpecificDescr层data[0]的前五位,详细可以参考另一篇文章:

[mp4]The audio codec for mp4 atom
MP4DecSpecificDescr层(一般来说,该层在esds box中的偏移为objectTypeIndication+13,即esds box的data[24])的data为初始化解码器的私有数据,如aac音频的头信息,mpeg4视频的vos,vo等头信息。


帧类型判断

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

下面给出一段c++代码供大家参考:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->switch(buf[i] & (BYTE)0xc0)
{
case 0x00:
    //I Frame
    break;
case 0x40:
    //P Frame
    break;
case 0x80:
    //B Frame
    break;
default:
    break;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值