QuickTime文件格式解析(mov、mp4)

本文深入探讨QuickTime文件格式,重点关注MOV和MP4的结构。介绍了原子(atom)的概念,包括简单原子和QT原子,以及常见的顶层原子类型。详细解析了MP4文件的box结构,从一级到六级box的组成和功能,如ftyp、moov、mdat、stbl等,以及如何通过stts、stsc、stsz等box获取媒体信息。此外,文章还讨论了数据分析、问题解析,如获取总时长和跳播方法,并提供了相关资料链接。
摘要由CSDN通过智能技术生成

参考:《MP4文件格式的解析,以及MP4文件的分割算法》
   《mov格式解析》
   《MOV及MP4文件格式中几个重要的Table》
   《Mov文件格式分析》
   《QuickTimeFileFormat》
   ISO/IEC_14496-12:ISO base media file format

一、简介

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 原子结构图
图1 原子结构图

2、QT原子

原子的特点是:简单、抽象。QuickTime文件格式中的所有数据及信息都可以用原子和原子之间的嵌套关系来表达。然而,基本原子的缺点是,当应用程序遇到未知的原子类型(atom type)时,将无法确认该原子是否有下一级的子原子,此种情况下,应用程序即使对子原子类型是已知的,也无法进行解析。

QT原子是一种增强了的数据结构,它提供了一种更加通用的存储格式,并且消除了一些在使用简单原子时会出现的不明确的地方。QT原子中,根原子atom type项统一设置为“sean”。QT原子在简单原子的基础上,增加了原子ID和子原子数目。QT原子的结构如下图2所示。

图2 QT原子结构图
图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的类型
********************************************************************************************/
2.1.3 free box

结构:

/********************************************************************************************
**        字段名称            |    长度(bytes)   |        有关描述
--------------------------------------------------------------------------------------------
**        boxsize            |    4             |        box的长度
**        boxtype            |    4             |        box的类型
********************************************************************************************/
2.1.4 mdat box

mdat box,实际媒体数据。我们最终解码播放的数据都在这里面。

结构:

/********************************************************************************************
**        字段名称             |    长度(bytes)    |        有关描述
--------------------------------------------------------------------------------------------
**        boxsize             |    4              |        box的长度
**        boxtype             |    4              |        box的类型
**                                                |        后面全是真实数据
********************************************************************************************/

运行结果:
在这里插入图片描述

2.2 二级box

本节所说的二级box皆为moov的子box,主要包含mvhd、trak、udat等等。

2.2.1 mvhd box

mvhd中记录了创建时间、修改时间、时间度量标尺、可播放时长等信息。

结构:

/************************************************************************************************************
**                                            mvhd
**
--------------------------------------------------------------------------------------------
**        字段名称              |    长度(bytes)   |        有关描述
--------------------------------------------------------------------------------------------
**        boxsize                |    4            |        box的长度
**        boxtype                |    4            |        box的类型
**        version                |    1            |        box版本,0或1,一般为0(以下字节数均按version = 0)
**        flags                  |    3            |        
**        creation time          |    4            |        创建时间(相对于UTC时间1904 - 01 - 01零点的秒数)
**        modification time  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值