QuickTime格式解析

1、概述

QuickTime文件中的所有数据都装在box中,也就是说QuickTime文件由若干个box组成,每个box有类型和长度,可以将box理解为一个数据对象块。box中可以包含另一个box,这种box称为containerbox。一个QuickTime文件首先会有且只有一个“ftyp”类型的box,作为QuickTime格式的标志并包含关于文件的一些信息;之后会有且只有一个“moov”类型的box(MovieBox),它是一种containerbox,子box包含了媒体的metadata信息;QuickTime文件的媒体数据包含在“mdat”类型的box(Midia DataBox)中,该类型的box也是containerbox,可以有多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由metadata进行描述。

QuickTime格式的文件后缀有mov,qt,mp4,m4v,m4a,m4p,m4b等。下面就以MP4文件为例来加以说明。

下面是一些概念:

track 表示一些sample的集合,对于媒体数据来说,track表示一个视频或音频序列。

hint track 这个特殊的track并不包含媒体数据,而是包含了一些将其他数据track打包成流媒体的指示信息。

sample  对于非hinttrack来说,video sample即为一帧视频,或一组连续视频帧,audiosample即为一段连续的压缩音频,它们统称sample。对于hint track,sample定义一个或多个流媒体包的格式。

sample table 指明sampe时序和物理布局的表。

chunk 一个track的几个sample组成的单元。

在本文中,我们不讨论涉及hint的内容,只关注包含媒体数据的文件。下图为一个典型的MP4文件的结构树。

2、Box

首先需要说明的是,box中的字节序为网络字节序,也就是大端字节序(Big-Endian),简单的说,就是一个32位的4字节整数存储方式为高位字节在内存的低端。Box由header和body组成,其中header统一指明box的大小和类型,body根据类型有不同的意义和格式。

标准的box开头的4个字节(32位)为boxsize,该大小包括box header和boxbody整个box的大小,这样我们就可以在文件中定位各个box。如果size为1,则表示这个box的大小为largesize,真正的size值要在largesize域上得到。(实际上只有“mdat”类型的box才有可能用到largesize。)如果size为0,表示该box为文件的最后一个box,文件结尾即为该box结尾。(同样只存在于“mdat”类型的box中。)

size后面紧跟的32位为box type,一般是4个字符,如“ftyp”、“moov”等,这些boxtype都是已经预定义好的,分别表示固定的意义。如果是“uuid”,表示该box为用户扩展类型。如果boxtype是未定义的,应该将其忽略。

3、File Type Box(ftyp)

该box有且只有1个,并且只能被包含在文件层,而不能被其他box包含。该box应该被放在文件的最开始,指示该MP4文件应用的相关信息。

“ftyp”body依次包括1个32位的major brand(4个字符),1个32位的minorversion(整数)和1个以32位(4个字符)为单位元素的数组compatiblebrands。这些都是用来指示文件应用级别的信息。该box的字节实例如下:

4、Movie Box(moov)

该box包含了文件媒体的metadata信息,“moov”是一个container box,具体内容信息由子box诠释。同FileType Box一样,该box有且只有一个,且只被包含在文件层。一般情况下,“moov”会紧随“ftyp”出现。

一般情况下(限于篇幅,本文只讲解常见的MP4文件结构),“moov”中会包含1个“mvhd”和若干个“trak”。其中“mvhd”为headerbox,一般作为“moov”的第一个子box出现(对于其他container box来说,headerbox都应作为首个子box出现)。“trak”包含了一个track的相关信息,是一个containerbox。下图为部分“moov”的字节实例,其中红色部分为boxheader,绿色为“mvhd”,黄色为一部分“trak”。

4.1 Movie Header Box(mvhd)

“mvhd”结构如下表。

字段

字节数

意义

box size

4

box大小

box type

4

box类型

version

1

box版本,0或1,一般为0。(以下字节数均按version=0)

flags

3

creation time

4

创建时间(相对于UTC时间1904-01-01零点的秒数)

modification time

4

修改时间

time scale

4

文件媒体在1秒时间内的刻度值,可以理解为1秒长度的时间单元数

duration

