重要atom综述表
顶层
moov层
trak层
mdia层
minf层
stbl层
说明
ftyp
文件类型与兼容性字段
moov
movie媒体信息容器
mvhd
movie header,包含文件总体信息
trak
track or stream container,音/视频流信息容器
tkhd
track header,track的总体信息
mdia
描述媒体类型和采样数据信息的容器
mdhd
定义timescale及duration
hdlr
Handler Reference,定义解析媒体数据所使用的方法
minf
media information container
vmhd**
视频媒体信息头,包含色彩与图形模式
smhd**
音频媒体信息头,包含音频控制信息
dinf
stbl
采样数据表容器
stsd
sample description
stts
包含time-to-sample映射表
stss
包含关键帧位置映射表
stsc
包含sample-to-chunk映射表,表明sample在哪个chunk中
stsz
sample的大小映射表
stco
chunk起始偏移映射表
co64
64位的chunk起始偏移映射表
cmov
压缩的movie媒体信息容器
mdat
media data container
** vmhd和smhd在minf容器中有且仅包含其中一个。
上表中的所有的atom是在nginx MP4模块中有相应的read函数的atom。MP4标准中所包含的atom类型远不止这一些。在做nginxmp4相关模块开发时,我关心如何从这些nginxmp4模块已经经过分析的头部中获取我需要的MP4文件信息。
下面对需要从中提取信息的atom进行分析介绍
mvhd atom
mvhd atom定义了整个movie的特性,其中最重要的为timescale与duration。
上图为mvhd atom的数据结构图。
Time scale 大意为时间尺度。定义了一秒钟的时间片数量,在我测试的MP4文件中该值为600。
Duration 在time scale的基础上定义持续时间。在我测试的MP4文件中该值为8740,可以计算出持续时间约为8740/600=14.567s
tkhd atom
tkhd表明了单个track的属性。
Duration 以mvhd中的timescale为基础的当前track的持续时间信息。在我测试的MP4文件中,音频track中该值为8740,视频track中该值为8734。在这里需要注意一下sample数量与duration之间的关系。
mdhd atom
mdhd atom包含了媒体的属性信息。
Time scale 时间片信息。在测试的MP4文件中,音频track中的该值为32000,视频track中的该值为600。
Duration 以时间片为单位的持续信息。在测试的MP4文件中,音频track中的该值为467968,视频track中的该值为8740。
从上面的分析中可以看出,mdhd中的时间片单位可能与mvhd中的不一致,在音频track中,记录的值实际为音频的采样率。视频track也可以有自己的timescale。
stsd atom
stsd atom包含了多条对sample的描述,每条描述表述了对sample的不同编码方式或存储与不同的文件?A media may have one or more sample descriptions, depending upon the number of different encoding schemes used in the media and on the number of files used to store the data.
对于nginx_mp4模块中所需的信息来说,stsd atom中的信息没有太大的作用。如果需要提取媒体的编码类型,需要这一atom的信息。
stts atom
stts atom表述了time-to-sample列表,通过类似游程编码的方式记录每个sample与duration之间的关系。
在我测试的MP4文件中,音频track中的stts列表仅有一条:
Sample count
Sample duration
457
1024
表示在音频track中,从第1个sample到第457个sample的duration均为1024。通过计算457*1024=467968,与音频track在tkhd中记录的总Duration值一致。
而在视频track中,stts列表为:
Sample count
Sample duration
437
20
通过计算437*20=8740,与视频track在tkhd中记录的总duration也是一致的。
可以通过stts atom中的信息计算出帧率,例如当前视频的time scale为600,每个sample跨越的duration为20,则可知视频帧率为30fps。
ctts atom
ctts atom表示Composition Offset,有这一列表的原因是因为在视频中因为B帧的原因,视频帧编码/存储/解码的顺序与实际播放的顺序不一致,因此需要某些帧设置播放偏移。
在测试的MP4文件中,视频track中的ctts atom中的列表前几列如下图所示:
Sample count
Sample offset
3
20
1
40
1
0
1
40
1
0
1
40
1
0
1
40
1
0
1
40
1
0
1
40
1
0
1
40
1
0
sample offset值实际是以tkhd中定义的时间片为单位的持续时间,在当前测试MP4文件中,offset为20即为延迟一帧,因此存储与播放顺序对比为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
5
4
7
6
9
8
11
10
13
12
15
16
15
stss atom
stss atom包含sync sample信息,列表中为关键帧的偏移信息。
stsc atom
stsc atom意为sample-to-chunk信息,列表中为每个chunk中的sample数量,可以由该atom信息获知每个sample所属的chunk。
stsz atom
stsz atom意为sample size信息,包含每一个sample的大小信息列表。若每个sample大小信息相同,则记录在atom头中,若不同,则列出在列表中。
在我测试的MP4文件中,音频track中stsz记录的大小相同的384,视频track中stsz记录了437条不同的大小信息。
stco atom
stco atom意为chunk offset信息,表示每个chunk在文件中的位置信息,总的chunk的数量也可以从这一信息中获取。在stsc atom信息中记录了每个sample所属的chunk,配合chunk offset和sample size信息,是否就能够获取到每个sample在文件中的位置信息?
参考资料:
https://wiki.multimedia.cx/index.php?title=QuickTime_container http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/index.html