【音视频开发】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头
treftrack参考容器
edtsedit list 容器
elstedit list元素信息
mdiatrack里面的media 信息
mdhdmedia 信息头
hdlrmedia 信息的句柄
minfmedia 信息容器
vmhd视频media头(只存在于视频的track)
smhd音频media头(只存在于音频的track)
hmhd提示meida头(只存在于提示的track)
nmhd空media头(其他的track)
dinf数据信息容器
dref数据参考容器,track中media的参考信息
stbl采样表容器,容器做时间与数据所在位置的描述
stsd采样描述(codec类型与初始化信息)
stts(decoding)采样时间
ctts(composition)采样时间
stscchunk采样,数据片段信息
stsz采样大小
stz2采样大小详细描述
stcoChunk 偏移信息,数据偏移信息
co6464位Chunk 偏移信息
stss同步采样表
stsh采样同步表
padb采样 padding
stdp采样退化优先描述
sdtp独立于可支配采样描述
sbgp采样组
sgpd采样组描述
subs子采样信息
mvex视频扩展容器
mehd视频扩展容器头
trextrack 扩展信息
ipmcIPMP控制容器
moof视频分片
mfhd视频分片头
traftrack分片
tfhdtrack 分片头
truntrack 分片run 信息
sdtp独立和可支配的采样
sbgp采样组
subs子采样信息
mfra视频分片访问控制信息
tfratrack 分片访问控制信息
mfro拼分片访问控制偏移量
mdatmedia 数据容器
free空闲区域
skip空闲区域
udta用户数据
cprtcopyright 信息
meta元数据
hdlr定义元数据的句柄
dinf数据信息容器
dref元数据的源参考信息
ipmcIPMP控制容器
iloc所在位置信息容器
ipro样本保护容器
sinf计划信息保护容器
frma原格式容器
imifIPMP 信息容器
schm计划类型容器
schi计划信息容器
iinf容器所在项目信息
xmlXML容器
bxmlbinary XML 容器
pitm主要参考容器
fiin文件发送信息
paenpartition 人口
fpar文件片段容器
fecrFEC reservoir
segr文件发送 session 组信息
gitn组id转名称信息
tseltrack 选择信息
meco追加的metadata 信息
meremetabox 关系

        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

FFmpeg是一个开源的跨平台多媒体处理工具,它可以用来转换、编辑和播放各种音视频格式。根据引用中的源码示例,可以看出可以使用FFmpeg将RTSP流封装mp4、avi、flv等格式的文件。 在引用中的源码示例中,通过创建一个MyFFmpeg对象,设置RTSP播放路径,然后进行初始化。在初始化成功后,可以使用循环读取帧的方式将RTSP流转换为特定格式的文件。最后,通过释放资源完成转换过程。 需要注意的是,这只是一个简单的示例,实际转换过程可能涉及更多的参数和细节。如果需要更详细的操作和参数设置,可以参考引用中的FFmpeg操作类封装来进行扩展和优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [实现ffmpeg将RTSP流封装mp4、avi、flv文件的源码](https://download.csdn.net/download/u012125696/9589163)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Qt+FFmpeg播放RTSP H264视频流(2)- FFmpeg自定义类封装](https://blog.csdn.net/eastcnme/article/details/94607856)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

干吃咖啡豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值