本文主要是介绍QuickTime文件格式解析(mov、mp4),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
参考:《MP4文件格式的解析,以及MP4文件的分割算法》
《mov格式解析》
《MOV及MP4文件格式中几个重要的Table》
《Mov文件格式分析》
《QuickTimeFileFormat》
ISO/IEC_14496-12:ISO base media file format
文章目录
- 一、简介
- 二、原子(atom)
- 1、简单原子
- 2、QT原子
- 3、常见的顶层原子类型
- 三、文件结构解析(MP4)
- 1、格式框架
- 2、格式解析
- 2.1 一级box
- 2.1.1 ftyp box
- 2.1.2 moov box
- 2.1.3 free box
- 2.1.4 mdat box
- 2.2 二级box
- 2.2.1 mvhd box
- 2.2.2 trak box
- 2.2.3 udat box
- 2.3 三级box
- 2.3.1 tkhd box
- 2.3.2 mdia box
- 2.4 四级box
- 2.4.1 mdhd box
- 2.4.2 hdlr box
- 2.4.3 minf box
- 2.5 五级box
- 2.5.1 header box
- 2.5.2 stbl box
- 2.6 六级box
- 2.6.1 stsd box
- 2.6.2 stts box
- 2.6.3 stsz box
- 2.6.4 stsc box
- 2.6.5 stss box
- 2.6.6 stco/co64 box
- 2.6.7 ctts box
- 四、数据分析(MOV)
- 五、相关资料
- 1、文档资料
- 2、分析工具
- 六、问题解析
- 1、如何获取总时长
- 2、如何跳播
- 3、在没有关键帧列表情况下如何跳播
- 附录1
- 附录2: ISO/IEC 14496 MPEG的协议标准
- 附录3
一、简介
QuickTime是Apple公司开发的一套完整的多媒体平台架构,可以用来进行多种媒体的创建、生产和分发,并为这一过程提供端到端的支持:包括媒体的实时捕捉,以编程的方式合成媒体,导入和导出现有的媒体,还有编辑和制作,压缩,分发,以及用户回放等多个环节。QuickTime文件格式是QuickTime整个架构体系中的一环,非常基础和重要的一环。QuickTime的多媒体架构应用于Mac OS和Windows系统上,而QuickTime文件格式是平台无关的,可以应用于各类系统。常见的采用QuickTime文件格式的扩展名有:mov, qt, mp4, m4v, m4a, m4p, m4b等。
二、原子(atom)
原子atom是QuickTime用来构建等级数据结构的基本容器。新创建的QuickTime原子就像树的根。随后的每个原子都包含在其中并且包含数据和其它原子。如果一个QuickTime原子包含其它原子,就被叫做父原子,包含在其中的原子就叫做叶原子。
1、简单原子
原子包含一个原子头,原子头后面是原子数据。原子头包含原子的尺寸和类型字段,用于表示原子的字节尺寸和类型信息;它还可能包含一个扩展的尺寸字段,该字段以64位整数的形式给出了一个大原子的尺寸。原子结构如图1所示。
图1 原子结构图
2、QT原子
原子的特点是:简单、抽象。QuickTime文件格式中的所有数据及信息都可以用原子和原子之间的嵌套关系来表达。然而,基本原子的缺点是,当应用程序遇到未知的原子类型(atom type)时,将无法确认该原子是否有下一级的子原子,此种情况下,应用程序即使对子原子类型是已知的,也无法进行解析。
QT原子是一种增强了的数据结构,它提供了一种更加通用的存储格式,并且消除了一些在使用简单原子时会出现的不明确的地方。QT原子中,根原子atom type项统一设置为“sean”。QT原子在简单原子的基础上,增加了原子ID和子原子数目。QT原子的结构如下图2所示。
图2 QT原子结构图
3、常见的顶层原子类型
-
‘moov’
-
‘mdat’
-
‘free’
-
‘junk’
-
‘pnot’
-
‘skip’
-
‘wide’
-
‘pict’
-
‘ftyp’
-
‘uuid’ : Used by Sony’s MSNV brand of MP4
三、文件结构解析(MP4)
MP4(MPEG-4 Part 14)是一种常见的多媒体容器格式,它是在“ISO/IEC 14496-14”标准文件中定义的,属于MPEG-4的一部分,是“ISO/IEC 14496-12(MPEG-4 Part 12 ISO base media file format)”标准中所定义的媒体格式的一种实现,后者定义了一种通用的媒体文件结构标准。MP4是一种描述较为全面的容器格式,被认为可以在其中嵌入任何形式的数据,各种编码的视频、音频等都不在话下,不过我们常见的大部分的MP4文件存放的AVC(H.264)或MPEG-4(Part 2)编码的视频和AAC编码的音频。MP4格式的官方文件后缀名是“.mp4”,还有其他的以mp4为基础进行的扩展或者是缩水版本的格式,包括:M4V, 3GP, F4V等。【1】
1、格式框架
mp4是由一个个“box”组成的,大box中存放小box,一级嵌套一级来存放媒体信息。box的基本结构是:
图3 box基本结构图
其中,size指明了整个box所占用的大小,包括header部分。如果box很大(例如存放具体视频数据的mdat box),超过了uint32的最大数值,size就被设置为1,并用接下来的8字节uint64来存放大小(实际上只有“mdat”类型的box才有可能用到large size),如果size为0,表示该box为文件的最后一个box,文件结尾即为该box结尾。(同样只存在于“mdat”类型的box中。)
一个mp4文件有可能包含非常多的box,在很大程度上增加了解析的复杂性,这个网页上http://mp4ra.org/atoms.html 记录了一些当前注册过的box类型。看到这么多box,如果要全部支持,一个个解析,怕是头都要爆了。还好,大部分mp4文件没有那么多的box类型,下图就是一个简化了的、常见的mp4文件结构:
图4 常见mp4文件结构图
一般来说,解析媒体文件,最关心的部分是视频文件的宽高、时长、码率、编码格式、帧列表、关键帧列表,以及所对应的时间戳和在文件中的位置。这些信息,在mp4中是以特定的算法分开存放在stbl box下属的几个box中的,需要解析stbl下面所有的box来还原媒体信息。下表是对于以上几个重要的box存放信息的说明,更完整的表格可参考MP4BOX.xls文件。
由此可知,要获取到mp4文件的帧列表,还挺不容易的,需要一层层解析,然后综合stts、stsc、stsz、stss、stco等这几个box的信息,才能还原出帧列表,每一帧的时戳和偏移量。而且,你要照顾可能出现或者可能不出现的那些box。。。可以看的出来,mp4把帧sample进行了分组,也就是chunk,需要间接的通过chunk来描述帧,这样做的理由是可以压缩存储空间,缩小媒体信息所占用的文件大小。这里面,stsc box的解析相对来说比较复杂,它用了一种巧妙的方式来说明sample和chunk的映射关系,后面会详细介绍一下。
首先需要说明的是:
1. box中的字节序为网络字节序,也就是大端字节序(Big-Endian),简单的说,就是一个32位的4字节整数存储方式为高位字节在内存的低端。
2. 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的解析进行详细说明:
2.1 一级box
一级box主要包含ftyp、moov、free、mdat等等。
2.1.1 ftyp box
ftyp box,在文件的开始位置,描述的文件的版本、兼容协议等。
/********************************************************************************************
** File Type Box (ftyp)
**
--------------------------------------------------------------------------------------------
** 字段名称 | 长度(bytes) | 有关描述
--------------------------------------------------------------------------------------------
** boxsize | 4 | box的长度
** boxtype | 4 | box的类型
** major_brand | 4 |
** minor_version | 4 | 版本号
** compatible_brands | 4 * N | 本文件遵从的多种协议(ismo, iso2, mp41)
********************************************************************************************/
运行结果:
2.1.2 moov box
moov box,这个box中不包含具体媒体数据,但包含本文件中所有媒体数据的宏观描述信息,moov box下有mvhd和trak box。
结构:
/********************************************************************************************
** 字段名称 | 长度(bytes) | 有关描述
--------------------------------------------------------------------------------------------
** boxsize | 4 | box的长度
** boxtype | 4 | box的类型
*************************************************
这篇关于QuickTime文件格式解析(mov、mp4)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!