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
















