MP4文件简介

1.简介

首先了解以下几个概念:

  • MP4文件由许多Box和FullBox组成
  • 每个Box由Header和Data两部分组成
  • FullBox是Box的扩展,在Box的基础上,在Header中增加8位version标志和24位flags标志
  • Header包含了Box的size和type,size==0时,代表是最后一个Box;size==1时,说明Box的长度需要更多的位来描述,在后面会定义一个64位的largesize用来描述Box的长度。type为uuid是,说明这个Box的数据是用户自定义扩展类型。
  • Data为Box的实际数据,可以是纯数据,也可以是更多的子Box,当Data为子Box时,这个Box又可以称为容器。

下图为主要的box:

 2.MP4可视化工具

MP4infoMP4info-C++文档类资源-CSDN下载MP4info更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/wzz953200463/86033110

3.简单分析

使用MP4info工具打开任意一个MP4文件,如下图所示。

图1

3.1moov容器

至少包含以下3种中的一种:

  • mvhd标签:存放未压缩过的影片信息头容器
  • cmov标签:压缩过的电影信息容器,不常用
  • rmra标签:参考电影信息容器,不常用

也可以包含其他容器信息,例如:一个或几个trakAtom(trak)、User Data Atom(udta)等。

trak中定义了媒体文件中一个track的信息,track是媒体文件中可以独立操作的媒体单位,例如一个音频流就是一个track,一个视频流就是一个track。

moov参数如下所示:

4字节的movie header atom + 4字节的类型

上图所示:moov容器供包含0x0000E012(57362)字节,类型:0x6d6f6f76(moov)。

紧接着解析,0x0000006C(108)字节,类型:0x6d766864(mvhd)。

然后解析trak:

这个trak的大小是:0x00008b66(35686)字节,类型:0x7472616b

继续下一个trak:

这个trak的大小是:0x0000540E(21518)字节,类型:0x7472616b

继续解析udta:

这个udta的大小是:0x0000002A(42)字节,类型:0x75647461

如图1所示:一个moov中包含了 1个mvhd + 2个trak + 1个udta

根据前面描述的信息可知,udta+音频trak+视频trak+mvhd+moov参数描述大小(8字节)刚好为57362字节。

3.2mvhd容器

主要是电影文件头信息。上述108字节

mvhd参数如下所示:

字段 长度/字节 描述
尺寸 4 movie header atom字节数
类型 4 mvhd
版本 1 movie header atom版本
标志 3 扩展的movie header,这里为0
生成时间 4 起始时间
修订时间 4 修订时间
Time scale 4 时间计算单位
Duration 4 影片播放长度时间值
播放速度 4 播放速度。1.0位正常速度
播放音量 2 音量。1.0位最大音量
保留 10 0
矩阵结构 36
预览时间 4 开始预览此movie的时间
预览duration 4 以movie的time scale为单位,预览duration
Poster time 4 Poster时间值
Selection time 4 当前选择时间的开始时间值
Selection duration 4 当前选择时间的计算后的时间值
当前时间 4

下一个track ID

4 0不是一个有效的ID

3.3trak子容器

trak中定义了媒体文件中一个track的信息,track是媒体文件中可以独立操作的媒体单位,每个trak都有与它关联的media容器描述信息。一个trak容器中必须要有一个tkhd、一个mdia。如下图所示

3.4tkhd容器

tkhd大小为:0x0000005c(92字节),类型0x746B6864

tkhd参数如下

字段 长度/字节 描述
尺寸 4 字节数
类型 4 类型
版本 1 版本
标志 3
生成时间 4 起始时间
修订时间 4 修订时间
Track ID 4
保留 4 0
duration 4 track的Duration
保留 8 0
Layer 2 视频层,默认为0
Alternate group 2 track分组信息,默认为0
音量 2 1.0为正常音量
保留 2 0
矩阵结构 36
宽度 4 如果是视频,为图像宽度
高度 4 如果是视频,为图像高度

3.5mdia容器 

track里面的mdia信息,必须包含下列容器:

  • mdhd:媒体头
  • hdlr:句柄参考
  • minf:媒体信息

如图3.3中的图所示。

3.6mdhd容器

描述媒体头信息,参数如下所示

字段 长度/字节 描述
尺寸 4 字节数
类型 4 类型
版本 1 版本
标志 3 0
生成时间 4 起始时间
修订时间 4 修订时间
Time scale 4 时间计算单位
duration 4 track的duration时长
语言 2 媒体的语言码
质量 2 媒体回放质量

3.7minf容器

包含了很多重要的子容器,例如音视频采样等信息相关的的容器,minf容器中的信息将作为音视频数据的映射存在,内容信息如下:

  • 视频信息头:vmhd子容器
  • 音频信息头:smhd子容器
  • 数据信息:dinf子容器
  • 采样表:stbl子容器

3.8edts容器

edts容器定义了创建Movie媒体文件中一个track的一部分媒体,所有的edts数据都在一个表里,包括每一部分的时间偏移量和长度,如果没有该表,那么这个track就会立即开始播放。

猜你喜欢

转载自blog.csdn.net/wzz953200463/article/details/125730799