4

该track的时间长度,用duration和time scale值可以计算track时长,比如audio track的timescale = 8000, duration = 560128,时长为70.016,video track的time scale =600, duration = 42000,时长为70

rate

4

推荐播放速率,高16位和低16位分别为小数点整数部分和小数部分,即[16.16]格式,该值为1.0(0x00010000)表示正常前向播放

volume

2

与rate类似,[8.8] 格式,1.0(0x0100)表示最大音量

reserved

10

保留位

matrix

36

视频变换矩阵

pre-defined

24

next track id

4

下一个track使用的id号

“mvhd”的字节实例如下图,各字段已经用颜色区分开:

4.2 Track Box(trak)

“trak”也是一个container box,其子box包含了该track的媒体数据引用和描述(hinttrack除外)。一个MP4文件中的媒体可以包含多个track,且至少有一个track,这些track之间彼此独立,有自己的时间和空间信息。“trak”必须包含一个“tkhd”和一个“mdia”,此外还有很多可选的box(略)。其中“tkhd”为trackheader box,“mdia”为media box,该box是一个包含一些track媒体数据信息box的containerbox。

“trak”的部分字节实例如下图,其中黄色为“trak”box的头,绿色为“tkhd”,蓝色为“edts”(一个可选box),红色为一部分“mdia”。

4.2.1 Track Header Box(tkhd)

“tkhd”结构如下表。

字段

字节数

意义

box size

4

box大小

box type

4

box类型

version

1

box版本,0或1,一般为0。(以下字节数均按version=0)

flags

3

按位或操作结果值,预定义如下:

0x000001 track_enabled,否则该track不被播放;

0x000002 track_in_movie,表示该track在播放中被引用;

0x000004 track_in_preview,表示该track在预览时被引用。

一般该值为7,如果一个媒体所有track均未设置track_in_movie和track_in_preview,将被理解为所有track均设置了这两项;对于hinttrack,该值为0

creation time

4

创建时间(相对于UTC时间1904-01-01零点的秒数)

modification time

4

修改时间

track id

4

id号,不能重复且不能为0

reserved

4

保留位

duration

4

track的时间长度

reserved

8

保留位

layer

2

视频层,默认为0,值小的在上层

alternate group

2

track分组信息,默认为0表示该track未与其他track有群组关系

volume

2

[8.8] 格式,如果为音频track,1.0(0x0100)表示最大音量;否则为0

reserved

2

保留位

matrix

36

视频变换矩阵

width

4

height

4

高,均为 [16.16] 格式值,与sample描述中的实际画面大小比值,用于播放时的展示宽高

“tkhd”的字节实例如下图,各字段已经用颜色区分开:

4.2.2 Media Box(mdia)

“mdia”也是个container box,其子box的结构和种类还是比较复杂的。先来看一个“mdia”的实例结构树图。

总体来说,“mdia”定义了track媒体类型以及sample数据,描述sample信息。一般“mdia”包含一个“mdhd”,一个“hdlr”和一个“minf”,其中“mdhd”为media header box,“hdlr”为handler reference box,“minf”为media information box。下面依次看一下这几个box的结构。

4.2.2.1 Media Header Box(mdhd)

“mdhd”结构如下表。

字段

字节数

意义

box size

4

box大小

box type

4

box类型

version

1

box版本,0或1,一般为0。(以下字节数均按version=0)

flags

3

creation time

4

创建时间(相对于UTC时间1904-01-01零点的秒数)

modification time

4

修改时间

time scale

4

同前表

duration

4

track的时间长度

language

2

媒体语言码。最高位为0,后面15位为3个字符(见ISO 639-2/T标准中定义)

pre-defined

2

“mdhd”的字节实例如下图,各字段已经用颜色区分开:

4.2.2.2 Handler Reference Box(hdlr)

“hdlr”解释了媒体的播放过程信息,该box也可以被包含在meta box(meta)中。“hdlr”结构如下表。

字段

字节数

意义

box size

4

box大小

box type

4

box类型

version

1

box版本,0或1,一般为0。(以下字节数均按version=0)

flags

3

pre-defined

4

