MP4格式标准
MP4格式标准为ISO-14496 Part 12、ISO-14496 Part 14
基本概念
- MP4文件由许多个Box与FullBox组成
每个Box由Header和Data两部分组成
- FullBox是Box的扩展,其在Box结构的基础上,在Header中增加8位version标志和24位的flags标志
- Header包含了整个Box的长度的大小(size)和类型(type),当size等于0时,代表这个Box是文件的最后一个Box。当size等于1时,说明Box长度需要更多的位来描述,在后面会定义一个64位的largesize用来描述Box的长度。当Type为uuid时,说明这个Box中的数据是用户自定义扩展类型
- Data为Box的实际数据,可以是纯数据,也可以是更多的子Box
因为MP4的标准中描述的moov与mdat的存放位置前后并没有进行强制要求,所以有些时候moov这个Box在mdat的后面,有些时候moov被存放在mdat的前面。在互联网的视频点播中,如果希望MP4文件被快速打开,则需要将moov存放在mdat的前面;如果放在后面,则需要将MP4文件下载完成后才可以进行播放。
在flash播放器中,如果moov存放mdat之后,需要等待整个文件下载完成才能播放。但是使用chrome的video标签播放却无需等待,chroem使用HTTP 206响应至少发出3次请求(服务器得支持范围请求)。一个是用于请求文件头(Content-Length ,Accept-Ranges: bytes),然后是用于请求文件的结尾,一旦客户端从文件结尾获取到moov,他就会请求剩下内容。具体请参考这个例子
1. moov容器
moov容器定义了一个MP4文件中的数据信息,类型是moov,是一个容器Atom,其至少必须包含以下三种Atom中的一种:
- mvhd标签,Movie Header Atom,存放未压缩过的影片信息的头容器
- cmov标签,Compressed Movie Atom,压缩过的电影信息容器,此容器不常用
- rmra标签,Reference Movie Atom,参考电影信息容器,此容器不常用
也可以包含其他容器信息,例如影片剪辑信息Clipping atom(clip)、一个或几个trakAtom(trak)、一个Color Table Atom(ctab)和一个User Data Atom(udta)。
其中,mvhd中定义了多媒体文件的time scale、duration以及displaycharacteristics。而trak中定义了多媒体文件中的一个track的信息,track是多媒体文件中可以独立操作的媒体单位,例如一个音频流就是一个track、一个视频流就是一个track。
2.解析mvhd子容器
mvhd的解析方式如表
3.解析trak子容器
trak容器中定义了媒体文件中的一个track的信息,一个媒体文件中可以包含多个trak,每个trak都是独立的,具有自己的时间和空间占用的信息,每个trak容器都有与它关联的media容器描述信息。trak容器的主要使用目的具体如下。
- 包含媒体数据的引用和描述(media track)
包含modifier track信息
- 流媒体协议的打包信息(hint track),hint track可以引用或者复制对应的媒体采样数据
hint track和modifier track必须保证完整性,同时要与至少一个media track一起存在。
一个trak容器中要求必须要有一个Track Header Atom(tkhd)、一个MediaAtom(mdia),其他的Atom都是可选的,例如如下的atom选项。
- Track剪辑容器:Track Clipping Atom(clip)
- Track 画板容器:Track Matte Atom(matt)
- Edit 容器:Edit Atom(edts)
- Track参考容器:Track Reference Atom(tref)
- Track 配置加载容器:Track Load Settings Atom(load)
- Track 输出映射容器:Track Input Map Atom(imap)
- 用户数据容器:User Data Atom(udta)
4.解析tkhd容器
解析tkhd容器的方式请参考表
5.解析mdia容器
解析完tkhd之后,接下来就可以分析一下trak容器的子容器了。Media Atom的类型是mdia,其必须包含如下容器。
- 一个媒体头:Media Header Atom(mdhd)
- 一个句柄参考:Handler Reference(hdlr)
- 一个媒体信息:Media Infomation(minf)和用户数据User Data Atom(udta)
mdia容器下面包含了三大子容器,分别为mdhd、hdlr和minf
6.解析mdhd容器
mdhd容器被包含在各个track中,描述Media的Header,其包含的信息如表3-10所示。
7.解析hdlr容器
hdlr容器中描述了媒体流的播放过程,该容器中包含的内容如表
8.解析minf容器
minf容器中包含了很多重要的子容器,例如音视频采样等信息相关的容器,minf容器中的信息将作为音视频数据的映射存在,其内容信息具体如下
- 视频信息头:Video Media Information Header(vmhd 子容器)
- 音频信息头:Sound Media Information Header(smhd子容器)
- 数据信息:Data Information(dinf 子容器)
- 采样表:Sample Table(stbl 子容器)
9.解析vmhd容器
vmhd容器内容的格式如表:
10.解析smhd容器
smhd容器的格式如表
11.解析dinf容器
dinf容器是一个用于描述数据信息的容器,其定义的是音视频数据的信息,这是一个容器,它包含子容器dref。下面就来列举一个解析dinf及其子容器dref的例子,dref的解析方式如表
12.解析stbl容器
stbl容器又称为采样参数列表的容器(Sample TableAtom),该容器包含转化媒体时间到实际的sample的信息,也说明了解释sample的信息,例如,视频数据是否需要解压缩、解压缩算法是什么等信息。其所包含的子容器具体如下。
- 采样描述容器:Sample Description Atom(stsd)
- 采样时间容器:Time To Sample Atom(stts)
- 采样同步容器:Sync Sample Atom(stss)
- Chunk采样容器:Sample To Chunk Atom(stsc)
- 采样大小容器:Sample Size Atom(stsz)
- Chunk偏移容器:Chunk Offset Atom(stco)
- Shadow同步容器:Shadow Sync Atom(stsh)
stbl包含track中media sample的所有时间和数据索引,利用这个容器中的sample信息,就可以定位sample的媒体时间,决定其类型、大小,以及如何在其他容器中找到紧邻的sample。如果Sample Table Atom所在的track没有引用任何数据,那么它就不是一个有用的media track,不需要包含任何子Atom。
13.解析edts容器
edts容器定义了创建Movie媒体文件中一个track的一部分媒体,所有的edts数据都在一个表里,包括每一部分的时间偏移量和长度,如果没有该表,那么这个track就会立即开始播放,一个空的edts数据用来定位到track的起始时间偏移位置
至此,MP4文件的格式解析标准已经介绍完毕,按照以上的解析方式,读者将会根据对应的解析方式解析MP4文件,然后读取MP4中的音视频数据和对应的媒体信息。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。