MP4视频格式

来源:互联网 发布:微信群推广淘宝客 编辑:程序博客网 时间:2024/04/28 09:45

MP4视频文件封装格式是基于Quick Time容器格式定义的,因此参考QuickTime的格式定义对理解MP4文件格式很有帮助。MP4文件格式是一个十分开放的容器,几乎可以用来描述所有的媒体结构,MP4文件中得媒体描述与数据是分开的,并且媒体数据的组织也很自由,不一定要按照时间顺序排列,甚至媒体数据可以直接引用其他文件。同时,MP4也支持流媒体。MP4目前被广泛用于封装h.264视频和AAC音频,是高清视频的代表。


1.概述

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进行描述。


概念:

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

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

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

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

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


2.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个字符,如“ftype”、“moov”等,这些box type都是已经预定义好的,分别表示固定的意义。如果是“uuid”,表示该box为用户扩展类型。如果box type是未定义的,应该将其忽略。


3.File Type Box(ftype)

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

“ftype”body依次包括1个32位的major brand(4个字符),1个32位的minor version(整数)和1个以32位(4个字符)为单位元素的数组compatible brands。这些都是用来指示文件应用级别的信息。


4.Movie Box(moov)

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

一般情况下,“moov”中会包含1个“mvhd”和若干个“trak”。其中“mvhd”为header box,一般作为“moov”的第一个子box出现(对于其他container box来说,header box都作为首个子box出现)。“track”包含了一个track的相关信息,是一个container box。


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的time scale = 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


4.2Track Box(trak)

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


4.2.1 Track Header Box(tkhd)

“tkhd”结构表

字段 字节数意义

box size 4box大小

box type 4box类型

version 1box版本,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均设置了这两项;对于hint track,该值为0

creation time 4 创建时间(相对于UTC时间1904—01—01零点的秒数)

modification time 4修改时间

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

reserved 4保留位

duration 4track的时间长度

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描述中得实际画面大小比 值,用于播放时的展示宽高


4.2.2 Media Box(media)

“mdia”也是个container box,其子box的结构和种类还是比较复杂的。总体来说,“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 4box大小

box type 4box类型

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

flags 3

creation time 4 创建时间(相对于UTC时间1904—01—01零点的秒数)

modification time 4修改时间

time scale 4同前表

duration 4track的时间长度

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

pre—defined 2


4.2.2.2 Handler Reference Box(hdlr)

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

字段 字节数意义

box size 4box大小

box type 4box类型

version 1box版本,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’结尾的字符串


4.2.2.3 Media Information Box(mind)

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

一般情况下,“minf”包含一个Header box、一个“dinf”和一个“stdl”,其中,Header box根据track type(即media handler type)分为“vmhd”、“smhd”、“hmhd”和“nmhd”,“dinf”为data information box,“stbl”为sample table box。


4.2.2.3.1 Media Information Header Box(vmhd、smhd、hmhd、nmhd)

Video Media Header Box(vmhd)

字段 字节数意义

box size 4box大小

box type 4box类型

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

flags 3

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

opcolor 2X3{red,green,blue}


Sound Media Header Box(smhd)

字段 字节数意义

box size 4box大小

box type 4box类型

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

flags 3

balance 2立体声平衡,【8.8】格式值,一般为0,-1.0表示全部左声道,1.0 表示全部右声道

reserved 2


4.2.2.3.2 Data Information Box(dinf)

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

“dref”的字节结构表:

字段 字节数意义

box size 4box大小

box type 4box类型

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

flags 3

entry count 4“url”或“urn”表的元素个数

“url”或“urn”列表 不定

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


4.2.2.3.3 Sample Table Box(stbl)

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


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

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


Sample Description Box(stsd)

box Header和version字段后会有一个entry count字段,根据entry的个数,每个entry会有type信息,如“vide”、“sund”等,根据type不同sample description会提供不同的信息,例如对于video track,会有“VisualSampleEntry”类型信息,对于audio track会有“AudioSampleEntry”类型信息。

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


Time To Sample Box(stts)

“stts”存储了sample的duration,描述了sample时序的映射方法,我们通过它可以找到任何时间的sample。“stts”可以包含一个压缩的表来映射时间和sample序号,用其他的表来提供每个sample的长度和指针。表中每个条目提供了在同一个时间偏移量里面连续的sample序号,以及sample的偏移量。递增这些偏移量,就可以建立一个完整的time to 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、Media Data Box(mdat)

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

0 0