mp4文件格式解析(一)

原文地址: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 14496MPEG-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称为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  指明sampe时序和物理布局的表。

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

    在本文中,我们不讨论涉及hint的内容,只关注包含媒体数据的本地MP4文件。下图为一个典型的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是未定义的,应该将其忽略。

3File Type Boxftyp

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

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

[转载]mp4文件格式解析(一)

4Movie 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”。

[转载]mp4文件格式解析(一)

4.1 Movie Header Boxmvhd

    “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号

 

   

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

[转载]mp4文件格式解析(一)

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。(以下字节数均按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

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”的字节实例如下图,各字段已经用颜色区分开:

[转载]mp4文件格式解析(二)


4.2.2 Media Boxmdia

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

[转载]mp4文件格式解析(二)


       总体来说,“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。(以下字节数均按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”的字节实例如下图,各字段已经用颜色区分开:

[转载]mp4文件格式解析(二)

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。(以下字节数均按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,以‘’结尾的字符串

 

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

[转载]mp4文件格式解析(二)


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”。

[转载]mp4文件格式解析(二)

4.2.2.3.1 Media Information Header Boxvmhdsmhdhmhdnmhd

Video Media Header Boxvmhd 

字段

字节数

意义

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 Boxsmhd 

字段

字节数

意义

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 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。(以下字节数均按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 flag1时,字符串均为空。

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

[转载]mp4文件格式解析(三)

4.2.2.3.3 Sample Table Boxstbl

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

[转载]mp4文件格式解析(三)

    “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序号,以及samples的偏移量。递增这些偏移量,就可以建立一个完整的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有了任何改变,这张表都要重新建立,因为位置信息已经改变了。

5Free Space Boxfreeskip

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

6Meida Data Boxmdat

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

 

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

[转载]mp4文件格式解析(四)

   

    这篇文章主要面向一些对MP4文件结构没有太多了解的初学者,算是篇比较初级的文章,本人也是参考了一些资料写出来的,对于MP4文件中涉及的一些概念没有太深入的了解,因此其中应该是有一些错误理解,希望大家抱着批判的眼光读这篇文章。如果有错误的地方,还请大家不吝赐教。该文主要参考了标准和网友wqyuwssblog系列文章:mp4文件格式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shiro身份验证测试

2019独角兽企业重金招聘Python工程师标准>>> 一、登录验证 1、首先在shiro.ini里准备一些用户身份/凭据,后面这里会使用数据库代替,如: [users] [main] #realm jdbcRealmcom.learnging.system.shiro.ShiroRealm securityManager…

shell if多个条件判断_萌新关于Excel VBA中IF条件判断语句的一点心得体会

作者:金人瑞 《Excel VBA175例无理论纯实战教程》学员最近正在学习郑广学老师的VBA 175例教程,这是一篇新手向的文章,也是一个新手的总结,高手可以批评文章中的不足之处,也可以无视,VBA中的IF判断, 判断一般起到控制作…

Django笔记01-基础:一个完美主义的web框架

浅谈Web框架 一,什么是框架? 软件框架就是为实现或完成某种软件开发时,提供了一些基础的软件产品, 框架的功能类似于基础设施,提供并实现最为基础的软件架构和体系 通常情况下我们依据框架来实现更为复杂的业务程序开发 一个字,框架就是程序的骨架 二,框架的优缺点 可重…

mysql存储引擎的一点学习心得总结

首先我们应该了解mysql中的一个重要特性——插件式存储引擎,从名字就能够看出在mysql中,用户能够依据自己的需求随意的选择存储引擎。实际上也是这样。即使在同一个数据库中。不同的表也能够使用不同的存储引擎。Mysql中支持的存储引擎有非常多种&#x…

常见音视频格式(转载)

Contents 1 MPEG 系列 1.1 MPEG-1 1.2 MPEG-2 1.3 MPEG-4 1.4 MPEG-4 AVC 1.5 MPEG Audio Layer 1/2 1.6 MPEG Audio Layer 3 1.7 MPEG-2 AAC 1.8 MPEG-4 AAC 1.9 MPEG-4 aacPlus 1.10 MPEG-4 VQF 1.11 mp3PRO 1.12 MP3 Surround 2 DVD系列 2.1 Dolby Digital AC3 2.2 Dolby D…

编程语言难度排名_谷歌排名第一的编程语言,小学生拿来做答题,分分钟钟搞定高难度算法!...

点击上方蓝色文字关注我们吧谷歌排名第一的编程语言时什么?毫无疑问:肯定是 Python。 也难怪,作为大数据时代和人工智能时代的必备语言,Python 的优点太多了,语言简洁、易学、开发效率高、可移植性强...... 另外&#…

poj 2484 A Funny Game

题目:http://poj.org/problem?id2484 一,题意: n个硬币围成一个圈,Alice与Bob轮流从圈中取硬币。每次能够取一枚或者连续的两枚。 硬币取走后留下的空位不用填补,空位相隔的两个硬币视为不相邻。Alice第一个開始取。 …

58到家MySQL军规升级版

一、基础规范 表存储引擎必须使用InnoDB 表字符集默认使用utf8,必要时候使用utf8mb4 解读: (1)通用,无乱码风险,汉字3字节,英文1字节 (2)utf8mb4是utf8的超集&#…

jsp 中包含 一个路径为变量的文件

<head><base href"<%basePath%>"><% String fileroot"MyJsp.jsp"; %> </head><body><jsp:include page"<%fileroot %>" ></jsp:include></body>

FFMPEG中H.264的算法文档--整理自ffmpeg论坛等

xchg_mb_border() 交换 MB 边界的像素。阅读代码可知&#xff0c;交换双方为边界缓存 (left_border,top_borders) 与重建图象中的相应数据。其中 xchg 参数是否为 1 决定&#xff0c;在从边界缓存赋值到重建图象的同时&#xff0c;是否保存重建图象的数据到边界缓存。 此函数仅…

python局部静态变量_全局变量、局部变量和静态变量

全局变量和局部变量在写代码时需要区分清楚&#xff0c;不然会出大问题。不同语言定义不同范围的变量的写法有很大的区别。那么静态变量是在什么场景下用到呢&#xff1f;我们来假设这样一个场景&#xff1a;在函数内部定义的变量&#xff0c;当程序执行到它的定义处时&#xf…

【转载】fullpage.js学习

参考网址&#xff1a;http://www.dowebok.com/77.html 上面有详细介绍及案例展示&#xff0c;很不错哦&#xff0c;可以先去看看demo 一、简介 fullPage.js 是一个基于jQuery的插件&#xff0c;它能够很方便、很轻松的制作出全屏网站&#xff0c;主要功能有&#xff1a; 1.支持…

Deepin 下安装 LAMP

ubuntu/deepin linux 下使用 apt-get 安装所需套的软件 LAMP 1. 安装 apacache2 apt-get install apache2 配置文件&#xff1a;/etc/apache2/apache2.conf service apache2 start service apache2 stop service apache2 restart 2. 安装 mysql sudo apt-get install my…

webpack打包测试_webpack入门笔记(一)

webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时&#xff0c;它会递归地构建一个依赖关系图(dependency graph)&#xff0c;其中包含应用程序需要的每个模块&#xff0c;然后将所有这些模块打包成一个或多个 bundle。webp…

[js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展字符串位置方法(4)

本文&#xff0c;我们接着之前的框架继续扩展&#xff0c;这次扩展了一共有5个与字符串位置相关的方法 between( left, right ) 返回两个字符串之间的内容&#xff0c; 如果第二个参数没有传递&#xff0c;返回的是找到的第一个参数 之后 到 字符串结尾的所有字符串 如果第二个…

ffmpeg和SDL学习笔记

根据ffmpeg官方网站上的例子程序开始学习ffmpeg和SDL编程。 SDL是一个跨平台的多媒体开发包。适用于游戏&#xff0c;模拟器&#xff0c;播放器等应用软件开发。支持linux 、win32 等操作系统。 主要应用&#xff1a; 视频 设置8bpp或更高的任意色彩深度的视频模式。如果某个…

百练-16年9月推免-B题-字符串判等

2743:字符串判等 查看提交统计提示提问总时间限制: 1000ms内存限制: 65536kB描述判断两个由大小写字母和空格组成的字符串在忽略大小写&#xff0c;且忽略空格后是否相等。 输入两行&#xff0c;每行包含一个字符串。输出若两个字符串相等&#xff0c;输出YES&#xff0c;否则输…

mysql中的内置函数

mysql内置函数列表可以从mysql官方文档查询&#xff0c;这里仅分类简单介绍一些可能会用到的函数。 1 数学函数 abs(x) pi() mod(x,y) sqrt(x) ceil(x)或者ceiling(x) rand(),rand(N):返回0-1间的浮点数&#xff0c;使用不同的seed N可以获得不同的随机数 round(x, D)&#xff…

待整理

CNN 适合处理图片类输入数据&#xff0c;单独的&#xff0c;数据之间没有关系。 rnn则适合处理序列类数据&#xff0c;视频帧&#xff0c;语言。 深度神经网络一般指隐藏层大于2的神经网络。深层网络相对于浅层网络&#xff0c;表达能力更强。仅有一个隐藏层的神经网络就能拟合…

希尔伯特变换_学习笔记1-傅里叶变换1

最终目标是解微分方程。第一章首先介绍了一般意义下的傅里叶变换&#xff0c;之后逐渐将傅里叶变换的概念抽象化&#xff0c;将变换的定义域进行拓展。最后少量介绍傅里叶变换在偏微分方程中的应用。习题解答是自己写的&#xff0c;有的不会&#xff0c;有的不知道对不对。傅里…