[关闭]
@ltlovezh 2021-01-09T12:03:04.000000Z 字数 2940 阅读 1549

Mp4 ESDS BOX结构

MP4


基础知识

ESDS BOX主要存储Element Stream Descriptors(ESDs),该Box Body的前4个字节为version&flag,一般全为0,从第4个字节开始为ESDs。

ESDs主要为3层,每层为包含关系,从外到里分别为:MP4ESDescr、MP4DecConfigDescr、MP4DecSpecificDescr,每个ESD的结构如下所示:

  1. typedef esdStruct{
  2. uint8_t tag; // 1字节的Tag Type
  3. <不定长,最长4字节> size;
  4. uint8_t[size] data;
  5. } esdStruct

可用的Tag Type有以下几种,Mp4主要处理MP4ESDescrTag、MP4DecConfigDescrTag和MP4DecSpecificDescrTag。

  1. #define MP4ODescrTag 0x01
  2. #define MP4IODescrTag 0x02
  3. #define MP4ESDescrTag 0x03
  4. #define MP4DecConfigDescrTag 0x04
  5. #define MP4DecSpecificDescrTag 0x05
  6. #define MP4SLDescrTag 0x06

实战解析

某个MP4的ESDS BOX:

  1. 00 00 00 33 65 73 64 73 00 00 00 00 03 80 80 80
  2. 22 00 02 00 04 80 80 80 14 40 15 00 00 00 00 01
  3. f4 00 00 01 f4 00 05 80 80 80 02 12 10 06 80 80
  4. 80 01 02

00 00 00 33 65 73 64 73
8字节的Box Header,前4字节为Box Size(Box Header+ Box Body),后4字节的Box Type(ESDS),所以ESDS BOX的长度为51字节。

00 00 00 00
1字节的version,3字节的flags,一般都为0。

03 80 80 80 22 00 02 00
03表示MP4ESDescrTag,80 80 80 22表示长度为34字节,00 02表示ES_ID,00表示Flag,每个Bit都有不同的含义,具体可参考相关标准

ESD中Tag和长度的解析可以参考FFmpegff_mp4_read_descr函数,MP4ESDescr的解析可以参考ff_mp4_parse_es_descr函数。

04 80 80 80 14 40 15 00 00 00 00 01 f4 00 00 01 f4 00
04表示MP4DecConfigDescrTag,80 80 80 14表示长度为20字节,40 15 00 00 00 00 01 f4 00 00 01 f4 00为MP4DecConfigDescr的有效内容,共13字节,它的第一个字节40表示Codec Tag,对应了一种编码。40对应的是AV_CODEC_ID_AAC编码。
FFmpeg isom.c中定义了MP4容器支持的所有编码格式:

  1. /* http://www.mp4ra.org */
  2. /* ordered by muxing preference */
  3. const AVCodecTag ff_mp4_obj_type[] = {
  4. { AV_CODEC_ID_MOV_TEXT , 0x08 },
  5. { AV_CODEC_ID_MPEG4 , 0x20 },
  6. { AV_CODEC_ID_H264 , 0x21 },
  7. { AV_CODEC_ID_HEVC , 0x23 },
  8. { AV_CODEC_ID_AAC , 0x40 },
  9. { AV_CODEC_ID_MP4ALS , 0x40 }, /* 14496-3 ALS */
  10. { AV_CODEC_ID_MPEG2VIDEO , 0x61 }, /* MPEG-2 Main */
  11. { AV_CODEC_ID_MPEG2VIDEO , 0x60 }, /* MPEG-2 Simple */
  12. { AV_CODEC_ID_MPEG2VIDEO , 0x62 }, /* MPEG-2 SNR */
  13. { AV_CODEC_ID_MPEG2VIDEO , 0x63 }, /* MPEG-2 Spatial */
  14. { AV_CODEC_ID_MPEG2VIDEO , 0x64 }, /* MPEG-2 High */
  15. { AV_CODEC_ID_MPEG2VIDEO , 0x65 }, /* MPEG-2 422 */
  16. { AV_CODEC_ID_AAC , 0x66 }, /* MPEG-2 AAC Main */
  17. { AV_CODEC_ID_AAC , 0x67 }, /* MPEG-2 AAC Low */
  18. { AV_CODEC_ID_AAC , 0x68 }, /* MPEG-2 AAC SSR */
  19. { AV_CODEC_ID_MP3 , 0x69 }, /* 13818-3 */
  20. { AV_CODEC_ID_MP2 , 0x69 }, /* 11172-3 */
  21. { AV_CODEC_ID_MPEG1VIDEO , 0x6A }, /* 11172-2 */
  22. { AV_CODEC_ID_MP3 , 0x6B }, /* 11172-3 */
  23. { AV_CODEC_ID_MJPEG , 0x6C }, /* 10918-1 */
  24. { AV_CODEC_ID_PNG , 0x6D },
  25. { AV_CODEC_ID_JPEG2000 , 0x6E }, /* 15444-1 */
  26. { AV_CODEC_ID_VC1 , 0xA3 },
  27. { AV_CODEC_ID_DIRAC , 0xA4 },
  28. { AV_CODEC_ID_AC3 , 0xA5 },
  29. { AV_CODEC_ID_EAC3 , 0xA6 },
  30. { AV_CODEC_ID_DTS , 0xA9 }, /* mp4ra.org */
  31. { AV_CODEC_ID_VP9 , 0xC0 }, /* nonstandard, update when there is a standard value */
  32. { AV_CODEC_ID_FLAC , 0xC1 }, /* nonstandard, update when there is a standard value */
  33. { AV_CODEC_ID_TSCC2 , 0xD0 }, /* nonstandard, camtasia uses it */
  34. { AV_CODEC_ID_EVRC , 0xD1 }, /* nonstandard, pvAuthor uses it */
  35. { AV_CODEC_ID_VORBIS , 0xDD }, /* nonstandard, gpac uses it */
  36. { AV_CODEC_ID_DVD_SUBTITLE, 0xE0 }, /* nonstandard, see unsupported-embedded-subs-2.mp4 */
  37. { AV_CODEC_ID_QCELP , 0xE1 },
  38. { AV_CODEC_ID_MPEG4SYSTEMS, 0x01 },
  39. { AV_CODEC_ID_MPEG4SYSTEMS, 0x02 },
  40. { AV_CODEC_ID_NONE , 0 },
  41. };

MP4DecConfigDescr结构体的解析可以参考FFmpegff_mp4_read_dec_config_descr函数。

05 80 80 80 02 12 10
05表示MP4DecSpecificDescrTag,80 80 80 02表示长度为2字节,12 10为AudioSpecificConfig结构体,表示AAC元数据,就是FFmpegAVStream->codecpar->extradata中的数据。
MP4DecSpecificDescr结构体的解析也在ff_mp4_read_dec_config_descr函数中。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注