ssdr / blog

:diamonds: 岁月如歌,记录点滴。
0 stars 1 forks source link

MP4 文件格式解析 #6

Open ssdr opened 5 years ago

ssdr commented 5 years ago

几个概念

MP4 file is box/atom based.

mp4

file type box (ftyp)

只有1个,并只能包含在文件层,不能被其他box包含,该box应该放在文件的最开始。

movie box (moov)

container box,包含文件媒体的metadata信息,只有1个,并只能包含在文件层。 一般情况下,moov中会包含一个mvhd和若干个trak。

movie header box (mvhd)

track box (trak)

container box,包含了媒体数据的引用和描述。 trak必须包含一个tkhd和一个mdia,此外还有很多可选的box。

track header box (tkhd)

media box (mdia)

container box,其子box结构和种类比较复杂。 一般来说,mdia包含一个mdhd,一个hdlr和一个minf。 mediabox

media header box (mdhd)

handler reference box (hdlr)

解释了媒体的播放过程信息,该box也可以包含在meta box(meta)中。

media information box (minf)

container box,存储了解释track媒体数据的handler-spcific信息,media handler用这些信息将媒体时间映射到媒体数据并进行处理。 一般情况下,minf包含一个header box,一个dinf和一个stbl,其中header box根据track type(media handler type)分为vmhd,smhd,hmhd和nmhd。

media information header box (vmhd, smhd, hmhd, nmhd)
  1. video media header box (vmhd)

    • 4B: box size
    • 4B: box type, 'vmhd'
    • 1B: version, 一般为0
    • 3B: flags
    • 4B: graphics mode, 视频合成模式
    • 6B: opcolor, red/green/blue
    • 共22个字节
  2. sound media header box (smhd)

    • 4B: box size
    • 4B: box type, 'smhd'
    • 1B: version, 一般为0
    • 3B: flags
    • 2B: balance, 立体声平衡,一般为0
    • 2B: reserved
    • 共16个字节
  3. hint media header box (hmhd)

  4. null media header box (nmhd)

data information box (dinf)

container box,解释如何定位媒体信息。 一般情况下,dinf包含一个dref,dref下会包含若干个url或urn,这些box组成一个表,用来定位track数据。

  1. data reference box (dref)
    • 4B: box size
    • 4B: box type, 'dref'
    • 1B: version
    • 3B: flags
    • 4B: entry count, url/urn表的元素个数
    • 不定: url/urn列表
sample table box (stbl)

container box,包含了关于track中sample所有时间和位置信息,以及sample的编解码等信息。利用这个表,可以解释sample的时序,类型,大小以及在各自存储容器中的位置。

  1. sample description box (stsd) 必不可少,包含视频的编码类型,宽度,报读,音频的声道,采样等信息。
  2. time to sample box (stts) 存储了sample的duration,描述了sample时序的映射方法,通过它可以找到任何时间的sample。
  3. sample size box (stsz) 定义了每个sample的大小,包含了媒体中全部sample的数据和一张给出每个sample大小的表,这个表体积比较大。
  4. sample to chunk box (stsc) 存储了sample和chunk的映射关系,查该表可以找到包含指定sample的chunk,从而找到该sample。
  5. sync sample box (stss) 确定media中的关键帧,包含了一个sample序号表,严格按序号排列,说明了哪一个sample是关键帧,如果没有该表,说明每一个sample都是一个关键帧。
  6. chunk offset box (stco) 定义了每个chunk在媒体中的位置,该位置是相对整个文件的,因此,如果前面的box有了任何改变,该表需要重新建立。

media data box (mdat)

存储媒体数据。

ssdr commented 5 years ago

mp4-struct