- MP4概念
- MP4文件物理结构(常见)
- MP4重要box详解
- 扩展 – ismv
一、MP4概念
MP4是一套用于音频、视频信息的压缩编码标准,由国际标准化组织(ISO)和国际电工委员会(IEC)下属的“动态图像专家组”(Moving Picture Experts Group,即MPEG)制定。MPEG-4格式的主要用途在于网上流、光盘、语音发送(视频电话),以及电视广播,是一种常见的多媒体封装格式。
二、MP4文件物理结构(常见)
1、 MP4基本单元box
由上图可知,MP4由许多box组成(如:ftyp、moov、mdat等),实际上box分为box和fullbox两种。
1)box:
size:该大小包括 box header 和 box body 整个 box 的大小,这样我 们就可以在文件中定位各个 box。
type:size 后面紧跟的 32 位为 box type,一般是 4 个字符,如“ftyp”、“moov”等,这 些 box type 都是已经预定义好的,分别表示固定的意义。
largesize:如果box很大超过了uint32的最大数值,size就被设置为1,并用接下来的 largesize来存放大小。
2)fullbox
是Box的扩展,Box结构的基础上在Header中增加8bits version和24bits flags
2、 重点关注的box
ftyp | file type and compatibility | ||||||
---|---|---|---|---|---|---|---|
moov | container for all the metadata | ||||||
mvhd | movie header, overall declarations | ||||||
trak | container for an individual track or stream | ||||||
tkhd | track header, overall information about the track | ||||||
tref | track reference container | ||||||
mdia | container for the media information in a track | ||||||
mdhd | media header, overall information about the media | ||||||
hdlr | handler, declares the media (handler) type | ||||||
minf | media information container | ||||||
vmhd | video media header, overall information (video track only) | ||||||
… | sound/hint/Null media header | ||||||
dinf | data information box, container | ||||||
dref | data reference box, declares source(s) of media data in track | ||||||
stbl | sample table box, container for the time/space map | ||||||
stsd | sample descriptions (codec types, initialization etc.) | ||||||
stts | (decoding) time-to-sample | ||||||
stsc | sample-to-chunk, partial data-offset information | ||||||
stco | chunk offset, partial data-offset information | ||||||
moof | movie fragment | ||||||
… | |||||||
mdat | media data container |
其中:
ftyp:该 box 有且只有 1 个,并且只能被包含在文件层,而不能被其他 box 包含。该 box 应该被放在文件的最开 始,指示该 MP4 文件应用的相关信息。
moov:该 box 包含了文件媒体的 metadata 信息,“moov”是一个 container box,具体内容信息由子 box 诠释。
mdat:实际媒体数据,我们最终解码播放的音视频数据都在这里面。
3、 MP4数据流组成
sample:video sample即为一帧视频,或一组连续视频帧,audio sample即为一段连续的压缩音频,它们统称sample。
chunk:一个trak的连续几个sample组成的单元。
trak:表示一些sample的集合,对于媒体数据来说,track表示一个视频或音频序列。
4、 MP4媒体数据映射
Box 定义了如何在 sample table 中找到媒体数据的排列。这包括 data reference(数据引用), the sample size table, the sample to chunk table, and the chunk offset table. 这些表就可以找到 trak 中每个 sample 在文件中的位置和大小。 为了节约空间,这些表都很紧凑。每个chunk在文件 中有一个偏移量,这个偏移量是从文件开头算起的。如果一个 chunk 包含两个 sample,第二个 sample 的位置就是chunk 的偏移量加上第一个 sample 的大小。 chunk offset table 说明了每个 chunk 的偏移量,sample to chunk table 说明了 sample 序号和 chunk 序号的映射关系。
(注意 chunk 之间可能会有死区,没有任何媒体数据引用到这部分区域,但是 chunk 内部不会有这样的死区。)
三、MP4重要box详解
1.File Type Box(ftyp)
Box Type: `ftyp’
“ftyp” body 依次包括 1 个 32 位的 major brand(4 个字符),1 个 32 位的 minor version(整数)和 1 个以 32 位(4 个字符)为单位元素的数组 compatible brands。这些都是用来指示文件应用级别的信息。
2.Movie Box
Box Type: ‘moov’
一般情况下,“moov”中会包含 1 个“mvhd”和若干个“trak”。其中“mvhd”为 header box,一般作为“moov”的第一个子 box 出现。
2.1 Movie Header Box(mvhd)
Box Type: ‘mvhd’
mvhd 定义了整个 movie 的特性,例如 time scale 和 duration。具体字段的表结构如下:
2.2 Track Box
Box Type: ‘trak’
一个mp4文件可以包含一个或多个 tracks,它们之间相互独立,各自有各自的时间和空间信息。每个track box都有与之关联的media box。trak box 要求必须有一个 trak header box (‘tkhd’) 和一个 media box(‘mdia’)。
2.2.1 Track Header Box(tkhd)
Box Type: ‘tkhd’
2.2.2 Media Box
Box Type: ‘mdia’
“mdia”也是个 container box,其子 box 的结构和种类还是比较复杂的。总体来说,“mdia”定义了 trak 媒体类型以及 sample 数据,描述 sample 信息。一般“mdia”包含一个“mdhd”, 一个“hdlr”和一个“minf”,其中“mdhd”为 media header box,“hdlr” 为 handler reference box,“minf”为 media information box。树结构图如下:
2.2.2.1 Media Header Box
Box Type: ‘mdhd’
Media header box 定义了媒体的特性,例如 time scale 和 duration。
2.2.2.2 Handler Reference Box
Box Type: ‘hdlr’
handler box 解释了媒体流的播放过程。例如,一个视频 handler 处理一个 video track。 具体表结构如下:
2.2.2.3 Media Information Box
Box Type: ‘minf’
介绍:“minf”存储了解释 trak 媒体数据的 handler-specific 信息,media handler用这些信息将媒体时间映射到媒体数据并进行处理。“minf”中的信息格式和内容与媒体类型以及解释媒体数据的 media handler密切相关,其他 media handler 不知道如何解释这些信息。“minf”是一个 container box,其实际内容由子 box说明。
包含子box:一般情况下,“minf”包含一个 header box,一个“dinf”和一个“stbl”。header box 根据track type(即 media handler type)分为“vmhd”、“smhd”,“dinf”为 data information box,“stbl”为 sample table box。
2.2.2.3.1 Media Information Header Boxes
Box Types: ‘vmhd’, ‘smhd’, ’hmhd’, ‘nmhd’
1)Video Media Header Box(vmhd)
2)Sound Media Header Box(smhd)
3)…smhd…
4)Hint Media Header Box(hmhd)
2.2.2.3.2 Data Information Box
Box Type: ‘dinf’
介绍:“dinf”解释如何定位媒体信息,是一个 container box。“dinf”一般包含一个“dref”,即 data reference box;“dref”下会包含若干个“url”或“urn”,这些 box 组成一个表,用来定位 trak 数据。简单的说,trak可以被分成若干段, 每一段都可以根据“url”或“urn”指向的地址来获取数据,sample 描述中会用这些片段的序号将这些片段组成一个完整的 trak。一般情况下,当数据被完全包含在文件中时,“url”或“urn”中的定位字符串是空的。
MP4的媒体信息和数据是分开存放的。就是你想获得数据之前必须要解析出每个帧数据所在的位置。mp4存放这个帧信息的是放在stbl这个box里。而真实的数据放在mdat中。接下来就讲讲stbl与mdat的对应关系。
Sample Table Box(stbl)
“stbl”包含了关于 trak 中 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:
1)“stsd”必不可少,且至少包含一个条目,该 box 包含了 data reference box 进行 sample数据检索的信息。没有“stsd” 就无法计算 media sample 的存储位置。
2)解析stsd可获得coding类型、视频宽高、音频samplesize、channelcount这些和解码器有关信息。
其中entry包含:
entry之SampleEntry(继承box):
entry之VisualSampleEntry(avc1):
entry之AudioSampleEntry(mp4a)
- stts:
stts存储了 media sample 的 duration信息,提供了时间对具体 data sample 的映射方法,通过 这个atom,你可以找到任何时间的 sample。
- stss
stss确定 media 中的关键帧。对于压缩的媒体,关键帧是一系列压缩序列的开始帧,它的解压缩是不依赖于以前的帧。后续帧的解压缩依赖于这个关键帧。
4. stsc(Sample-to-Chunk)
当添加 samples 到 media 时,用 chunks 组织这些 sample,这样可以方便优化数据获取。一个 trunk 包含一个或多个 sample,chunk 的长度可以不同,chunk 内的 sample 的长度也可以不同。sample-to-chunk box存储 sample 与 chunk 的映射关系。
5.解析‘stco’, ‘co64’
“stco”定义了每个thunk在媒体流中的位置。位置有两种可能,32位的和64位的,后者对非常大的电影很有用。
四、扩展 – ismv
前三节介绍了常见mp4文件结构。本节介绍Smooth Streaming中ismv文件结构,文件分为了多个Fragments,每个Fragment中包含moof和mdat。这样的结构符合渐进式播放需求。(mdat及其描述信息逐步传输,收齐一个Fragment便可播放其中的mdat)
详情可参考https://blog.csdn.net/zzulp/article/details/7031193 fragment mp4和普通mp4区别。
评论 (0)