【音视频开发】FFmpeg转换与封装 I - MP4格式

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的参数格式随下表所示。

【音视频开发】FFmpeg转换与封装 I - MP4格式_第1张图片

        接着我们往下找可以发现下一个容器类型是mvhd,如图中蓝色标记所示,地址为0x6D766864,同时容器大小为0x0000006C

【音视频开发】FFmpeg转换与封装 I - MP4格式_第2张图片

         完成分析后,可以发现下个容器是一个trak标签,类型和容器大小在这里就不再标出和计算了。

【音视频开发】FFmpeg转换与封装 I - MP4格式_第3张图片

        最后便是udta容器(属于moov的子容器),这个udta容器的解析方式与前面解析trak的方式基本相同。

【音视频开发】FFmpeg转换与封装 I - MP4格式_第4张图片

        我们通过计算可以发现,udata+视频trak+音频trak+mvhd+moov描述大小之后得出来的总大小刚好与之前得出来的moov大小相等

        2.解析mvhd子容器

【音视频开发】FFmpeg转换与封装 I - MP4格式_第5张图片

        3.解析trak子容器

        4.解析tkhd容器

【音视频开发】FFmpeg转换与封装 I - MP4格式_第6张图片

        5.解析mdia容器

        6.解析mdhd容器

【音视频开发】FFmpeg转换与封装 I - MP4格式_第7张图片

        7.解析hdlr容器

【音视频开发】FFmpeg转换与封装 I - MP4格式_第8张图片

        8.解析minf容器

        待完成

        9.解析vmhd容器

【音视频开发】FFmpeg转换与封装 I - MP4格式_第9张图片

        10.解析smhd容器

【音视频开发】FFmpeg转换与封装 I - MP4格式_第10张图片

        11.解析dinf容器

【音视频开发】FFmpeg转换与封装 I - MP4格式_第11张图片

        12.解析stbl容器

        待完成

        13.解析edts容器

        码文中……

欢迎阅读下一章 FFmpeg格式转换与封装 II - FLV格式【音视频开发】FFmpeg格式转换与封装 II - FLV格式https://blog.csdn.net/weixin_42839065/article/details/130682490?spm=1001.2014.3001.5502

你可能感兴趣的:(音视频流媒体,ffmpeg,音视频,笔记)