以下转自:http://blog.csdn.net/yu_yuan_1314/article/details/9289827
MP4文件的基本单元是“box”,这些box既可以包括data,也可以包括metadata。MP4文件标准允许多种方式来组织data box和metadata box。将metadata放在data之前,客户端应用程序可以在播放video/audio之前获得更多的关于video/audio的信息,因此这种方式在大多数的多媒体应用场景都是比较有用的。但是,在流媒体应用场景,不可能预先保存关于整个流数据的metadata信息,因为不可能提前完全知道。而且,预先保存的metadata越少就意味着越少的开销,因此也可以缩短启动时间。
MP4 ISO Base Media文件格式标准允许以fragmented方式组织box,这也就意味着MP4文件可以组织成这样的结构,由一系列的短的metadata/data box对组成,而不是一个长的metadata/data对。Fragmented MP4文件结构如图1所示,图中只给出了两个fragments。
图1 Fragmented MP4文件结构
在Fragmented MP4文件中都有三个非常关键的boxes:‘moov’、‘moof’和‘mdat’。
(1)‘moov’(movie metadata box)
和普通MP4文件的‘moov’一样,包含了file-level的metadata信息,用来描述file。
(2)‘mdat’(media data box)
和普通MP4文件的‘mdat’一样,用于存放媒体数据,不同的是普通MP4文件只有一个‘mdat’box,而Fragmented MP4文件中,每个fragment都会有一个‘mdat’类型的box。
(3)‘moof’(movie fragment box)
该类型的box存放的是fragment-level的metadata信息,用于描述所在的fragment。该类型的box在普通的MP4文件中是不存在的,而在Fragmented MP4文件中,每个fragment都会有一个‘moof’类型的box。
一个‘moof’和一个‘mdat’组成Fragmented MP4文件的一个fragment,这个fragment包含一个video track或audio track,并且包含足够的metadata以保证这部分数据可以单独解码。Fragment的结构如图2所示。
图2 Fragment的结构
上面两张图片来自http://alexzambelli.com/blog/2009/02/10/smooth-streaming-architecture
图3是用MP4Info工具查看的一个Fragmented MP4文件的结构,该文件是通过MP4Box工具,通过下面的一个命令转化出来的一个文件。图4是与之对应的普通的MP4文件结构。
#MP4Box -dash 500000 -frag 50000 -rap file_name.mp4
由于设置的时间参数较大,因此得到的Fragmented MP4文件中仅仅包含四个fragments(每个fragment由一对‘moof’和‘mdat’组成)。
图3 MP4Info显示的Fragmented MP4文件结构
图4 MP4Info显示的普通MP4文件结构
转自:http://blog.csdn.net/zhuweigangzwg/article/details/17222951
一、基本概念
1.mp4概述
MP4文件中的所有数据都装在box(QuickTime中为atom)中,也就是说MP4文件由若干个box组成,每个box有类型和长度,可以将box理解为一个数据对象块。box中可以包含另一个box,这种box称为container box。一个MP4文件首先会有且只有一个“ftyp”类型的box,作为MP4格式的标志并包含关于文件的一些信息;之后会有且只有一个“moov”类型的box(Movie Box),它是一种container box,子box包含了媒体的metadata信息;MP4文件的媒体数据包含在“mdat”类型的box(Midia Data Box)中,该类型的box也是container box,可以有多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由metadata进行描述。
2、Box
(1、 mp4文件由许多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里面不包含子Box时,这个Box称为leaf Box,而FullBox是mp4格式协议规定的某些特殊的Box。
Box header的结构用伪代码表示如下:
- aligned(8)classBox (unsignedint(32) boxtype,optional unsignedint(8)[16] extended_type)
- {
- unsigned int(32) size;
- unsigned int(32) type = boxtype;
- if(size==1)
- {
- unsigned int(64) largesize;
- }
- elseif(size==0)
- {
- // box extends to end of file
- }
- if(boxtype==‘uuid’)
- {
- unsigned int(8)[16] usertype = extended_type;
- }
结构如下图:
BOX结构描述图
二、MP4文件格式(ISO-14496-12/14)
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 |
先简单介绍几个重要的box,以便诸位在后续学习时心中有数:
1、 ftyp box,在文件的开始位置,描述的文件的版本、兼容协议等;
2、 moov box,这个box中不包含具体媒体数据,但包含本文件中所有媒体数据的宏观描述信息,moov box下有mvhd和trak box。
>>mvhd中记录了创建时间、修改时间、时间度量标尺、可播放时长等信息。
>>trak中的一系列子box描述了每个媒体轨道的具体信息。
3、 moof box,这个box是视频分片的描述信息。并不是MP4文件必须的部分,但在我们常见的可在线播放的MP4格式文件中(例如Silverlight Smooth Streaming中的ismv文件)确是重中之重。
4、 mdat box,实际媒体数据。我们最终解码播放的数据都在这里面。
5、 mfra box,一般在文件末尾,媒体的索引文件,可通过查询直接定位所需时间点的媒体数据。
附:Smooth Streaming中ismv文件结构,文件分为了多个Fragments,每个Fragment中包含moof和mdat。这样的结构符合渐进式播放需求。(mdat及其描述信息逐步传输,收齐一个Fragment便可播放其中的mdat)。
************************************
** 文件类型ftyp **
************************************
ftyp box 的数据结构的伪代码表示:
- aligned(8)classFileTypeBox extends Box(‘ftyp’)
- {
- unsigned int(32) major_brand;
- unsigned int(32) minor_version;
- unsigned int(32) compatible_brands[];// to end of the box
- }
什么是brands?官方是这样描述的:
Each brand is a printable four-character code, registered with ISO, that identifies a precise specification.//在ISO注册的4个字符。
下表来源于网络,列出了几种常见的基于基础文件格式的,媒体封装格式标识。
更多的内容可以查看http://www.ftyps.com/
Brand | Extension | Mime Type | |
MP4 | mp41, mp42 | .mp4 | video/mp4, audio/mp4, application/mp4 |
3GPP | various, e.g. 3gp4, 3gp5 | .3gp | video/3gpp, audio/3gpp |
3GPP2 | 3g2a | .3g2 | video/3gpp2, audio/3gpp2 |
Motion JPEG 2000 | mjp2 | .mj2 | video/mj2 |
QuickTime | "qt" | .mov | video/quicktime |
结合实际文件,下图是MP4文件起始位置存放的数据
length(4字节):0x0000001c:box的长度是28字节;
boxtype(4字节):0x66747970:“ftyp”的ASCII码,box的标识;
major_brand(4字节):0x69736f6d:“isom“的ASCII码;
minor_version(4字节):0x00000200:ismo的版本号;
compatible_brands(12字节):说明本文件遵从(或称兼容)ismo,iso2,mp41三种协议。
ftyp box通常放在文件的开始,通过对该box解析可以让我们的软件(播放器、demux、解析器)知道应该使用哪种协议对这该文件解析。
************************************
** 元数据moov **
************************************
movie box —— container box whose sub-boxes define the metadata for a presentation (‘moov’)
moov包含的一系列次级box中存储着媒体播放所需的元数据(metadata)。
两点疑问:什么是元数据?moov有哪些次级box?