MP4起源于QuickTime,全名是MPEG-4 Part 14,属于MPEG-4的一部分。这部分内容主要规定了多媒体容器的格式。后来成为”ISO/IEC 14996-14”国际标准, 其中MP4就是对这种标准的一种具体实现,基于这个标准进行扩展或者裁剪还产生了像M4V、F4V等封装格式。
同时MP4目前在移动端的Androids和IOS可以播放,也可以在FlashPlayer播放,跨平台和兼容性最好,MP4 还可以实现快进快放,边下载边播放的效果。
术语:
-
Box:这个概念起源于QuickTime中的atom,也就是说MP4文件就是由一个个Box组成的,可以将其理解为一个数据块,它由Header+Data组成,Data 可以存储媒体元数据和实际的音视频码流数据。Box里面可以直接存储数据块但是也可以包含其它类型的Box,我们把这种Box又称为container box。
-
Sample:简单理解为采样,对于视频可以理解为一帧数据,音频一帧数据就是一段固定时间的音频数据,可以由多个Sample数据组成,简而言之:存储媒体数据的单位是sample。
-
Track:表示一些sample的集合,对于媒体数据而言就是一个视频序列或者音频序列,我们常说的音频轨和视频轨可以对照到这个概念上。当然除了Video Track和Audio Track还可以有非媒体数据,比如Hint Track,这种类型的Track就不包含媒体数据,可以包含一些将其他数据打包成媒体数据的指示信息或者字幕信息。简单来说:Track 就是电影中可以独立操作的媒体单位。
-
Chunk:一个track的连续几个sample组成的单元被称为chunk,每个chunk在文件中有一个偏移量,整个偏移量从文件头算起,在这个chunk内,sample是连续存储的。
这样就可以理解为MP4文件里面有多个Track,一个Track又是由多个Chunk组成,每个Chunk里面包含着一组连续的Sample.正是因为定义了上述几个概念,MP4这种封装格式才容易实现灵活、高效、开放的特性,所以要仔细理解。
MP4整体结构
Box的类型非常多,大概有70多种,但是并不是都是必须的,一般的MP4文件都是含有必须的Box和个别非必须Box,我用MP4info这种工具分析了一首MP4的文件,具体的Box显示如下:
通过上述工具分析出来的结果,我们大概可以总结出MP4以下几个特点:
-
MP4文件就是由一个个Box组成,其中Box还可以相互嵌套,排列紧凑没有多的冗余数据;
-
Box类型并没有很多,主要是由必须的ftyb、mdat、moovz组成,还有free,udta非必须box组成即去掉这两种box对于播放音视频也没有啥影响。
-
Moov一般存储媒体元数据,比较复杂嵌套层次比较深,后面会详细解释各个box的字段含义和组成。
其中每个Box的结构如下:
其中在Box的Header头部,size指定了这个Box所占用的大小,包括了Header部分,一般的头部大小就是8字节,但是如果Box很大,超过了uint32的最大数值,则size被置为1,并用接下来的8字节uint64来表示该Box的大小,这样头部大小就变成16字节了。
正常情况Box不会太大,但是当box里面承载的音视频数据特别是I帧时,有可能Box会很大,除了mdat box,其它的Box都很小。
把上面分析的结果进行简化,可以得到一个基本的MP4完整结构:
这里各个Box承载的数据内容是什么,下面表格先做个大致解释,Box字段以及分析下篇文章做出说明: