MP4 moov box解析

moov box(movie box): 包含若干子box,这些子box共同描述了媒体播放必需的元数据。
下面是一个MP4文件的box列表,红色的即moov box的内容:
ftyp ; length: 32
free ; length: 8
mdat ; length: 37524012
moov ; length: 12076  
 |__mvhd ; length: 108             (movie header)
  |__trak ; length: 11862           (track)
  |  |__tkhd ; length: 92             (track header)
  |  |__edts ; length: 36              (edit list )
  |  |__mdia ; length: 11726       (media )
  |    |__mdhd ; length: 32         (media header)
  |    |__hdlr ; length: 45            (handler)
  |    |__minf ; length: 11641     (media information)
  |      |__vmhd ; length: 20       (video media header)
  |      |__dinf ; length: 36          (data information)
  |        |__dref ; length: 28       (data reference)
  |      |__stbl ; length: 11577    (sample table)采样表box
  |        |__stsd ; length: 137     (sample descriptions)采样描述box
  |        |__stts ; length: 7224    (time to stamp)采样时戳因映射表box
  |        |__stss ; length: 140     (sync sample table)关键帧列表box
  |        |__stsc ; length: 280     (sample to chunk)sample和chunk映射表box
  |        |__stsz ; length: 3624   (sample size)每个sample的大小(有可能为stsz2)box
  |        |__stco ; length: 164    (chunk offset)每个chunk相对于文件头的偏移(大于2G的文件为stco64)box
  |__udta ; length: 98
  |  |__meta ; length: 90
end of file!

mvhd(movie header)
包含了媒体的创建与修改时间时间刻度、默认音量、色域、时长等信息
mvhd结构:
U32[0] size : 4(Byte)
U32[1] name : 4
U32[2] version : 1
            flag : 3
U32[3] creation time : 4
U32[4] modification time: 4
U32[5] timescale : 4
U32[6] duration : 4
U32[7] rate[16.16]: 4
U32[8] volume[8.8] : 2
... : Reserve
其中creation time和modification time 从UTC时间的1904年1月1日0点至今的秒数。
rate:播放速度倍率
volume : 默认音量
[8.8]:即前8位为整数,后8为为小数
例如:

creation time=0x7c25b112(s)
modification time=0x7c25b131(s)
timescale=0x15f90=90000
duration=0x17cdc0=1560000
(媒体总体时长:1560000/90000=17.33s)
speed rate=0x0001.0x0000=1.0
volume=0x01.0x00=1.0

tkhd(track header)
包含了track的信息
U32[0]  size : 4
U32[1]  name : 4
U32[2]  version : 1
             flags : 3
U32[3]  creation time : 4
U32[4]  modification time : 4
U32[5]  track id(唯一id,非0) : 4
U32[6]  reserve : 4
U32[7]  duration : 4
U32[8-9]  reserve : 8
U32[10]  layer(视频层,默认为0) : 2
              alternate group(track分组信息,默认为0,表示与其他track没有群组关系) : 2
U32[11] volume[8.8] : 2
              reserve : 2
U32[12-20]  matrix(视频变换矩阵) : 36 
U32[21] width [16.16] : 4
U32[22] height [16.16] : 4
[16.16]:即前16位为整数,后16为为小数

flags  :
按位或操作结果值,预定义如下:
0x000001 track_enabled,否则该track不被播放;
0x000002 track_in_movie,表示该track在播放中被引用;
0x000004 track_in_preview,表示该track在预览时被引用。
一般该值为7,如果一个媒体所有track均未设置track_in_movie和track_in_preview,将被理解为所有track均设置了这两项;对于hint track,该值为0
例如:

其他解析同mvhd
width=0x780.0x0=1920.0
height=0x438.0x0=1080.0

e dts(edit list )非必需
时间戳起始位置偏移,即从从该时间戳开始播放

mdhd (media header)
包含了media的信息
U32[0] size : 4
U32[1] name : 4
U32[2] version : 1
           flags : 3
U32[3] creation time : 4
U32[4] modification time : 4
U32[5] time scale : 4 
U32[6] duration : 4
U32[7] language : 2
            pre-defined : 2

hdlr(handler)
媒体播放过程信息
U32[0] size : 4
U32[1] name : 4
U32[2] version : 1
            flags : 3
U32[3] pre-defined : 4 
U32[4] handler type : 4
U32[5-7] reserve : 12
U8 name : handler name可为空字符串
例如:

handler type="vide"
"vide": video track
"soun": audio track
"hint": hint track

vmhd(video media header)
U32[0] size : 4
U32[1] name : 4
U32[2] version : 1
       flags : 3
U32[3] graphics mode : 4
U32[4] opcolor : 2x3
graphics mode(视频合成模式,0:拷贝原始图像,其他值则与opcolor合成)
opcolor:{rgb}


dref(data reference)
"dref"下会包含若干个“url”或“urn”,这些box组成一个表,用来定位track数据。 track可以被分成若干段,每一段都可以根据“url”或“urn”指向的地址来获取数据,sample描述中会用这些片段的序号将这些片段组成一个完整的track。一般情况下,当数据被完全包含在文件中时,“url”或“urn”中的定位字符串是空的。
U32[0] size : 4
U32[1] name : 4
U32[2] version : 1
       flags : 3
U32[3] entry count(url或urn的个数) : 4
usr/urn : ---


转载请标明出处:https://blog.csdn.net/u013752202/article/details/80557296





猜你喜欢

转载自blog.csdn.net/u013752202/article/details/80557296