导图社区 MP4格式知识梳理
MP4格式知识梳理,文件,由许多Box和FullBox组成,Header,包含了整个Box的长度size和类型type。当size==0时,代表这是文件中最后一个Box;当size==1时,意味着Box长度需要更多bits来描述,在后面会定义一个64bits的largesize描述Box的长度;当type是uuid时,代表Box中的数据是用户自定义扩展类型。
编辑于2023-06-08 16:16:27 北京市MP4格式
MP4文件格式
ftyp
标注
File Type Box
有且只有1个
被放在文件的最开始
moov
标注
Movie Box
包含了文件媒体的metadata信息
有且只有一个,且只被包含在文件层
会包含1个“mvhd”和若干个“trak”
mvhd
标注
Movie Header Box
字段 字节数 意义 box size 4 box大小 box type 4 box类型 version 1 box版本,0或1,一般为0。(以下字节数均按version=0) flags 3 creation time 4 创建时间(相对于UTC时间1904-01-01零点的秒数) modification time 4 修改时间 time scale 4 文件媒体在1秒时间内的刻度值,可以理解为1秒长度的时间单元数 duration 4 该track的时间长度,用duration和time scale值可以计算track时长,比如audio track的time scale = 8000, duration = 560128,时长为70.016,video track的time scale = 600, duration = 42000,时长为70 rate 4 推荐播放速率,高16位和低16位分别为小数点整数部分和小数部分,即[16.16] 格式,该值为1.0(0x00010000)表示正常前向播放 volume 2 与rate类似,[8.8] 格式,1.0(0x0100)表示最大音量 reserved 10 保留位 matrix 36 视频变换矩阵 pre-defined 24 next track id 4 下一个track使用的id号
trak
标注
Track Box
包含了该track的媒体数据引用和描述(hint track除外)
一个MP4文件中的媒体可以包含多个track,且至少有一个track,这些track之间彼此独立,有自己的时间和空间信息。
“trak”必须包含一个“tkhd”和一个“mdia”,此外还有很多可选的box
tkhd
字段 字节数 意义 box size 4 box大小 box type 4 box类型 version 1 box版本,0或1,一般为0。(以下字节数均按version=0) flags 3 按位或操作结果值,预定义如下: 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 creation time 4 创建时间(相对于UTC时间1904-01-01零点的秒数) modification time 4 修改时间 track id 4 id号,不能重复且不能为0 reserved 4 保留位 duration 4 track的时间长度 reserved 8 保留位 layer 2 视频层,默认为0,值小的在上层 alternate group 2 track分组信息,默认为0表示该track未与其他track有群组关系 volume 2 [8.8] 格式,如果为音频track,1.0(0x0100)表示最大音量;否则为0 reserved 2 保留位 matrix 36 视频变换矩阵 width 4 宽 height 4 高,均为 [16.16] 格式值,与sample描述中的实际画面大小比值,用于播放时的展示宽高
edts
mdia
标注
定义了track媒体类型以及sample数据,描述sample信息。
一般“mdia”包含一个“mdhd”,一个“hdlr”和一个“minf”,其中“mdhd”为media header box,“hdlr”为handler reference box,“minf”为media information box。
mdhd
字段 字节数 意义 box size 4 box大小 box type 4 box类型 version 1 box版本,0或1,一般为0。(以下字节数均按version=0) flags 3 creation time 4 创建时间(相对于UTC时间1904-01-01零点的秒数) modification time 4 修改时间 time scale 4 同前表 duration 4 track的时间长度 language 2 媒体语言码。最高位为0,后面15位为3个字符(见ISO 639-2/T标准中定义) pre-defined 2
hdlr
字段 字节数 意义 box size 4 box大小 box type 4 box类型 version 1 box版本,0或1,一般为0。(以下字节数均按version=0) flags 3 pre-defined 4 handler type 4 在media box中,该值为4个字符: “vide”— video track “soun”— audio track “hint”— hint track reserved 12 name 不定 track type name,以‘\0’结尾的字符串
minf
标注
存储了解释track媒体数据的handler-specific信息,media handler用这些信息将媒体时间映射到媒体数据并进行处理。
一般情况下,“minf”包含一个header box,一个“dinf”和一个“stbl”,其中,header box根据track type(即media handler type)分为“vmhd”、“smhd”、“hmhd”和“nmhd”,“dinf”为data information box,“stbl”为sample table box。
Media Information Header Box(vmhd、smhd、hmhd、nmhd)
Video Media Header Box(vmhd)
字段 字节数 意义 box size 4 box大小 box type 4 box类型 version 1 box版本,0或1,一般为0。(以下字节数均按version=0) flags 3 graphics mode 4 视频合成模式,为0时拷贝原始图像,否则与opcolor进行合成 opcolor 2×3 {red,green,blue}
Sound Media Header Box(smhd)
字段 字节数 意义 box size 4 box大小 box type 4 box类型 version 1 box版本,0或1,一般为0。(以下字节数均按version=0) flags 3 balance 2 立体声平衡,[8.8] 格式值,一般为0,-1.0表示全部左声道,1.0表示全部右声道 reserved 2
Hint Media Header Box(hmhd)
Null Media Header Box(nmhd)
dinf
标注
Data Information Box
解释如何定位媒体信息
一般包含一个“dref”,即data reference box;
“dref”下会包含若干个“url”或“urn”,这些box组成一个表,用来定位track数据
简单的说,track可以被分成若干段,每一段都可以根据“url”或“urn”指向的地址来获取数据,sample描述中会用这些片段的序号将这些片段组成一个完整的track。
一般情况下,当数据被完全包含在文件中时,“url”或“urn”中的定位字符串是空的。
dref
字段 字节数 意义 box size 4 box大小 box type 4 box类型 version 1 box版本,0或1,一般为0。(以下字节数均按version=0) flags 3 entry count 4 “url”或“urn”表的元素个数 “url”或“urn”列表 不定
stbl
标注
Sample Table Box
sample是媒体数据存储的单位,存储在media的chunk中,chunk和sample的长度均可互不相同
包含了关于track中sample所有时间和位置的信息,以及sample的编解码等信息。
“stsd”必不可少,且至少包含一个条目,该box包含了data reference box进行sample数据检索的信息。
stsd
标注
Sample Description Box
stsc
unsigned int(32) entry_count
for (i=1; i < entry_count; i++)
unsigned int(32) first_chunk;
unsigned int(32) samples_per_chunk;
unsigned int(32) sample_description_index;
mdat
文件基本结构描述图
基本概念
文件,由许多Box和FullBox组成
Box,每个Box由Header和Data组成。
FullBox,是Box的扩展,Box结构的基础上在Header中增加8bits version和24bits flags。
Header,包含了整个Box的长度size和类型type。当size==0时,代表这是文件中最后一个Box;当size==1时,意味着Box长度需要更多bits来描述,在后面会定义一个64bits的largesize描述Box的长度;当type是uuid时,代表Box中的数据是用户自定义扩展类型。
Data,是Box的实际数据,可以是纯数据也可以是更多的子Boxes。
当一个Box的Data中是一系列子Box时,这个Box又可成为Container Box。