handler type

4

在media box中,该值为4个字符:

“vide”— video track

“soun”— audio track

“hint”— hint track

reserved

12

name

不定

track type name,以‘\0’结尾的字符串

“hdlr”的字节实例如下图,各字段已经用颜色区分开:

4.2.2.3 Media Information Box(minf)

“minf”存储了解释track媒体数据的handler-specific信息,mediahandler用这些信息将媒体时间映射到媒体数据并进行处理。“minf”中的信息格式和内容与媒体类型以及解释媒体数据的mediahandler密切相关,其他media handler不知道如何解释这些信息。“minf”是一个containerbox,其实际内容由子box说明。

一般情况下,“minf”包含一个header box,一个“dinf”和一个“stbl”,其中,header box根据tracktype(即media handler type)分为“vmhd”、“smhd”、“hmhd”和“nmhd”,“dinf”为datainformation box,“stbl”为sample table box。下面分别介绍。

下图为“minf”部分字节实例,其中红色为boxheader,蓝色为“smhd”,绿色为“dinf”,黄色为一部分“stbl”。

4.2.2.3.1 Media Information HeaderBox(vmhd、smhd、hmhd、nmhd)

Video Media Header Box(vmhd)

字段

字节数

意义

box size

4

box大小

box type

4

box类型

version

1

box版本,0或1,一般为0。(以下字节数均按version=0)

flags

3

graphics mode

4

视频合成模式,为0时拷贝原始图像,否则与opcolor进行合成

opcolor

2×3

{red,green,blue}

Sound Media Header Box(smhd)

字段

字节数

意义

box size

4

box大小

box type

4

box类型

version

1

box版本,0或1,一般为0。(以下字节数均按version=0)

flags

3

balance

2

立体声平衡,[8.8] 格式值,一般为0,-1.0表示全部左声道,1.0表示全部右声道

reserved

2

Hint Media Header Box(hmhd)

Null Media Header Box(nmhd)

非视音频媒体使用该box,略。

4.2.2.3.2 Data Information Box(dinf)

“dinf”解释如何定位媒体信息,是一个container box。“dinf”一般包含一个“dref”,即datareferencebox;“dref”下会包含若干个“url”或“urn”,这些box组成一个表,用来定位track数据。简单的说,track可以被分成若干段,每一段都可以根据“url”或“urn”指向的地址来获取数据,sample描述中会用这些片段的序号将这些片段组成一个完整的track。一般情况下,当数据被完全包含在文件中时,“url”或“urn”中的定位字符串是空的。

“dref”的字节结构如下表。

字段

字节数

意义

box size

4

box大小

box type

4

box类型

version

1

box版本,0或1,一般为0。(以下字节数均按version=0)

flags

3

entry count

4

“url”或“urn”表的元素个数

“url”或“urn”列表

不定

“url”或“urn”都是box,“url”的内容为字符串(location string),“urn”的内容为一对字符串(name string and locationstring)。当“url”或“urn”的box flag为1时,字符串均为空。

下面是一个“dinf”的字节实例图。其中黄色为“dinf”的box header,由红色部分我们知道包含的“url”或“urn”个数为1,红色后面为“url”box的内容。紫色为“url”的box header(根据box type我们知道是个“url”),绿色为box flag,值为1,说明“url”中的字符串为空,表示track数据已包含在文件中。

4.2.2.3.3 Sample Table Box(stbl)

“stbl”几乎是普通的MP4文件中最复杂的一个box了,首先需要回忆一下sample的概念。sample是媒体数据存储的单位,存储在media的chunk中,chunk和sample的长度均可互不相同,如下图所示。

“stbl”包含了关于track中sample所有时间和位置的信息,以及sample的编解码等信息。利用这个表,可以解释sample的时序、类型、大小以及在各自存储容器中的位置。“stbl”是一个containerbox,其子box包括:sample description box(stsd)、time to samplebox(stts)、sample size box(stsz或stz2)、sample to chunkbox(stsc)、chunk offset box(stco或co64)、composition time to samplebox(ctts)、sync sample box(stss)等。

