1 FFmpeg转换与封装
1.1 MP4格式转换
1.1.1 MP4格式标准
1 FFmpeg转换与封装
FFmpeg支持的媒体封装格式具有多样性与全面性,与此,我们还可以使用FFmpeg来对媒体格式进行转换与封装。
1.1 MP4格式转换
在互联网常见的格式中,跨平台最好的应该是 MP4 文件,因为 MP4 文件既可以在PC 平台的Flashplayer中播放,又可以在移动平台的 Android 、 iOS 等平台中进行播放,而且使用系统默认的播放器即可播放,因此我们说 MP4 格式是最常见的多媒体文件格式 。
1.1.1 MP4格式标准
MP4 格式标准为IS0-14496 Part 12 、ISO-14496 Part 14 ,标准内容并不是特别多。
要了解 MP4 的格式信息,要清楚几个概念,具体如下:
• MP4 文件由许多个 Box 与 FullBox 组成
• 每个Box 由 Header 和 Data 两部分组成
• FullBox 是 Box 的扩展,其在 Box 结构的基础上,在 Header 中增加 8 位 version 标志和 24 位的 flags 标志
• Header 包含了整个 Box 的长度的大小( size )和类型( type ),当 size 等于 0 时,代表这个 Box 是文件的最后一个 Box 。 当 size 等于 1 时,说明 Box 长度需要更多的位来描述,在后面会定义一个 64 位的 large size 用来描述 Box 的长度 。当 Type 为uuid 时,说明这个 Box 中的数据是用户自定义扩展类型
• Data 为 Box 的实际数据,可以是纯数据,也可以是更多的子 Box
• 当 一个 Box 中 Data 是一系列的子 Box 时,这个 Box 又可以称为 Container(容器)Box MP4 文件中 Box 的组成可以用表 3-1 所示的列表进行排列,下表中标记“√”的Box为必要Box,否则为可选Box。
MP4常用参考标准排列方式
容器名 | 必选 | 描述 | |||||
一级 | 二级 | 三级 | 四级 | 五级 | 六级 | - | - |
ftyp | √ | 文件类型 | |||||
pdin | 下载进度信息 | ||||||
moov | √ | 音视频数据的metadata信息 | |||||
mvhd | √ | 电影文件头 | |||||
trak | √ | 流的track | |||||
tkhd | √ | 流信息的track头 | |||||
tref | track参考容器 | ||||||
edts | edit list 容器 | ||||||
elst | edit list元素信息 | ||||||
mdia | √ | track里面的media 信息 | |||||
mdhd | √ | media 信息头 | |||||
hdlr | √ | media 信息的句柄 | |||||
minf | √ | media 信息容器 | |||||
vmhd | 视频media头(只存在于视频的track) | ||||||
smhd | 音频media头(只存在于音频的track) | ||||||
hmhd | 提示meida头(只存在于提示的track) | ||||||
nmhd | 空media头(其他的track) | ||||||
dinf | √ | 数据信息容器 | |||||
dref | √ | 数据参考容器,track中media的参考信息 | |||||
stbl | √ | 采样表容器,容器做时间与数据所在位置的描述 | |||||
stsd | √ | 采样描述(codec类型与初始化信息) | |||||
stts | √ | (decoding)采样时间 | |||||
ctts | (composition)采样时间 | ||||||
stsc | √ | chunk采样,数据片段信息 | |||||
stsz | 采样大小 | ||||||
stz2 | 采样大小详细描述 | ||||||
stco | √ | Chunk 偏移信息,数据偏移信息 | |||||
co64 | 64位Chunk 偏移信息 | ||||||
stss | 同步采样表 | ||||||
stsh | 采样同步表 | ||||||
padb | 采样 padding | ||||||
stdp | 采样退化优先描述 | ||||||
sdtp | 独立于可支配采样描述 | ||||||
sbgp | 采样组 | ||||||
sgpd | 采样组描述 | ||||||
subs | 子采样信息 | ||||||
mvex | 视频扩展容器 | ||||||
mehd | 视频扩展容器头 | ||||||
trex | √ | track 扩展信息 | |||||
ipmc | IPMP控制容器 | ||||||
moof | 视频分片 | ||||||
mfhd | √ | 视频分片头 | |||||
traf | track分片 | ||||||
tfhd | √ | track 分片头 | |||||
trun | track 分片run 信息 | ||||||
sdtp | 独立和可支配的采样 | ||||||
sbgp | 采样组 | ||||||
subs | 子采样信息 | ||||||
mfra | 视频分片访问控制信息 | ||||||
tfra | track 分片访问控制信息 | ||||||
mfro | √ | 拼分片访问控制偏移量 | |||||
mdat | media 数据容器 | ||||||
free | 空闲区域 | ||||||
skip | 空闲区域 | ||||||
udta | 用户数据 | ||||||
cprt | copyright 信息 | ||||||
meta | 元数据 | ||||||
hdlr | √ | 定义元数据的句柄 | |||||
dinf | 数据信息容器 | ||||||
dref | 元数据的源参考信息 | ||||||
ipmc | IPMP控制容器 | ||||||
iloc | 所在位置信息容器 | ||||||
ipro | 样本保护容器 | ||||||
sinf | 计划信息保护容器 | ||||||
frma | 原格式容器 | ||||||
imif | IPMP 信息容器 | ||||||
schm | 计划类型容器 | ||||||
schi | 计划信息容器 | ||||||
iinf | 容器所在项目信息 | ||||||
xml | XML容器 | ||||||
bxml | binary XML 容器 | ||||||
pitm | 主要参考容器 | ||||||
fiin | 文件发送信息 | ||||||
paen | partition 人口 | ||||||
fpar | 文件片段容器 | ||||||
fecr | FEC reservoir | ||||||
segr | 文件发送 session 组信息 | ||||||
gitn | 组id转名称信息 | ||||||
tsel | track 选择信息 | ||||||
meco | 追加的metadata 信息 | ||||||
mere | metabox 关系 |
MP4文件中的Box结构与表中描述的基本上一致,在MP4的描述标准中moov与mdat的存放位置前后并没有作强制要求,所以有时候moov被放在mdat的前面。而在互联网的视频点播中,若希望MP4被快速打开,则需要将moov存放在mdat的前面;如果放在后面,则需要将MP4文件下载完成后才可播放。
1.moov容器
moov容器定义了一个MP4文件中的数据信息,类型是moov,是一个Atom容器,必须至少包含以下三种Atom中的一种:
•mvhd 标签, Movie Header Atom ,存放未压缩过的影片信息的头容器
•cmov 标签, Compressed Movie Atom , 压缩过的电影信息容器,此容器不常用
•rmra 标签, Reference Movie Atom , 参考电影信息容器,此容器不常用
也可以包含其他容器信息,例如影片剪辑信息Clipping atom(clip)、一个或几个trakAtom(trak)、一个 Color Table Atom(ctab)和一个 User Data Atom(udta)。其中,mvhd 中定义了多媒体文件的 time scale 、 duration 以及 display characteristics 。而 trak 中定义了多媒体文件中的一个 track 的信息,track 是多媒体文件中可以独立操作的媒体单位,例如一个音频流就是一个 track 、一个视频流就是一个 track。
在mvhd中定义了多媒体文件的time scale、duration以及display characteristics。而trak中定义了多媒体文件中的一个track的信息,track是多媒体文件中可以独立操作的媒体单位。
用二进制查看工具打开一个MP4格式文件,如第一张图,我们可以看到moov容器类型位于(0x6D6F6F76),共包含0x00019689(104073)字节;moov的参数格式随下表所示。
接着我们往下找可以发现下一个容器类型是mvhd,如图中蓝色标记所示,地址为0x6D766864,同时容器大小为0x0000006C
完成分析后,可以发现下个容器是一个trak标签,类型和容器大小在这里就不再标出和计算了。
最后便是udta容器(属于moov的子容器),这个udta容器的解析方式与前面解析trak的方式基本相同。
我们通过计算可以发现,udata+视频trak+音频trak+mvhd+moov描述大小之后得出来的总大小刚好与之前得出来的moov大小相等。
2.解析mvhd子容器
3.解析trak子容器
4.解析tkhd容器
5.解析mdia容器
6.解析mdhd容器
7.解析hdlr容器
8.解析minf容器
待完成
9.解析vmhd容器
10.解析smhd容器
11.解析dinf容器
12.解析stbl容器
待完成
13.解析edts容器
码文中……
欢迎阅读下一章 FFmpeg格式转换与封装 II - FLV格式【音视频开发】FFmpeg格式转换与封装 II - FLV格式https://blog.csdn.net/weixin_42839065/article/details/130682490?spm=1001.2014.3001.5502