MP4文件结构(2)

以一个长度为10秒的MP4为例,其结构可能如下:

type: ftyp,        size:       24
type: mdat,     size:  8884701
type: mdat,     size:   136125
type: moov,     size:     4656

1. ftyp

一个ftyp对文件的类型进行描述,指明其符合哪些格式。一般就是mp4格式了。符合本文档的媒体类型有很多种,box条目的种类也不同,所以需要brand与compatible_brands的来说明此文件内的box的种类。文档中定义了isom, avc1, iso2, mp71, iso3这些brand应有的格式,当解码器在读出其brand后,就知道该文件的格式了。

 

aligned(8) class FileTypeBox extends Box(‘ftyp’) {
  unsigned int(32) major_brand;
  unsigned int(32) minor_version;
  unsigned int(32) compatible_brands[]; // to end of the box
}

 

2. mdat

 

 

上例中有2个mdat,一个是视频内容、另一个音频内容。对于h264, aac编码的媒体来说,其视频mdat中内容是nal,对于音频来说,其内容为aac的一帧。mdat中的帧依次存放,每个帧的位置、时间、长度都由moov中的信息指定。可以看出,mdat是很好组建的,这种Box只含有数据。

 

aligned(8) class MediaDataBox extends Box(‘mdat’) {
   bit(8) data[];
}

 

3. moov

 

 

moov存放影片的所有信息,一个moov含有多个trak。通常对于一个片子来说,就是一个视频trak,一个音频trak。MP4文件的重点也在于此。

 

(1) trak / tkhd

对于视频trak,存宽、高信息;对于音频trak,存音量信息。并不是太重要,真正初始化解码器要靠 stsd中的信息。

(2) trak / mdia / hdlr

标明该trak是视频还是音频

(3) trak / mdia / minf / stbl

所有重要的表都在这里。其中,

   - stsd: 编码器CODEC信息

   - stsz: 用于sample的划分,通常一个sample可以对应于frame。

   - stsc: 多个sample组成一个trunk,不过实际操作中可以让一个sample直接构成一个trunk

   - stco: trunk在文件中的位置,用于定位。

   - stts / ctts: 指定每个sample的PTS, DTS

(4) trak / edts / elst

把视频分为多段segment, 每个的起始时间和时长

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿发你好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值