MP4文件格式具体解释(ISO-14496-12/14)
Author:Pirate Leo
Email:codeevoship@gmail.com
一、基本概念
1、 文件,由很多Box和FullBox组成。
2、 Box,每一个Box由Header和Data组成。
3、 FullBox,是Box的扩展,Box结构的基础上在Header中添加8bits version和24bits flags。
4、 Header,包括了整个Box的长度size和类型type。当size==0时,代表这是文件里最后一个Box;当size==1时,意味着Box长度须要很多其它bits来描写叙述,在后面会定义一个64bits的largesize描写叙述Box的长度;当type是uuid时,代表Box中的数据是用户自己定义扩展类型。
5、 Data,是Box的实际数据,能够是纯数据也能够是很多其它的子Boxes。
6、 当一个Box的Data中是一系列子Box时,这个Box又可成为Container Box。
Box的结构用伪代码表演示样例如以下:
aligned(8) class Box (unsigned int(32) boxtype,optional unsigned int(8)[16] extended_type) { unsigned int(32) size; unsigned int(32) type = boxtype; if (size==1) { unsigned int(64) largesize; } else if (size==0) { // box extends to end of file } if (boxtype==‘uuid’) { unsigned int(8)[16] usertype = extended_type; }
结构例如以下图:
文件基本结构描写叙述图
二、MP4文件格式(ISO-14496-12/14)
MP4文件概述
MP4文件就是由各式各样的Box组成的,下表中列出了全部必选或可选的Box类型,√代表Box必选。
详细列表:
ftyp |
√ |
file type and compatibility |
|||||
pdin |
progressive download information |
||||||
moov |
√ |
container for all the metadata |
|||||
mvhd |
√ |
movie header, overall declarations |
|||||
trak |
√ |
container for an individual track or stream |
|||||
tkhd |
√ |
track header, overall information about the track |
|||||
tref |
track reference container |
||||||
edts |
edit list container |
||||||
elst |
an edit list |
||||||
mdia |
√ |
container for the media information in a track |
|||||
mdhd |
√ |
media header, overall information about the media |
|||||
hdlr |
√ |
handler, declares the media (handler) type |
|||||
minf |
√ |
media information container |
|||||
vmhd |
video media header, overall information (video track only) |
||||||
smhd |
sound media header, overall information (sound track only) |
||||||
hmhd |
hint media header, overall information (hint track only) |
||||||
nmhd |
Null media header, overall information (some tracks only) |
||||||
dinf |
√ |
data information box, container |
|||||
dref |
√ |
data reference box, declares source(s) of media data in track |
|||||
stbl |
√ |
sample table box, container for the time/space map |
|||||
stsd |
√ |
sample descriptions (codec types, initialization etc.) |
|||||
stts |
√ |
(decoding) time-to-sample |
|||||
ctts |
(composition) time to sample |
||||||
stsc |
√ |
sample-to-chunk, partial data-offset information |
|||||
stsz |
sample sizes (framing) |
||||||
stz2 |
compact sample sizes (framing) |
||||||
stco |
√ |
chunk offset, partial data-offset information |
|||||
co64 |
64-bit chunk offset |
||||||
stss |
sync sample table (random access points) |
||||||
stsh |
shadow sync sample table |
||||||
padb |
sample padding bits |
||||||
stdp |
sample degradation priority |
||||||
sdtp |
independent and disposable samples |
||||||
sbgp |
sample-to-group |
||||||
sgpd |
sample group description |
||||||
subs |
sub-sample information |
||||||
mvex |
movie extends box |
||||||
mehd |
movie extends header box |
||||||
trex |
√ |
track extends defaults |
|||||
ipmc |
IPMP Control Box |
||||||
moof |
movie fragment |
||||||
mfhd |
√ |
movie fragment header |
|||||
traf |
track fragment |
||||||
tfhd |
√ |
track fragment header |
|||||
trun |
track fragment run |
||||||
sdtp |
independent and disposable samples |
||||||
sbgp |
sample-to-group |
||||||
subs |
sub-sample information |
||||||
mfra |
movie fragment random access |
||||||
tfra |
track fragment random access |
||||||
mfro |
√ |
movie fragment random access offset |
|||||
mdat |
media data container |
||||||
free |
free space |
||||||
skip |
free space |
||||||
udta |
user-data |
||||||
cprt |
copyright etc. |
||||||
meta |
metadata |
||||||
hdlr |
√ |
handler, declares the metadata (handler) type |
|||||
dinf |
data information box, container |
||||||
dref |
data reference box, declares source(s) of metadata items |
||||||
ipmc |
IPMP Control Box |
||||||
iloc |
item location |
||||||
ipro |
item protection |
||||||
sinf |
protection scheme information box |
||||||
frma |
original format box |
||||||
imif |
IPMP Information box |
||||||
schm |
scheme type box |
||||||
schi |
scheme information box |
||||||
iinf |
item information |
||||||
xml |
XML container |
||||||
bxml |
binary XML container |
||||||
pitm |
primary item reference |
||||||
fiin |
file delivery item information |
||||||
paen |
partition entry |
||||||
fpar |
file partition |
||||||
fecr |
FEC reservoir |
||||||
segr |
file delivery session group |
||||||
gitn |
group id to name |
||||||
tsel |
track selection |
||||||
meco |
additional metadata container |
||||||
mere |
metabox relation |
正式開始前先对文件的几个重要部分宏观介绍一下,以便诸位在兴许学习时心中有数:
1、 ftypbox,在文件的開始位置,描写叙述的文件的版本号、兼容协议等;2、 moovbox,这个box中不包括详细媒体数据,但包括本文件里全部媒体数据的宏观描写叙述信息,moov box下有mvhd和trak box。
>>mvhd中记录了创建时间、改动时间、时间度量标尺、可播放时长等信息。
>>trak中的一系列子box描写叙述了每一个媒体轨道的详细信息。
3、 moofbox,这个box是视频分片的描写叙述信息。并非MP4文件必须的部分,但在我们常见的可在线播放的MP4格式文件里(比如Silverlight Smooth Streaming中的ismv文件)确是重中之重。
4、 mdatbox,实际媒体数据。我们终于解码播放的数据都在这里面。
5、 mfrabox,一般在文件末尾,媒体的索引文件,可通过查询直接定位所需时间点的媒体数据。
附:Smooth Streaming中ismv文件结构,文件分为了多个Fragments,每一个Fragment中包括moof和mdat。这种结构符合渐进式播放需求。(mdat及其描写叙述信息逐步传输,收齐一个Fragment便可播放当中的mdat)。