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[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
时间戳起始位置偏移,即从从该时间戳开始播放
包含了media的信息
![](https://img-blog.csdn.net/20180603155646933)
vmhd(video media header)
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
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