MP4结构分析
一、MP4
MP4(MPEG-4 Part14)是一种常见的多媒体容器格式,是在“ISO/IEC 14496-14”标准文件中定义的。
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进行描述。
1.1 Box
box中的字节序为网络字节序,也就是大端字节序(Big-Endian),简单的说,就是一个32位的4字节整数存储方式为高位字节在内存的低端。Box由header和body组成,其中header统一指明box的大小和类型,body根据类型有不同的意义和格式。
标准的box开头的4个字节(32位)为box size,该大小包括box header和box body整个box的大小,这样我们就可以在文件中定位各个box。如果size为1,则表示这个box的大小为large size,真正的size值要在largesize域上得到。(实际上只有“mdat”类型的box才有可能用到large size。)如果size为0,表示该box为文件的最后一个box,文件结尾即为该box结尾。(同样只存在于“mdat”类型的box中)
size后面紧跟的32位为box type,一般是4个字符,如“ftyp”、“moov”等,这些box type都是已经预定义好的,分别表示固定的意义。如果是“uuid”,表示该box为用户扩展类型。如果box type是未定义的,应该将其忽略。
先简单介绍几个重要的box,以便诸位在后续学习时心中有数:
- ftyp box,在文件的开始位置,描述的文件的版本、兼容协议等;
- moov box,这个box中不包含具体媒体数据,但包含本文件中所有媒体数据的宏观描述信息,moov box下有mvhd和trak box;
mvhd中记录了创建时间、修改时间、时间度量标尺、可播放时长等信息;
trak中的一系列子box描述了每个媒体轨道的具体信息 - moof box,这个box是视频分片的描述信息。并不是MP4文件必须的部分,但在我们常见的可在线播放的MP4格式文件中(例如Silverlight Smooth Streaming中的ismv文件)确是重中之重;
- mdat box,实际媒体数据。我们最终解码播放的数据都在这里面;
- mfra box,一般在文件末尾,媒体的索引文件,可通过查询直接定位所需时间点的媒体数据。
附:Smooth Streaming中ismv文件结构,文件分为了多个Fragments,每个Fragment中包含moof和mdat。这样的结构符合渐进式播放需求。(mdat及其描述信息逐步传输,收齐一个Fragment便可播放其中的mdat)。
1.2 ftyp box
这种box一般情况下都会出现在mp4文件的开头,它可以作为mp4容器格式的可表示信息。就像flv头’F’ ‘L’ ‘V’ 3字节,MKV头部的1A 45 DF A3 、ASF_Header_Object 可以作为ASF容器格式的可辨识信息一样。
aligned(8) class FileTypeBox
extends Box('type'){
unsigned int(32) major_brand;
unsigned int(32) minor_version;
unsigned int(32) compatible_brands[];// to the end of the box
}
什么是brands?官方是这样描述的:
Each brand is a printable four-character code, registered with ISO, that identifies a precise specification.//在ISO注册的4个字符。
下表来源于网络,列出了几种常见的基于基础文件格式的,媒体封装格式标识。
1.3 movie box(moov)
movie box —— container box whose sub-boxes define the metadata for a presentation (‘moov’)
moov包含的一系列次级box中存储着媒体播放所需的元数据(metadata)。
元数据为描述数据的数据。视频包括编码等级、分辨率、色域、码率、帧率、位深、时长等等……音频又包括声道、采样率等音频特有属性。
1.3.1 movie header box(mvhd)
This box defines overall information which is media-independent, and relevant to the entire presentation.
全文件唯一的(一个文件中只能包含一个mvhd box),对整个文件所包含的媒体数据作全面的全局的描述。包含了媒体的创建与修改时间时间刻度、默认音量、色域、时长等信息。
duration / timescale = 可播放时长(s)
1.3.2 Track Box(trak)
This is a container box for a single track of a presentation. A presentation consists of one or more tracks. Each track is independent of the other tracks in the presentation and carries its own temporal and spatial information. Each track will contain its associated Media Box.
例如,《让子弹飞》的正版DVD,1)有一条视频轨用于电影画面。2)至少有两条音频轨分别提供了普通话与四川话版,实际上为了营造更加逼真的现场效果,为了配合多声道家庭影院该影片还独有一条音效轨。3)多条字幕轨,简体中文,繁体中文,英文……。从中我们可以理解为什么trak box可以有多个:每个track都是独立的,具有自我特征与属性的,因此需要各自描述互不干涉。
tkhd(track header)
Media Box(mdia)
包括Media Header Box(mdhd)、Handler Reference Box(hdlr)(这个box里面,可以获得这个track的类型信息handler_type)、Media Information Box(minf)( minf 里包含着一系列的box。里面是track有关的特征信息。
一般情况minf 包含:Media Information Header Boxes、Data Information Box(dinf)、Sample Table Box。
Media Information Header Boxes 根据类型分‘vmhd’, ‘smhd’, ’hmhd’, ‘nmhd’)。
二、工具
想真正了解mp4文件格式的话,有一个开源工具项目可以学习:mp4 explorer。一方面,这个工具可以按MPEG-4标准去解析mp4文件,直观上帮助大家去看mp4文件的格式。另一方面,认真学习其代码,就可以了解mp4文件是如何被存取和访问的,对致力于底层研究的同学是个福音。其官网:Mp4 Explorer。
上一篇: python夯实基础日记-函数详解
推荐阅读
-
android中Bitmap用法(显示,保存,缩放,旋转)实例分析
-
Java之String、StringBuffer、StringBuilder的区别分析
-
关于Android WebView的loadData方法的注意事项分析
-
Android判断服务是否运行及定位问题实例分析
-
Android中Service实时向Activity传递数据实例分析
-
Android中home键和back键区别实例分析
-
Android中Spinner控件之键值对用法实例分析
-
rabbitmq可视化工具数据分析(sqlite数据库可视化工具)
-
wireshark数据包分析实战pdf(数据包内容解析)
-
php前景分析(行业发展现状及前景分析)