文中使用到的工具说明:https://www.cdsy.xyz/computer/recommend/240907/cd63279.html
moov box(movie box): 包含若干子box,这些子box共同描述了媒体播放必需的元数据。
下面是一个MP4文件的box列表,红色的即moov box的内容:
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 : ---