【音视频】MP4文件格式解析

本文详细介绍了MP4文件的结构,从目的出发,深入剖析MP4的box概念,如ftyp、moov、mdat等重要box的定义与实例。通过对MP4格式的解析,为读者提供理解和解析其他文件格式的参考。
摘要由CSDN通过智能技术生成

一、目的

  • 掌握 MP4 文件格式里的内容 以及基本构成
  • 为日后解析其他格式的文件提供良好的借鉴

二、MP4结构一览

  • MP4文件中的所有数据都装在box(QuickTime中为atom)中,也就是说MP4文件由若干个box组成,每个box有类型和长度,可以将box理解为一个数据对象块。box中可以包含另一个box,这种box称为container box。
  • 一个MP4文件首先会有且只有一个“ftyp”类型的box,作为MP4格式的标志并包含关于文件的一些信息;之后会有且只有一个“moov”类型的box(Movie Box),它是一种container box,子box包含了媒体的metadata信息;MP4文件的媒体数据包含在“mdat”类型的box(Midia Data Box)中,该类型的box也是container box,可以有多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由metadata进行描述

2.2 MP4结构参考图

  • MP4 box 树结构图,可以根据这张图大致了解构造文件构造
    在这里插入图片描述

2.2 MP4结构参考表

  • 参照 c068960_ISO_IEC_14496-12_2015.pdf 中的表格
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 里面有太多元素了,我们此刻分析的.mp4没有这么多,利用小工具 mp4info 查看,仅仅包含 moov + mdat 两部分
    在这里插入图片描述
  • 一般来说,会包含以下三个部分。
节点 说明
ftyp 文件类型
moov 媒体的metadata信息
mdat 具体的媒体数据

三、 MP4格式解析 & 实例分析

  • 结合实例来分析一些封装中的概念
  • 分析封装数据,网上推荐了小工具,我觉得还可以
  1. mp4info, 有二进制流左右对照,分析结构很直观
  2. mp4explorer, 解析每个元素的具体数值,适合不关注二级制流的时候使用
  3. EStreamEye,据说可以逐帧播放
  4. Hexinator,二进制作色,分段清晰

3.1 box

  • mp4 组成的最小单元,mp4 分析的过程 就是 一个个 box 解析的过程
  • box中的字节序为网络字节序,也就是大端字节序(Big-Endian)(高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中)
  • Box由header和body组成,其中header统一指明box的大小和类型,body根据类型有不同的意义和格式。
  • 标准的box开头的4个字节(32位)为box size,该大小包括box header和box body整个box的大小,这样我们就可以在文件中定位各个box。如果size为1,则表示这个box的大小为large size,真正的size值要在largesize域上得到。(实际上只有“mdat”类型的box才有可能用到large size。)如果size为0,表示该box为文件的最后一个box,文件结尾即为该box结尾。(同样只存在于“mdat”类型的box中。)
    在这里插入图片描述

3.2 ftyp (File Type Box)

  • 该box有且只有1个,并且只能被包含在文件层,而不能被其他box包含。该box应该被放在文件的最开始,指示该MP4文件应用的相关信息。

3.2.1 定义

Box	Type:	 `ftyp’	
Container:	 File	
Mandatory:	 Yes	
Quantity:	 Exactly	one	(but	see	below)	

3.2.2 实例

名称 字节数 元数据 数据
major brand 4 6D 70 34 32 mp42
minor version 4 00 00 00 00 0
compatible 4[] list 69 73 6F 6D 6D 70 34 32 isom,mp42

在这里插入图片描述

3.3 moov (Movie Box)

  • 该box包含了文件媒体的metadata信息,“moov”是一个container box,具体内容信息由子box诠释。同File Type Box一样,该box有且只有一个,且只被包含在文件层。一般情况下,“moov”会紧随“ftyp”出现
  • “moov”中会包含1个“mvhd”和若干个“trak”
  • 因为 “moov”是一个container box,它的结构可以这样看
    在这里插入图片描述

3.4 mvhd(Movie Header Box)

  • 这里说明只针对该文件的说明,实际上 version的不同,也会造成字节数的分配不同,具体可以参照 ISO -14

3.4.1 定义

Box	Type:		 ‘mvhd’
Container:	 Movie	Box	(‘moov’)	
Mandatory:	Yes	
Quantity:	 Exactly	one

3.4.2 实例

名称 字节数 元数据 说明
box size 4 00 00 00 6C 108
box type 4 6D 76 68 64 mvhd
version 1 00 0
flags 3 00 00 00 0
creation time 4 DC 80 9D 8C 创建时间 : 3/24/2021 07:41:00
modification time 4 DC 80 9D 8C 修改时间:3/24/2021 07:41:00
time scale 4 00 00 03 E8 文件媒体在1秒时间内的刻度值,可以理解为1秒长度的时间单元数: 1000
duration 4 00 00 0B 47 该track的时间长度,用duration和time scale值可以计算track时长,此时audio track的time scale = 1000, duration = 2887,时长为2.8s
rate 4 00 01 00 00 推荐播放速率,高16位和低16位分别为小数点整数部分和小数部分,即[16.16] 格式,该值为1.0(0x00010000)表示正常前向播放
volume 2 10 00 与rate类似,[8.8] 格式,1.0(0x0100)表示最大音量
reserved 10 00 00 00 00 00 00 00 00 00 00 保留位
matrix 36 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 视频变换矩阵
pre-defined 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 保留位
net track id 4 00 00 下一个track使用的id号

在这里插入图片描述

3.5 trak(Track Box)

  • “trak”也是一个container box,其子box包含了该track的媒体数据引用和描述(hint track除外)。一个MP4文件中的媒体可以包含多个track,且至少有一个track,这些track之间彼此独立,有自己的时间和空间信息。“trak”必须包含一个“tkhd”和一个“mdia”,此外还有很多可选的box(略)。其中“tkhd”为track header box,“mdia”为media box,该box是一个包含一些track媒体数据信息box的container box
  • 因为 “trak”是一个container box,它的结构可以这样看

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值