MP4格式标准

MP4格式标准为ISO-14496 Part 12、ISO-14496 Part 14

基本概念

  • MP4文件由许多个Box与FullBox组成
  • 每个Box由Header和Data两部分组成

    • FullBox是Box的扩展,其在Box结构的基础上,在Header中增加8位version标志和24位的flags标志
    • Header包含了整个Box的长度的大小(size)和类型(type),当size等于0时,代表这个Box是文件的最后一个Box。当size等于1时,说明Box长度需要更多的位来描述,在后面会定义一个64位的largesize用来描述Box的长度。当Type为uuid时,说明这个Box中的数据是用户自定义扩展类型
    • Data为Box的实际数据,可以是纯数据,也可以是更多的子Box

因为MP4的标准中描述的moov与mdat的存放位置前后并没有进行强制要求,所以有些时候moov这个Box在mdat的后面,有些时候moov被存放在mdat的前面。在互联网的视频点播中,如果希望MP4文件被快速打开,则需要将moov存放在mdat的前面;如果放在后面,则需要将MP4文件下载完成后才可以进行播放

在flash播放器中,如果moov存放mdat之后,需要等待整个文件下载完成才能播放。但是使用chrome的video标签播放却无需等待,chroem使用HTTP 206响应至少发出3次请求(服务器得支持范围请求)。一个是用于请求文件头(Content-Length ,Accept-Ranges: bytes),然后是用于请求文件的结尾,一旦客户端从文件结尾获取到moov,他就会请求剩下内容。具体请参考这个例子

image-20211225141950019

1. moov容器

moov容器定义了一个MP4文件中的数据信息,类型是moov,是一个容器Atom,其至少必须包含以下三种Atom中的一种:

  • mvhd标签,Movie Header Atom,存放未压缩过的影片信息的头容器
  • cmov标签,Compressed Movie Atom,压缩过的电影信息容器,此容器不常用
  • rmra标签,Reference Movie Atom,参考电影信息容器,此容器不常用

也可以包含其他容器信息,例如影片剪辑信息Clipping atom(clip)、一个或几个trakAtom(trak)、一个Color Table Atom(ctab)和一个User Data Atom(udta)。

其中,mvhd中定义了多媒体文件的time scale、duration以及displaycharacteristics。而trak中定义了多媒体文件中的一个track的信息,track是多媒体文件中可以独立操作的媒体单位,例如一个音频流就是一个track、一个视频流就是一个track。

2.解析mvhd子容器

mvhd的解析方式如表

img

3.解析trak子容器

trak容器中定义了媒体文件中的一个track的信息,一个媒体文件中可以包含多个trak,每个trak都是独立的,具有自己的时间和空间占用的信息,每个trak容器都有与它关联的media容器描述信息。trak容器的主要使用目的具体如下。

  • 包含媒体数据的引用和描述(media track)
  • 包含modifier track信息

    • 流媒体协议的打包信息(hint track),hint track可以引用或者复制对应的媒体采样数据

hint track和modifier track必须保证完整性,同时要与至少一个media track一起存在。

一个trak容器中要求必须要有一个Track Header Atom(tkhd)、一个MediaAtom(mdia),其他的Atom都是可选的,例如如下的atom选项。

  • Track剪辑容器:Track Clipping Atom(clip)
  • Track 画板容器:Track Matte Atom(matt)
  • Edit 容器:Edit Atom(edts)
  • Track参考容器:Track Reference Atom(tref)
  • Track 配置加载容器:Track Load Settings Atom(load)
  • Track 输出映射容器:Track Input Map Atom(imap)
  • 用户数据容器:User Data Atom(udta)

img

4.解析tkhd容器

解析tkhd容器的方式请参考表

img

5.解析mdia容器

解析完tkhd之后,接下来就可以分析一下trak容器的子容器了。Media Atom的类型是mdia,其必须包含如下容器。

  • 一个媒体头:Media Header Atom(mdhd)
  • 一个句柄参考:Handler Reference(hdlr)
  • 一个媒体信息:Media Infomation(minf)和用户数据User Data Atom(udta)

mdia容器下面包含了三大子容器,分别为mdhd、hdlr和minf

6.解析mdhd容器

mdhd容器被包含在各个track中,描述Media的Header,其包含的信息如表3-10所示。

img

7.解析hdlr容器

hdlr容器中描述了媒体流的播放过程,该容器中包含的内容如表

img

8.解析minf容器

minf容器中包含了很多重要的子容器,例如音视频采样等信息相关的容器,minf容器中的信息将作为音视频数据的映射存在,其内容信息具体如下

  • 视频信息头:Video Media Information Header(vmhd 子容器)
  • 音频信息头:Sound Media Information Header(smhd子容器)
  • 数据信息:Data Information(dinf 子容器)
  • 采样表:Sample Table(stbl 子容器)

9.解析vmhd容器

vmhd容器内容的格式如表:

img

10.解析smhd容器

smhd容器的格式如表

img

11.解析dinf容器

dinf容器是一个用于描述数据信息的容器,其定义的是音视频数据的信息,这是一个容器,它包含子容器dref。下面就来列举一个解析dinf及其子容器dref的例子,dref的解析方式如表

img

12.解析stbl容器

stbl容器又称为采样参数列表的容器(Sample TableAtom),该容器包含转化媒体时间到实际的sample的信息,也说明了解释sample的信息,例如,视频数据是否需要解压缩、解压缩算法是什么等信息。其所包含的子容器具体如下。

  • 采样描述容器:Sample Description Atom(stsd)
  • 采样时间容器:Time To Sample Atom(stts)
  • 采样同步容器:Sync Sample Atom(stss)
  • Chunk采样容器:Sample To Chunk Atom(stsc)
  • 采样大小容器:Sample Size Atom(stsz)
  • Chunk偏移容器:Chunk Offset Atom(stco)
  • Shadow同步容器:Shadow Sync Atom(stsh)

stbl包含track中media sample的所有时间和数据索引,利用这个容器中的sample信息,就可以定位sample的媒体时间,决定其类型、大小,以及如何在其他容器中找到紧邻的sample。如果Sample Table Atom所在的track没有引用任何数据,那么它就不是一个有用的media track,不需要包含任何子Atom。

13.解析edts容器

edts容器定义了创建Movie媒体文件中一个track的一部分媒体,所有的edts数据都在一个表里,包括每一部分的时间偏移量和长度,如果没有该表,那么这个track就会立即开始播放,一个空的edts数据用来定位到track的起始时间偏移位置

至此,MP4文件的格式解析标准已经介绍完毕,按照以上的解析方式,读者将会根据对应的解析方式解析MP4文件,然后读取MP4中的音视频数据和对应的媒体信息。


看见了
876 声望16 粉丝

前端开发,略懂后台;


引用和评论

0 条评论