mp4文件格式解析

原文链接:https://blog.csdn.net/wllw7176/article/details/122339945
在原博主的文章上,增加了一些内容,方便以后查看。

MP4概念
MP4文件物理结构(常见)
MP4重要box详解

一、MP4概念

MP4是一套用于音频、视频信息的压缩编码标准,由国际标准化组织(ISO)和国际电工委员会(IEC)下属的“动态图像专家组”(Moving Picture Experts Group,即MPEG)制定。MPEG-4格式的主要用途在于网上流、光盘、语音发送(视频电话),以及电视广播,是一种常见的多媒体封装格式。

二、MP4文件物理结构(常见)
在这里插入图片描述
(注:该图摘自https://blog.csdn.net/zzulp/article/details/7031193)

1、 MP4基本单元box
由上图可知,MP4由许多box组成(如:ftyp、moov、mdat等),实际上box分为box和fullbox两种。
1)box:
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。具体字段的表结构如下:
mvhd
在这里插入图片描述

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。树结构图如下:

mdia

2.2.2.1 Media Header Box
Box Type: ‘mdhd’

Media header box 定义了媒体的特性,例如 time scale 和 duration。

mdhd

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)
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’
在这里插入图片描述在这里插入图片描述
条目数目4:是trunk的数目
每个sample中前4个字节是该sample的大小,该大小不包括这4个字节
在这里插入图片描述
第一行的0384等于900,说明共900个sample,接下来每8个或4个字节代表一个sample的offset

“stco”定义了每个thunk在媒体流中的位置。位置有两种可能,32位的和64位的,后者对非常大的电影很有用。

在这里插入图片描述

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值