MP4(MPEG-4 Part 14)是一种常见的多媒体容器格式,它是在“ISO/IEC 14496-14”标准文件中定义的,属于MPEG-4的一部分,是“ISO/IEC 14496-12(MPEG-4 Part 12 ISO base media file format)”标准中所定义的媒体格式的一种实现,后者定义了一种通用的媒体文件结构标准。
MP4是一种描述较为全面的容器格式,被认为可以在其中嵌入任何形式的数据,各种编码的视频、音频等都不在话下,不过我们常见的大部分的MP4文件存放的AVC(H.264)或MPEG-4(Part 2)编码的视频和AAC编码的音频。MP4格式的官方文件后缀名是“.mp4”,还有其他的以mp4为基础进行的扩展或者是缩水版本的格式,包括:M4V、 3GP、F4V等。
MP4是由一个个“box”组成的,大box中存放小box,一级嵌套一级来存放媒体信息,box的基本结构是:
其中,size指明了整个box所占用的大小,包括header部分。如果box很大(例如存放具体视频数据的mdat box),超过了uint32的最大数值,size就被设置为1,并用接下来的8位uint64来存放大小。
一个mp4文件有可能包含非常多的box,在很大程度上增加了解析的复杂性,这个网页上http://mp4ra.org/atoms.html记录了一些当前注册过的box类型。还好大部分mp4文件没有那么多的box类型,下图就是一个简化了的,常见的mp4文件结构:
名称 |
说明 |
|||||
ftyp |
|
|
|
|
|
file type,文件类型 |
moov |
|
|
|
|
|
metadata container,元数据信息 |
|
mvhd |
|
|
|
|
moive header,文件的总体信息如时长等 |
|
trak |
|
|
|
|
track container,存放音频/视频的容器 |
|
|
tkhd |
|
|
|
track header,track的总体信息如时长、宽高等 |
|
|
mdia |
|
|
|
track media information container |
|
|
|
mdhd |
|
|
Media header,定义timescale,trak需要通过timescale换成成真实时间 |
|
|
|
hdlr |
|
|
Handler,表明track的类型,指明是video、audio或hint |
|
|
|
minf |
|
|
media information container |
|
|
|
|
stbl |
|
sample table box,存放时间/偏移的映射关系表,数据在子box中 |
|
|
|
|
|
stsd |
sample descriptions |
|
|
|
|
|
stts |
时间和sample的映射表 |
|
|
|
|
|
stsc |
sample和chunk的映射表 |
|
|
|
|
|
stsz |
每个sample的size |
|
|
|
|
|
stz2 |
|
|
|
|
|
|
ctts |
时间合成偏移表 |
|
|
|
|
|
stss |
关键帧列表 |
|
|
|
|
|
stco |
chunk的offset |
|
|
|
|
|
co64 |
|
mdat |
|
|
|
|
|
具体的媒体数据 |