“stsd”必不可少,且至少包含一个条目,该box包含了datareference box进行sample数据检索的信息。没有“stsd”就无法计算mediasample的存储位置。“stsd”包含了编码的信息,其存储的信息随媒体类型不同而不同。

Sample Description Box(stsd)

boxheader和version字段后会有一个entrycount字段,根据entry的个数,每个entry会有type信息,如“vide”、“sund”等,根据type不同sampledescription会提供不同的信息,例如对于videotrack,会有“VisualSampleEntry”类型信息,对于audiotrack会有“AudioSampleEntry”类型信息。

视频的编码类型、宽高、长度,音频的声道、采样等信息都会出现在这个box中。

Time To Sample Box(stts)

“stts”存储了sample的duration,描述了sample时序的映射方法,我们通过它可以找到任何时间的sample。“stts”可以包含一个压缩的表来映射时间和sample序号,用其他的表来提供每个sample的长度和指针。表中每个条目提供了在同一个时间偏移量里面连续的sample序号,以及samples的偏移量。递增这些偏移量,就可以建立一个完整的timeto sample表。

Sample Size Box(stsz)

“stsz”定义了每个sample的大小,包含了媒体中全部sample的数目和一张给出每个sample大小的表。这个box相对来说体积是比较大的。

Sample To Chunk Box(stsc)

用chunk组织sample可以方便优化数据获取,一个thunk包含一个或多个sample。“stsc”中用一个表描述了sample与chunk的映射关系,查看这张表就可以找到包含指定sample的thunk,从而找到这个sample。

Sync Sample Box(stss)

“stss”确定media中的关键帧。对于压缩媒体数据,关键帧是一系列压缩序列的开始帧,其解压缩时不依赖以前的帧,而后续帧的解压缩将依赖于这个关键帧。“stss”可以非常紧凑的标记媒体内的随机存取点,它包含一个sample序号表,表内的每一项严格按照sample的序号排列,说明了媒体中的哪一个sample是关键帧。如果此表不存在,说明每一个sample都是一个关键帧,是一个随机存取点。

Chunk Offset Box(stco)

“stco”定义了每个thunk在媒体流中的位置。位置有两种可能,32位的和64位的,后者对非常大的电影很有用。在一个表中只会有一种可能,这个位置是在整个文件中的,而不是在任何box中的,这样做就可以直接在文件中找到媒体数据,而不用解释box。需要注意的是一旦前面的box有了任何改变,这张表都要重新建立,因为位置信息已经改变了。

5、Free Space Box(free或skip)

“free”中的内容是无关紧要的,可以被忽略。该box被删除后,不会对播放产生任何影响。

6、Meida Data Box(mdat)

该box包含于文件层,可以有多个,也可以没有(当媒体数据全部为外部文件引用时),用来存储媒体数据。数据直接跟在boxtype字段后面,具体数据结构的意义需要参考metadata(主要在sample table中描述)。

普通MP4文件的结构就讲完了,可能会比较乱,下面这张图是常见的box的树结构图,可以用来大致了解MP4文件的构造。

这篇文章以MP4为例来解析QuickTime格式的结构,其他QuickTime格式的扩展也都和MP4类似。如有需要标准的QuickTime格式文档,请留言。

原文链接:http://blog.sina.com.cn/s/blog_48f93b530100jz4b.html

