mp4文件格式解析(一)(2010-09-0117:55:04)转载原文标签:分类:多媒体文件标准解析原文地址:mp4文件格式解析(一)作者:可下人间目前MP4的概念被炒得很火,也很乱。最开始MP4指的是音频(MP3的升级版),即MPEG-2AAC标准。随后MP4概念被转移到视频上,对应的是MPEG-4标准。而现在我们流行的叫法,多半是指能播放MPEG-4标准编码格式视频的播放器。但是这篇文章介绍的内容跟上面这些都无关,我们要讨论的是MP4文件封装格式,对应的标准为ISO/IEC14496-12,即信息技术视听对象编码的第12部分:ISO基本媒体文件格式(InformationtechnologyCodingofaudio-visualobjectsPart12:ISObasemediafileformat)。ISO/IEC组织指定的标准一般用数字表示,ISO/IEC14496即MPEG-4标准。MP4视频文件封装格式是基于QuickTime容器格式定义的,因此参考QuickTime的格式定义对理解MP4文件格式很有帮助。MP4文件格式是一个十分开放的容器,几乎可以用来描述所有的媒体结构,MP4文件中的媒体描述与媒体数据是分开的,并且媒体数据的组织也很自由,不一定要按照时间顺序排列,甚至媒体数据可以直接引用其他文件。同时,MP4也支持流媒体。MP4目前被广泛用于封装h.264视频和AAC音频,是高清视频的代表。现在我们就来看看MP4文件格式到底是什么样的。1、概述MP4文件中的所有数据都装在box(QuickTime中为atom)中,也就是说MP4文件由若干个box组成,每个box有类型和长度,可以将box理解为一个数据对象块。box中可以包含另一个box,这种box称为containerbox。一个MP4文件首先会有且只有一个“ftyp”类型的box,作为MP4格式的标志并包含关于文件的一些信息;之后会有且只有一个“moov”类型的box(MovieBox),它是一种containerbox,子box包含了媒体的metadata信息;MP4文件的媒体数据包含在“mdat”类型的box(MidiaDataBox)中,该类型的box也是containerbox,可以有多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由metadata进行描述。下面是一些概念:track表示一些sample的集合,对于媒体数据来说,track表示一个视频或音频序列。hinttrack这个特殊的track并不包含媒体数据,而是包含了一些将其他数据track打包成流媒体的指示信息。sample对于非hinttrack来说,videosample即为一帧视频,或一组连续视频帧,audiosample即为一段连续的压缩音频,它们统称sample。对于hinttrack,sample定义一个或多个流媒体包的格式。sampletable指明sampe时序和物理布局的表。chunk一个track的几个sample组成的单元。在本文中,我们不讨论涉及hint的内容,只关注包含媒体数据的本地MP4文件。下图为一个典型的MP4文件的结构树。2、Box首先需要说明的是,box中的字节序为网络字节序,也就是大端字节序(Big-Endian),简单的说,就是一个32位的4字节整数存储方式为高位字节在内存的低端。Box由header和body组成,其中header统一指明box的大小和类型,body根据类型有不同的意义和格式。标准的box开头的4个字节(32位)为boxsize,该大小包括boxheader和boxbody整个box的大小,这样我们就可以在文件中定位各个box。如果size为1,则表示这个box的大小为largesize,真正的size值要在largesize域上得到。(实际上只有“mdat”类型的box才有可能用到largesize。)如果size为0,表示该box为文件的最后一个box,文件结尾即为该box结尾。(同样只存在于“mdat”类型的box中。)size后面紧跟的32位为boxtype,一般是4个字符,如“ftyp”、“moov”等,这些boxtype都是已经预定义好的,分别表示固定的意义。如果是“uuid”,表示该box为用户扩展类型。如果boxtype是未定义的,应该将其忽略。3、FileTypeBox(ftyp)该box有且只有1个,并且只能被包含在文件层,而不能被其他box包含。该box应该被放在文件的最开始,指示该MP4文件应用的相关信息。“ftyp”body依次包括1个32位的majorbrand(4个字符),1个32位的minorversion(整数)和1个以32位(4个字符)为单位元素的数组compatiblebrands。这些都是用来指示文件应用级别的信息。该box的字节实例如下:4、MovieBox(moov)该box包含了文件媒体的metadata信息,“moov”是一个containerbox,具体内容信息由子box诠释。同FileTypeBox一样,该box有且只有一个,且只被包含在文件层。一般情况下,“moov”会紧随“ftyp”出现。一般情况下(限于篇幅,本文只讲解常见的MP4文件结构),“moov”中会包含1个“mvhd”和若干个“trak”。其中“mvhd”为headerbox,一般作为“moov”的第一个子box出现(对于其他containerbox来说,headerbox都应作为首个子box出现)。“trak”包含了一个track的相关信息,是一个containerbox。下图为部分“moov”的字节实例,其中红色部分为boxheader,绿色为“mvhd”,黄色为一部分“trak”。4.1MovieHeaderBox(mvhd)“mvhd”结构如下表。字段字节数意义boxsize4box大小boxtype4box类型version1box版本,0或1,一般为0。(以下字节数均按version=0)flags3creationtime4创建时间(相对于UTC时间1904-01-01零点的秒数)modificationtime4修改时间timescale4文件媒体在1秒时间内的刻度值,可以理解为1秒长度的时间单元数duration4该track的时间长度,用duration和timescale值可以计算track时长,比如audiotrack的timescale=8000,duration=560128,时长为70.016,videotrack的timescale=600,duration=42000,时长为70rate4推荐播放速率,高16位和低16位分别为小数点整数部分和小数部分,即[16.16]格式,该值为1.0(0x00010000)表示正常前向播放volume2与rate类似,[8.8]格式,1.0(0x0100)表示最大音量reserved10保留位matrix36视频变换矩阵pre-defined24nexttrackid4下一个track使用的id号“mvhd”的字节实例如下图,各字段已经用颜色区分开:4.2TrackBox(trak)“trak”也是一个containerbox,其子box包含了该track的媒体数据引用和描述(hinttrack除外)。一个MP4文件中的媒体可以包含多个track,且至少有一个track,这些track之间彼此独立,有自己的时间和空间信息。“trak”必须包含一个“tkhd”和一个“mdia”,此外还有很多可选的box(略)。其中“tkhd”为trackheaderbox,“mdia”为mediabox,该box是一个包含一些track媒体数据信息box的containerbox。“trak”的部分字节实例如下图,其中黄色为“trak”box的头,绿色为“tkhd”,蓝色为“edts”(一个可选box),红色为一部分“mdia”。mp4文件格式解析(二)(2010-07-1521:26:59)转载标签:mp4it分类:工作•开发4.2.1TrackHeaderBox(tkhd)“tkhd”结构如下表。字段字节数意义boxsize4box大小boxtype4box类型version1box版本,0或1,一般为0。(以下字节数均按version=0)flags3按位或操作结果值,预定义如下:0x000001track_enabled,否则该track不被播放;0x000002track_in_movie,表示该track在播放中被引用;0x000004track_in_preview,表示该track在预览时被引用。一般该值为7,如果一个媒体所有track均未设置track_in_movie和track_in_preview,将被理解为所有track均设置了这两项;对于hinttrack,该值为0creationtime4创建时间(相对于UTC时间1904-01-01零点的秒数)modificationtime4修改时间trackid4id号,不能重复且不能为0reserved4保留位duration4track的时间长度reserved8保留位layer2视频层,默认为0,值小的在上层alternategroup2track分组信息,默认为0表示该track未与其他track有群组关系volume2[8.8]格式,如果为音频track,1.0(0x0100)表示最大音量;否则为0reserved2保留位matrix36视频变换矩阵width4宽height4高,均为[16.16]格式值,与sample描述中的实际画面大小比值,用于播放时的展示宽高“tkhd”的字节实例如下图,各字段已经用颜色区分开:4.2.2MediaBox(mdia)“mdia”也是个containerbox,其子box的结构和种类还是比较复杂的。先来看一个“mdia”的实例结构树图。总体来说,“mdia”定义了track媒体类型以及sample数据,描述sample信息。一般“mdia”包含一个“mdhd”,一个“hdlr”和一个“minf”,其中“mdhd”为mediaheaderbox,“hdlr”为handlerreferencebox,“minf”为mediainformationbox。下面依次看一下这几个box的结构。4.2.2.1MediaHeaderBox(mdhd)“mdhd”结构如下表。字段字节数意义boxsize4box大小boxtype4box类型version1box版本,0或1,一般为0。(以下字节数均按version=0)flags3creationtime4创建时间(相对于UTC时间1904-01-01零点的秒数)modificationtime4修改时间timescale4同前表duration4track的时间长度language2媒体语言码。最高位为0,后面15位为3个字符(见ISO639-2/T标准中定义)pre-defined2“mdhd”的字节实例如下图,各字段已经用颜色区分开:4.2.2.2HandlerReferenceBox(hdlr)“hdlr”解释了媒体的播放过程信息,该box也可以被包含在metabox(meta)中。“hdlr”结构如下表。字段字节数意义boxsize4box大小boxtype4box类型version1box版本,0或1,一般为0。(以下字节数均按version=0)flags3pre-defined4handlertype4在mediabox中,该值为4个字符:“vide”—videotrack“soun”—audiotrack“hint”—hinttrackreserved12name不定tracktypename,以‘\0’结尾的字符串“hdlr”的字节实例如下图,各字段已经