mp4 文件 esds box 分析

该博客为在https://blog.****.net/evsqiezi/article/details/73920290的基础上补充而来,没找到原创最终出处

 

编码涉及到对应ISO国际标准文档:14496-1 14496-3 文档。

ISO IEC Publicly Available Standards官网:http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html

很多文档可从该网站免费下载。

 

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

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

ESDs中可以分为三层,每层为包含关系,分别为

MP4ESDescr(0x03开始,一般7个字节),

MP4DecConfigDescr(0x04开始,一般13个字节),

MP4DecSpecificDescr,每层的结构都类似如下:

typedef esdsStruct{

uint8_t tag;

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

uint8_t[size] data;

}esdsStruct;

 

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

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

定义如下:

const AVCodecTag ff_mp4_obj_type[] = {  

    { CODEC_ID_MOV_TEXT  , 0x08 },  

    { CODEC_ID_MPEG4     , 0x20 },  

    { CODEC_ID_H264      , 0x21 },  

    { CODEC_ID_AAC       , 0x40 },  

    { CODEC_ID_MP4ALS    , 0x40 }, /* 14496-3 ALS */  

    { CODEC_ID_MPEG2VIDEO, 0x61 }, /* MPEG2 Main */  

    { CODEC_ID_MPEG2VIDEO, 0x60 }, /* MPEG2 Simple */  

    { CODEC_ID_MPEG2VIDEO, 0x62 }, /* MPEG2 SNR */  

    { CODEC_ID_MPEG2VIDEO, 0x63 }, /* MPEG2 Spatial */  

    { CODEC_ID_MPEG2VIDEO, 0x64 }, /* MPEG2 High */  

    { CODEC_ID_MPEG2VIDEO, 0x65 }, /* MPEG2 422 */  

    { CODEC_ID_AAC       , 0x66 }, /* MPEG2 AAC Main */  

    { CODEC_ID_AAC       , 0x67 }, /* MPEG2 AAC Low */  

    { CODEC_ID_AAC       , 0x68 }, /* MPEG2 AAC SSR */  

    { CODEC_ID_MP3       , 0x69 }, /* 13818-3 */  

    { CODEC_ID_MP2       , 0x69 }, /* 11172-3 */  

    { CODEC_ID_MPEG1VIDEO, 0x6A }, /* 11172-2 */  

    { CODEC_ID_MP3       , 0x6B }, /* 11172-3 */  

    { CODEC_ID_MJPEG     , 0x6C }, /* 10918-1 */  

    { CODEC_ID_PNG       , 0x6D },  

    { CODEC_ID_JPEG2000  , 0x6E }, /* 15444-1 */  

    { CODEC_ID_VC1       , 0xA3 },  

    { CODEC_ID_DIRAC     , 0xA4 },  

    { CODEC_ID_AC3       , 0xA5 },  

    { CODEC_ID_DTS       , 0xA9 }, /* mp4ra.org */  

    { CODEC_ID_VORBIS    , 0xDD }, /* non standard, gpac uses it */  

    { CODEC_ID_DVD_SUBTITLE, 0xE0 }, /* non standard, see unsupported-embedded-subs-2.mp4 */  

    { CODEC_ID_QCELP     , 0xE1 },  

    { CODEC_ID_MPEG4SYSTEMS, 0x01 },  

    { CODEC_ID_MPEG4SYSTEMS, 0x02 },  

    { CODEC_ID_NONE      ,    0 },  

};  

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

当objectTypeIndication为0x40时,为MPEG-4 Audio。如果想更细分format为aac还是mp3,可以读取MP4DecSpecificDescr层data[0]的前五位。

 

esds box分析例子:

这是一段ESDS数据

00001e7: 0000 0027 6573 6473 0000 0000 0319 0000  ...'esds........

00001f7 : 0004 1140 1500 01f8 0001 2728 0000 f3e8  [email protected]'(....

0000207: 0502 1388 0601 02                        .......

 

分析如下:

0000 0027 :   esds box长度, 长度是39

6373 6473  : esds box type : esds

00           : Version为 0

00 0000   : Flags为0

03           : ES_DescrTag 见14496-1 Table 1

19         :Length Field:25

0000   :ES_ID: 是0

00           :00(hex) =  0000 0000(bits)

----------00的详细解释--------------------------------------------------------------------------------------------

             :0              :steamDependenceFlag,如果为1,则有16bits的 dependsOn_ES_IS

             :0             :URL_Flag,如果为1,后边则有8bits URLlength, 和相应的URLstring(URLlength)

             :0            :OCRstreamFlag, 如果为1,有16bits OCR_ES_id;

             :00000     :streamPriority

-------------------------------------------------------------------------------------------------------------------------

04         :DecoderConfigDescriptor TAG

11      :Length Field:17

40   :objectTypeIndication 14496-1 Table 5 — objectTypeIndication Values, 0x40是

Audio ISO/IEC 14496-3

15           :15(hex) = 0001 0101(bits)

----------15的详细解释--------------------------------------------------------------------------------------------

             :0001 01        :streamType  5是Audio Stream, 14496-1 Table6

             :0       :upStream

             :1      :reserved

-------------------------------------------------------------------------------------------------------------------------

0001f8   :bufferSizeDB   504

0001 2728   :maxBitrate  75560          //可以获取最大码率

0000 f3e8   :avgBitrate  62440            //可以获取平均码率

05           :DecSpecificInfotag

02         :Length Field:2

1388    :14496-3 1.6

----------1388的详细解释--------------------------------------------------------------------------------------------

             :1388(hex)=

             :0001 0011 1000 1000(bit)

             :0001 0          :audioObjectType 2 GASpecificConfig

             :011 1            :samplingFrequencyIndex 0x8 (16000)

             :000 1           :channelConfiguration 1 

             :00         :cpConfig

             :0        :directMapping

-------------------------------------------------------------------------------------------------------------------------

06           :SLConfigDescrTag

01         :Length Field:1

02      :predefined 0x02 Reserved for use in MP4 files

mp4 文件 esds box 分析

 

 

一些描述如下:esds的结构描述:

ISO/IEC 14496-1 ES_Descriptor is defined as follow:

8.6.5.1 Syntax

class ES_Descriptor extends BaseDescriptor : bit(8) tag=ES_DescrTag

{

bit(16) ES_ID;

bit(1) streamDependenceFlag;

bit(1) URL_Flag;

bit(1) OCRstreamFlag;

bit(5) streamPriority;

if (streamDependenceFlag)

{

bit(16) dependsOn_ES_ID;

}

if (URL_Flag)

{

bit(8) URLlength;

bit(8) URLstring[URLlength];

}

if (OCRstreamFlag)

{

bit(16) OCR_ES_Id;

}

DecoderConfigDescriptor decConfigDescr;

SLConfigDescriptor slConfigDescr;

IPI_DescrPointer ipiPtr[0 .. 1];

IP_IdentificationDataSet ipIDS[0 .. 255];

IPMP_DescriptorPointer ipmpDescrPtr[0 .. 255];

LanguageDescriptor langDescr[0 .. 255];

QoS_Descriptor qosDescr[0 .. 1];

RegistrationDescriptor regDescr[0 .. 1];

ExtensionDescriptor extDescr[0 .. 255];

}