QuickTime格式解析相关推荐

  1. 视频基础知识:告别菜鸟 高清视频编码及封装格式解析

    告别菜鸟 高清视频编码及封装格式解析 在如今的互联网时代,对于全高清视频文件来说,非常容易获取.不像以前在拨号上网的年代,可谓是资源匮乏,平时电脑看个VCD,就已经觉得是比较出色的画质了.时代在发展, ...

  2. 转:YUV RGB 常见视频格式解析

    转: http://www.cnblogs.com/qinjunni/archive/2012/02/23/2364446.html YUV RGB 常见视频格式解析 I420是YUV格式的一种,而Y ...

  3. 【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )

    文章目录 安卓直播推流专栏博客总结 一. AAC 音频格式解析 二. FLV 音频数据标签解析 1. 分析 FLV 格式中的 AAC 音频格式数据 2. AAC 音频特殊配置 3. AAC 音频数据标 ...

  4. java 解析日期格式_日期/时间格式/解析,Java 8样式

    java 解析日期格式 自Java 几乎 开始以来,Java开发人员就通过java.util.Date类(自JDK 1.0起)和java.util.Calendar类(自JDK 1.1起 )来处理日期 ...

  5. 日期/时间格式/解析,Java 8样式

    自Java 几乎 开始以来,Java开发人员就通过java.util.Date类(自JDK 1.0起)和java.util.Calendar类(自JDK 1.1起 )来处理日期和时间. 在这段时间内, ...

  6. QuickTime文件格式解析

    QuickTime文件格式解析 Peter Lee 2008-06-14 一.简介 QuickTime是Apple公司开发的一套完整的多媒体平台架构,可以用来进行多种媒体的创建,生产,和分发,并为这一 ...

  7. 3D模型格式解析(OBJ)

    文章目录 OBJ格式解析 一.OBJ格式 二.vtkOBJReader源码解析 1.主要部分 总结 OBJ格式解析 通过解读vtk源码中对OBJ文件的读取代码,讲解如何获取obj模型的顶点(verte ...

  8. c语言组json包,json格式解析和libjson的用法介绍(关于cjson的使用方法)

    在阅读本文之前,请先阅读下<Rss Reader实例开发之系统设计>一文. Rss Reader实例开发中,进行网络数据交换时主要使用到了两种数据格式:JSON与XML.本文主要介绍JSO ...

  9. mysql binlog c++_MySQL binlog的格式解析

    我搜集到了一些资料,对理解代码比较有帮助. 在头文件中binlog_event.h中,有描述 class Log_event_header class Log_event_footer 参见[Myst ...

  10. JSON格式解析和libjson使用简介-转

    Rss Reader实例开发中,进行网络数据交换时主要使用到了两种数据格式:JSON与XML.本文主要介绍JSON格式的简单概念及JSON在Rss Reader中的应用. JSON格式解析和libjs ...

最新文章

  1. oracle数据库【表复制】insert into select from跟create table as select * from 两种表复制语句区别...
  2. Oracle中日期Date类型格式的转化
  3. K8s 文档增加反种族歧视声明 | 云原生生态周报 Vol. 54
  4. boost::fusion::fused_procedure用法的测试程序
  5. 配置mysql数据库时出再错误:LookupError No installed app with label admin(亲测)
  6. iOS开发UI篇—实现一个私人通讯录小应用(二)
  7. BZOJ3638|CodeForces 280D k-Maximum Subsequence Sum
  8. 2.2. MongoDB 管理
  9. Spring的组件自动扫描机制
  10. C++ std::map sort 如何按值排序 自定义比较函数 比较对象某个字段
  11. oracle 获取当前用户下的所有表名与字段信息
  12. vivo android 刷机教程,VIVOX21原厂官方固件刷机教程_线刷|救砖教程图解
  13. 电路串联和并联图解_初三物理串联和并联电路知识大全
  14. [经验分享] 【统计小百科】你知道AIC准则么?
  15. cin.get()的用法
  16. Pr零基础入门指南笔记四
  17. Centos Piranha安装过程
  18. Java编程思想学习(五)----第5章:初始化与清理
  19. 用PS画出少女脸颊红晕
  20. Chrome将网页保存为图片、PDF

热门文章

  1. 四代增强方式和Enhancement查找方法
  2. 《平凡的世界》读后感
  3. unity详细解决visualstudio未能找到类型或命明空间名问题
  4. Sphinx使用方法
  5. 教给大家:怎样给电脑分盘。
  6. 一般信道容量迭代算法c语言,(信息论编码)信道容量迭代算法
  7. 计算机屏幕上一致出现菜单解锁,解决方法:如何解锁计算机显示器菜单
  8. Jupyter Notebook又一懒人神器,拖拽生成Python代码!
  9. 移动端cpu天梯图2020_台式机CPU天梯图(十月)
  10. 第一届全国区块链和分布式记账技术标准化技术委员会 委员名单