MP4文件格式解析个人总结讲解.docx
《MP4文件格式解析个人总结讲解.docx》由会员分享,可在线阅读,更多相关《MP4文件格式解析个人总结讲解.docx(11页珍藏版)》请在冰点文库上搜索。
![MP4文件格式解析个人总结讲解.docx](https://file1.bingdoc.com/fileroot1/2023-7/6/156060ab-2221-418c-829c-291f64cf660c/156060ab-2221-418c-829c-291f64cf660c1.gif)
MP4文件格式解析个人总结讲解
MP4文件格式解析总结
1.引言
MP4是一种常见的多媒体容器格式,对应MPEG-4标准,这种容器格式非常全面开放,被认为可以在其中嵌入任何形式的数据,各种编码的视频、音频等都可以。
在MP4文件中,媒体的描述信息与媒体数据是分开的,并且媒体数据的组织也很自由,不一定要按照时间顺序排列。
同时,MP4也支持流媒体,MP4目前被广泛用于封装h.264视频和AAC音频,是高清视频的代表。
MP4格式的官方文件后缀名是“.mp4”,还有其他的以mp4为基础进行的扩展或者是缩水版本的格式。
2.MP4中一些概念详解
MP4文件格式中,所有的内容存在一个称为movie的容器中。
一个movie可以由多个tracks组成。
每个track就是一个随时间变化的媒体序列,track里的每个时间单位是一个sample,它可以是一帧视频,或者一段连续的压缩音频。
sample按照时间顺序排列。
其中一帧音频可以分解成多个音频sample,所以音频一般用sample作为单位,而不用帧。
MP4文件格式的定义里面,用sample表示一个时间帧或者数据单元。
几个连续的sample就构成了一个chunk。
3.MP4文件结构分析
3.1box结构
MP4由一个一个box组成,每个box由一个boxheader和boxdata组成,boxheader又分为3部分:
①4字节的size:
表示这个box的大小
②4字节的type:
表示这个box的类型
③8字节的largesize
如果整个box的大小超出了4字节能表示的最大值,那么size=1,同时,box的大小就储存在largesize中。
3.2MP4总体结构
Mp4必须包含ftypbox、moovbox、mdatbox。
Filetypebox(ftyp)用来储存文件类型的相关信息,Moviebox(moov)用来储存媒体的信息,是一个containerbox,
Mediadatabox(mdat)用来储存媒体的具体数据
3.3Moviebox(moov)
一个moviebox包含一个mvhdbox和若干个trakbox,比如audiotrakbox,vediotrakbox。
3.3.1MovieHeaderbox(mvhd)
mvmd具体结构如下:
字段
字节数
意义
boxsize
4
box大小
boxtype
4
box类型
version
1
box版本,0或1,一般为0。
(以下字节数均按version=0)
flags
3
creationtime
4
创建时间(相对于UTC时间1904-01-01零点的秒数)
modificationtime
4
修改时间
timescale
4
文件媒体在1秒时间内的刻度值,可以理解为1秒长度的时间单元数
duration
4
该track的时间长度,用duration和timescale值可以计算track时长,比如audiotrack的timescale=8000,duration=560128,时长为70.016,videotrack的timescale=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
nexttrackid
4
下一个track使用的id号
3.3.2Trakbox
Trakbox必须包含一个tkhdbox和一个mediabox,此外还有很多可选的box:
①TrackHeaderbox(tkhd):
定义了一个track的特性,例如时间,空间和音量信息。
结构如下:
字段
字节数
意义
boxsize
4
box大小
boxtype
4
box类型
version
1
box版本,0或1,一般为0。
(以下字节数均按version=0)
flags
3
按位或操作结果值,预定义如下:
0x000001track_enabled,否则该track不被播放;
0x000002track_in_movie,表示该track在播放中被引用;
0x000004track_in_preview,表示该track在预览时被引用。
一般该值为7,如果一个媒体所有track均未设置track_in_movie和track_in_preview,将被理解为所有track均设置了这两项;对于hinttrack,该值为0
creationtime
4
创建时间(相对于UTC时间1904-01-01零点的秒数)
modificationtime
4
修改时间
trackid
4
id号,不能重复且不能为0
reserved
4
保留位
duration
4
track的时间长度
reserved
8
保留位
layer
2
视频层,默认为0,值小的在上层
alternategroup
2
track分组信息,默认为0表示该track未与其他track有群组关系
volume
2
[8.8]格式,如果为音频track1.0(0x0100)表示最大音量;否则为0
reserved
2
保留位
matrix
36
视频变换矩阵
width
4
宽
height
4
高,均为[16.16]格式值,与sample描述中的实际画面大小比值,用于播放时的展示宽高
②mediabox:
该box是一个包含一些track媒体数据信息box的containerbox。
3.4Mediabox
Mediabox主要包含mediaheaderbox(mdhd)、hdlrbox、minfbox。
3.4.1Mediaheaderbox(mdhd)
mediaheaderbox(mdhd)定义了整个movie的特性,例如timescale和duratio,具体结构如下:
字段
字节数
意义
boxsize
4
box大小
boxtype
4
box类型
version
1
box版本,0或1,一般为0。
(以下字节数均按version=0)
flags
3
creationtime
4
创建时间(相对于UTC时间1904-01-01零点的秒数)
modificationtime
4
修改时间
timescale
4
文件媒体在1秒时间内的刻度值,可以理解为1秒长度的时间单元数
duration
4
track的时间长度
language
2
媒体语言码。
最高位为0,后面15位为3个字符(见ISO639-2/T标准中定义)
pre-defined
2
3.4.2Hdlrbox
Hdlrbox解释了媒体的播放过程信息。
同时也指明了本trak类型,如:
vedio、autio、hint,具体结构如下:
字段
字节数
意义
boxsize
4
box大小
boxtype
4
box类型
version
1
box版本,0或1,一般为0。
(以下字节数均按version=0)
flags
3
pre-defined
4
handlertype
4
在mediabox中,该值为4个字符:
“vide”—videotrack
“soun”—audiotrack
“hint”—hinttrack
reserved
12
name
不定
tracktypename,以‘\0’结尾的字符串
3.4.3Minfbox
存储了解释该track的媒体数据的handler-specific的信息。
mediahandler用这些信息将媒体时间映射到媒体数据,并进行处理。
minf包含一个headerbox,一个DataInformationBox(dinf)和一个SampleTableBox(stbl):
①Headerbox定义颜色和图形模式信息
②dinfbox解释如何定位媒体信息
③stblbox包含了关于track中sample所有时间和位置的信息,以及sample的编解码等信息。
利用这个表,可以解释sample的时序、类型、大小以及在各自存储容器中的位置。
3.5SampleTableBox(stbl)
SampleTableBox(stbl)包含:
sampledescriptionbox(stsd)、timetosamplebox(stts)、samplesizebox(stsz)、sampletochunkbox(stsc)、chunkoffsetbox(stco)、compositiontimetosamplebox(ctts)、syncsamplebox(stss)。
3.5.1SampleDescriptionBox(stsd)
boxheader和version字段后会有一个entrycount字段,根据entry的个数,每个entry会有type信息,如“vide”、“sund”等,根据type不同sampledescription会提供不同的信息,例如对于videotrack,会有“VisualSampleEntry”类型信息,对于audiotrack会有“AudioSampleEntry”类型信息。
视频的编码类型、宽高、长度,音频的声道、采样等信息都会出现在这个box中。
3.5.2TimeToSampleBox(stts)
stts存储了sample的duration,描述了sample时序的映射方法,我们通过它可以找到任何时间的sample。
stts可以包含一个压缩的表来映射时间和sample序号,用其他的表来提供每个sample的长度和指针。
表中每个条目提供了在同一个时间偏移量里面连续的sample序号,以及samples的偏移量。
递增这些偏移量,就可以建立一个完整的timetosample表。
3.5.3SampleSizeBox(stsz)
stsz定义了每个sample的大小,包含了媒体中全部sample的数目和一张给出每个sample大小的表。
这个box相对来说体积是比较大的。
3.5.4SampleToChunkBox(stsc)
用chunk组织sample可以方便优化数据获取,一个thunk包含一个或多个sample。
stsc中用一个表描述了sample与chunk的映射关系,查看这张表就可以找到包含指定sample的thunk,从而找到这个sample。
3.5.5SyncSampleBox(stss)
stss确定media中的关键帧。
对于压缩媒体数据,关键帧是一系列压缩序列的开始帧,其解压缩时不依赖以前的帧,而后续帧的解压缩将依赖于这个关键帧。
stss可以非常紧凑的标记媒体内的随机存取点,它包含一个sample序号表,表内的每一项严格按照sample的序号排列,说明了媒体中的哪一个sample是关键帧。
如果此表不存在,说明每一个sample都是一个关键帧,是一个随机存取点。
3.5.6ChunkOffsetBox(stco)
stco定义了每个thunk在媒体流中的位置。
位置有两种可能,32位的和64位的,后者对非常大的电影很有用。
在一个表中只会有一种可能,这个位置是在整个文件中的,而不是在任何box中的,这样做就可以直接在文件中找到媒体数据,而不用解释box。
需要注意的是一旦前面的box有了任何改变,这张表都要重新建立,因为位置信息已经改变了。