atom与mysql,MP4文件atom头分析

重要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。

dac3b7b680677b3d002626c6b4056940.gif

上图为mvhd atom的数据结构图。

Time scale 大意为时间尺度。定义了一秒钟的时间片数量,在我测试的MP4文件中该值为600。

Duration 在time scale的基础上定义持续时间。在我测试的MP4文件中该值为8740,可以计算出持续时间约为8740/600=14.567s

tkhd atom

tkhd表明了单个track的属性。

f2bdb67f0c2b7429e661c91b46cb6e28.gif

Duration 以mvhd中的timescale为基础的当前track的持续时间信息。在我测试的MP4文件中,音频track中该值为8740,视频track中该值为8734。在这里需要注意一下sample数量与duration之间的关系。

mdhd atom

mdhd atom包含了媒体的属性信息。

e738181bad4691b11ce423ffbddad9e6.gif

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值