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(Media 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组成的单元。

   一个典型的MP4文件的结构树。

 

媒体架构 媒体结构分析_字节数

  • File Type Box(ftyp)(刚开始文件头)

媒体架构 媒体结构分析_数据_02

length(4字节):0x00000018:box的长度是24字节;
boxtype(4字节):0x66747970:“ftyp”的ASCII码,box的标识;
major_brand(4字节):0x6D703432:“mp42“的ASCII码;
minor_version(4字节):0x00000000:mp42的版本号;
compatible_brands(8字节):说明本文件遵从(或称兼容)ismo,iso2,mp41三种协议。0x6D7034326D703431

  • Movie Box(moov)

     该box包含了文件媒体的metadata信息,“moov”是一个container box,具体内容信息由子box诠释。同File Type Box一样,该box有且只有一个,且只被包含在文件层。一般情况下,“moov”会紧随“ftyp”出现

Movie Header Box(mvhd)  

             

媒体架构 媒体结构分析_数据_03

             解析如下:

字段

字节数

意义

box size

4

box大小    0x0000006c

box type

4

box类型    0x6D766864

version

1

box版本,0或1,一般为0。(以下字节数均按version=0) 0x00

flags

3

   0x000000

creation time

4

创建时间(相对于UTC时间1904-01-01零点的秒数)  0xCB0AB2A0

modification time

4

修改时间 0xCB0AB2A0

time scale

4

文件媒体在1秒时间内的刻度值,可以理解为1秒长度的时间单元数 0x00015F90 -->90000

duration

4

该track的时间长度,用duration和time scale值可以计算track时长,比如audio track的time scale = 8000, duration = 560128,时长为70.016,video track的time scale = 600, duration = 42000,时长为70  

0x0039CD80  --->3788160

rate

4

推荐播放速率,高16位和低16位分别为小数点整数部分和小数部分,即[16.16] 格式,该值为1.0(0x00010000)表示正常前向播放

0x00010000

volume

2

与rate类似,[8.8] 格式,1.0(0x0100)表示最大音量  0x0100

reserved

10

保留位

matrix

36

视频变换矩阵

pre-defined

24

 

next track id

4

下一个track使用的id号  0x00000003

 

trak)

              “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         

tkhd)

 

字段

字节数

意义

box size

4

box大小  0x0000005C

box type

4

box类型  0x746B6864

version

1

box版本,0或1,一般为0。(以下字节数均按version=0)0x00

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

0x000001

creation time

4

创建时间(相对于UTC时间1904-01-01零点的秒数)  0xCB0AB2A0

modification time

4

修改时间 0xCB0AB2A0

track id

4

id号,不能重复且不能为0  0x00000001

reserved

4

保留位 0x00000000

duration

4

track的时间长度  0x0039BC68

reserved

8

保留位

layer

2

视频层,默认为0,值小的在上层 0x0000

alternate group

2

track分组信息,默认为0表示该track未与其他track有群组关系  0x0000

volume

2

[8.8] 格式,如果为音频track,1.0(0x0100)表示最大音量;否则为0  0x0000

reserved

2

保留位

matrix

36

视频变换矩阵

width

4

宽 0x0F000000

height

4

高,均为 [16.16] 格式值,与sample描述中的实际画面大小比值,用于播放时的展示宽高  0x08700000

mdia)

mdia”也是个container box

                实例结构图

           

媒体架构 媒体结构分析_媒体架构_04

                      2.2.1 Media Header Box(mdhd)

                         

媒体架构 媒体结构分析_字节数_05

    

                          解析如下                      

字段

字节数

意义

box size

4

box大小              0x00000020

box type

4

box类型              0x6D646864

version

1

box版本,0或1,一般为0。(以下字节数均按version=0) 0x00

flags

3

0x000000

creation time

4

创建时间(相对于UTC时间1904-01-01零点的秒数) 0xCB0AB2A0

modification time

4

修改时间     0xCB0AB2A0

time scale

4

同前表     0x00007512

duration

4

track的时间长度  0x001339E0

language

2

媒体语言码。最高位为0,后面15位为3个字符(见ISO 639-2/T标准中定义)  0x15C7

pre-defined

2

0x0000

         2.2.2 hdlr)

                                 

媒体架构 媒体结构分析_媒体架构_06

 

 

hdlr”解释了媒体的播放过程信息,该box也可以被包含在meta box(meta)中。“hdlr”结构如下表

字段

字节数

意义

box size

4

box大小          0x00000044

box type

4

box类型          0x68646C72

version

1

box版本,0或1,一般为0。(以下字节数均按version=0)  0x00

flags

3

 0x000000

pre-defined

4

 0x00000000

handler type

4

在media box中,该值为4个字符:

“vide”— video track

“soun”— audio track

“hint”— hint track

0x76696465

reserved

12

 

name

不定

track type name,以‘\0’结尾的字符串

           2.2.3 minf)

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

媒体架构 媒体结构分析_媒体架构_07

 

几种颜色分别标明minf, vmhd,dinf,stbl

 

 

Meida Data Box(mdat)

媒体架构 媒体结构分析_数据_08

 

 

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

 

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

媒体架构 媒体结构分析_字节数_09

  

 

 

对原有的文件:

    ffmpeg -i test-20mbps.mp4

 

   

媒体架构 媒体结构分析_数据_10

 

 

ffmpeg命令进行裁剪:(从第20秒开始取20秒)

  ffmpeg -i test-20mbps.mp4 -ss 00:00:20 -t 20 test-20mbps-20sec.mp4

左边裁剪后的文件(原来的mp42换成通用的isom,一上来就是mdat),右边为在此基础上提取视频(去声音)

媒体架构 媒体结构分析_字节数_11