海南网站建设中心,营销型网站建设系统,海外网站,商业空间设计方案原文地址#xff1a;mp4文件格式解析#xff08;一#xff09;作者#xff1a;可下人间目前MP4的概念被炒得很火#xff0c;也很乱。最开始MP4指的是音频#xff08;MP3的升级版#xff09;#xff0c;即MPEG-2 AAC标准。随后MP4概念被转移到视频上#xff0c;对应的是…原文地址mp4文件格式解析一作者可下人间目前MP4的概念被炒得很火也很乱。最开始MP4指的是音频MP3的升级版即MPEG-2 AAC标准。随后MP4概念被转移到视频上对应的是MPEG-4标准。而现在我们流行的叫法多半是指能播放MPEG-4标准编码格式视频的播放器。但是这篇文章介绍的内容跟上面这些都无关我们要讨论的是MP4文件封装格式对应的标准为ISO/IEC 14496-12即信息技术 视听对象编码的第12部分ISO 基本媒体文件格式Information technology Coding of audio-visual objects Part 12: ISO base media file format。ISO/IEC组织指定的标准一般用数字表示ISO/IEC 14496即MPEG-4标准。 MP4视频文件封装格式是基于QuickTime容器格式定义的因此参考QuickTime的格式定义对理解MP4文件格式很有帮助。MP4文件格式是一个十分开放的容器几乎可以用来描述所有的媒体结构MP4文件中的媒体描述与媒体数据是分开的并且媒体数据的组织也很自由不一定要按照时间顺序排列甚至媒体数据可以直接引用其他文件。同时MP4也支持流媒体。MP4目前被广泛用于封装h.264视频和AAC音频是高清视频的代表。 现在我们就来看看MP4文件格式到底是什么样的。 1、概述 MP4文件中的所有数据都装在boxQuickTime中为atom中也就是说MP4文件由若干个box组成每个box有类型和长度可以将box理解为一个数据对象块。box中可以包含另一个box这种box称为container box。一个MP4文件首先会有且只有一个“ftyp”类型的box作为MP4格式的标志并包含关于文件的一些信息之后会有且只有一个“moov”类型的boxMovie Box它是一种container box子box包含了媒体的metadata信息MP4文件的媒体数据包含在“mdat”类型的boxMidia Data Box中该类型的box也是container box可以有多个也可以没有当媒体数据全部引用其他文件时媒体数据的结构由metadata进行描述。 下面是一些概念 track 表示一些sample的集合对于媒体数据来说track表示一个视频或音频序列。 hint track 这个特殊的track并不包含媒体数据而是包含了一些将其他数据track打包成流媒体的指示信息。 sample 对于非hint track来说video sample即为一帧视频或一组连续视频帧audio sample即为一段连续的压缩音频它们统称sample。对于hint tracksample定义一个或多个流媒体包的格式。 sample table 指明sampe时序和物理布局的表。 chunk 一个track的几个sample组成的单元。 在本文中我们不讨论涉及hint的内容只关注包含媒体数据的本地MP4文件。下图为一个典型的MP4文件的结构树。 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个字符如“ftyp”、“moov”等这些box type都是已经预定义好的分别表示固定的意义。如果是“uuid”表示该box为用户扩展类型。如果box type是未定义的应该将其忽略。 3、File Type Boxftyp 该box有且只有1个并且只能被包含在文件层而不能被其他box包含。该box应该被放在文件的最开始指示该MP4文件应用的相关信息。 “ftyp” body依次包括1个32位的major brand4个字符1个32位的minor version整数和1个以32位4个字符为单位元素的数组compatible brands。这些都是用来指示文件应用级别的信息。该box的字节实例如下 4、Movie Boxmoov 该box包含了文件媒体的metadata信息“moov”是一个container box具体内容信息由子box诠释。同File Type Box一样该box有且只有一个且只被包含在文件层。一般情况下“moov”会紧随“ftyp”出现。 一般情况下限于篇幅本文只讲解常见的MP4文件结构“moov”中会包含1个“mvhd”和若干个“trak”。其中“mvhd”为header box一般作为“moov”的第一个子box出现对于其他container box来说header box都应作为首个子box出现。“trak”包含了一个track的相关信息是一个container box。下图为部分“moov”的字节实例其中红色部分为box header绿色为“mvhd”黄色为一部分“trak”。 4.1 Movie Header Boxmvhd “mvhd”结构如下表。 字段 字节数 意义 box size 4 box大小 box type 4 box类型 version 1 box版本0或1一般为0。以下字节数均按version0 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.016video track的time scale 600, duration 42000时长为70 rate 4 推荐播放速率高16位和低16位分别为小数点整数部分和小数部分即[16.16] 格式该值为1.00x00010000表示正常前向播放 volume 2 与rate类似[8.8] 格式1.00x0100表示最大音量 reserved 10 保留位 matrix 36 视频变换矩阵 pre-defined 24 next track id 4 下一个track使用的id号 “mvhd”的字节实例如下图各字段已经用颜色区分开 4.2 Track Boxtrak “trak”也是一个container box其子box包含了该track的媒体数据引用和描述hint track除外。一个MP4文件中的媒体可以包含多个track且至少有一个track这些track之间彼此独立有自己的时间和空间信息。“trak”必须包含一个“tkhd”和一个“mdia”此外还有很多可选的box略。其中“tkhd”为track header box“mdia”为media box该box是一个包含一些track媒体数据信息box的container box。 “trak”的部分字节实例如下图其中黄色为“trak”box的头绿色为“tkhd”蓝色为“edts”一个可选box红色为一部分“mdia”。 4.2.1 Track Header Boxtkhd “tkhd”结构如下表。 字段 字节数 意义 box size 4 box大小 box type 4 box类型 version 1 box版本0或1一般为0。以下字节数均按version0 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 4 id号不能重复且不能为0 reserved 4 保留位 duration 4 track的时间长度 reserved 8 保留位 layer 2 视频层默认为0值小的在上层 alternate group 2 track分组信息默认为0表示该track未与其他track有群组关系 volume 2 [8.8] 格式如果为音频track1.00x0100表示最大音量否则为0 reserved 2 保留位 matrix 36 视频变换矩阵 width 4 宽 height 4 高均为 [16.16] 格式值与sample描述中的实际画面大小比值用于播放时的展示宽高 “tkhd”的字节实例如下图各字段已经用颜色区分开 4.2.2 Media Boxmdia “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 Boxmdhd “mdhd”结构如下表。 字段 字节数 意义 box size 4 box大小 box type 4 box类型 version 1 box版本0或1一般为0。以下字节数均按version0 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 Boxhdlr “hdlr”解释了媒体的播放过程信息该box也可以被包含在meta boxmeta中。“hdlr”结构如下表。 字段 字节数 意义 box size 4 box大小 box type 4 box类型 version 1 box版本0或1一般为0。以下字节数均按version0 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以‘’结尾的字符串 “hdlr”的字节实例如下图各字段已经用颜色区分开 4.2.2.3 Media Information Boxminf “minf”存储了解释track媒体数据的handler-specific信息media handler用这些信息将媒体时间映射到媒体数据并进行处理。“minf”中的信息格式和内容与媒体类型以及解释媒体数据的media handler密切相关其他media handler不知道如何解释这些信息。“minf”是一个container box其实际内容由子box说明。 一般情况下“minf”包含一个header box一个“dinf”和一个“stbl”其中header box根据track type即media handler type分为“vmhd”、“smhd”、“hmhd”和“nmhd”“dinf”为data information box“stbl”为sample table box。下面分别介绍。 下图为“minf”部分字节实例其中红色为box header蓝色为“smhd”绿色为“dinf”黄色为一部分“stbl”。 4.2.2.3.1 Media Information Header Boxvmhd、smhd、hmhd、nmhd Video Media Header Boxvmhd 字段 字节数 意义 box size 4 box大小 box type 4 box类型 version 1 box版本0或1一般为0。以下字节数均按version0 flags 3 graphics mode 4 视频合成模式为0时拷贝原始图像否则与opcolor进行合成 opcolor 2×3 redgreenblue Sound Media Header Boxsmhd 字段 字节数 意义 box size 4 box大小 box type 4 box类型 version 1 box版本0或1一般为0。以下字节数均按version0 flags 3 balance 2 立体声平衡[8.8] 格式值一般为0-1.0表示全部左声道1.0表示全部右声道 reserved 2 Hint Media Header Boxhmhd 略 Null Media Header Boxnmhd 非视音频媒体使用该box略。 4.2.2.3.2 Data Information Boxdinf “dinf”解释如何定位媒体信息是一个container box。“dinf”一般包含一个“dref”即data reference box“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。以下字节数均按version0 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时字符串均为空。 下面是一个“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 Boxstbl “stbl”几乎是普通的MP4文件中最复杂的一个box了首先需要回忆一下sample的概念。sample是媒体数据存储的单位存储在media的chunk中chunk和sample的长度均可互不相同如下图所示。 “stbl”包含了关于track中sample所有时间和位置的信息以及sample的编解码等信息。利用这个表可以解释sample的时序、类型、大小以及在各自存储容器中的位置。“stbl”是一个container box其子box包括sample description boxstsd、time to sample boxstts、sample size boxstsz或stz2、sample to chunk boxstsc、chunk offset boxstco或co64、composition time to sample boxctts、sync sample boxstss等。 “stsd”必不可少且至少包含一个条目该box包含了data reference box进行sample数据检索的信息。没有“stsd”就无法计算media sample的存储位置。“stsd”包含了编码的信息其存储的信息随媒体类型不同而不同。 Sample Description Boxstsd box header和version字段后会有一个entry count字段根据entry的个数每个entry会有type信息如“vide”、“sund”等根据type不同sample description会提供不同的信息例如对于video track会有“VisualSampleEntry”类型信息对于audio track会有“AudioSampleEntry”类型信息。 视频的编码类型、宽高、长度音频的声道、采样等信息都会出现在这个box中。 Time To Sample Boxstts “stts”存储了sample的duration描述了sample时序的映射方法我们通过它可以找到任何时间的sample。“stts”可以包含一个压缩的表来映射时间和sample序号用其他的表来提供每个sample的长度和指针。表中每个条目提供了在同一个时间偏移量里面连续的sample序号以及samples的偏移量。递增这些偏移量就可以建立一个完整的time to sample表。 Sample Size Boxstsz “stsz” 定义了每个sample的大小包含了媒体中全部sample的数目和一张给出每个sample大小的表。这个box相对来说体积是比较大的。 Sample To Chunk Boxstsc 用chunk组织sample可以方便优化数据获取一个thunk包含一个或多个sample。“stsc”中用一个表描述了sample与chunk的映射关系查看这张表就可以找到包含指定sample的thunk从而找到这个sample。 Sync Sample Boxstss “stss”确定media中的关键帧。对于压缩媒体数据关键帧是一系列压缩序列的开始帧其解压缩时不依赖以前的帧而后续帧的解压缩将依赖于这个关键帧。“stss”可以非常紧凑的标记媒体内的随机存取点它包含一个sample序号表表内的每一项严格按照sample的序号排列说明了媒体中的哪一个sample是关键帧。如果此表不存在说明每一个sample都是一个关键帧是一个随机存取点。 Chunk Offset Boxstco “stco”定义了每个thunk在媒体流中的位置。位置有两种可能32位的和64位的后者对非常大的电影很有用。在一个表中只会有一种可能这个位置是在整个文件中的而不是在任何box中的这样做就可以直接在文件中找到媒体数据而不用解释box。需要注意的是一旦前面的box有了任何改变这张表都要重新建立因为位置信息已经改变了。 5、Free Space Boxfree或skip “free”中的内容是无关紧要的可以被忽略。该box被删除后不会对播放产生任何影响。 6、Meida Data Boxmdat 该box包含于文件层可以有多个也可以没有当媒体数据全部为外部文件引用时用来存储媒体数据。数据直接跟在box type字段后面具体数据结构的意义需要参考metadata主要在sample table中描述。 普通MP4文件的结构就讲完了可能会比较乱下面这张图是常见的box的树结构图可以用来大致了解MP4文件的构造。 这篇文章主要面向一些对MP4文件结构没有太多了解的初学者算是篇比较初级的文章本人也是参考了一些资料写出来的对于MP4文件中涉及的一些概念没有太深入的了解因此其中应该是有一些错误理解希望大家抱着批判的眼光读这篇文章。如果有错误的地方还请大家不吝赐教。该文主要参考了标准和网友wqyuwss的blog系列文章mp4文件格式