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

news2024/12/26 22:28:17

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/618056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue】二:Vue核心处理---vue的其它指令和自定义指令

文章目录 1.vue的其它指令1.1v-text 和 v-html1.2 v-cloak1.3 v-once1.4 v-pre 2. 自定义指令2.1 函数式2.2 对象式2.3.定义全局的指令 1.vue的其它指令 1.1v-text 和 v-html v-text:当做文件解析。 v-html:当做 HTML 代码解析。 1.2 v-cloak v-cloa…

chatgpt赋能python:Python字典通过键找值:什么是Python字典?

Python字典通过键找值:什么是Python字典? Python字典是一种非常有用的数据类型,可以通过键值对方式存储和访问数据。它是Python的一种内置数据类型,可以在编程中非常方便地存储和操作数据。 Python字典可以存储任意类型的数据&a…

图书馆智能照明控制系统设计介绍 安科瑞 许敏

摘 要:简要介绍了一种新型的智能照明控制系统,论述了其系统特点和系统组成;结合该系统对某高校图书馆进行了照明节能设计。工程应用表明,该系统在公 共建筑节能中效果显著。 关键词:高校;图书馆&#xff…

【SpinalHDL快速入门】5.1、SpinalHDL组织结构之Component和hierarchy

文章目录 1.1、简介1.2、Input / output 定义1.3、修剪信号(Pruned signals)1.4、参数化硬件(在Verilog中称为“Parameter”)1.5、合成组件名称 1.1、简介 就像在 VHDL 和 Verilog 中一样,可以定义组件以用于构建设计…

Tableau招聘信息数据可视化

获取的招聘信息数据为某招聘网站发布的大数据及数据分析相关岗位,对其他计算机相关岗位的招聘信息数据分析也有一定的参考价值。因为所获取的招聘信息数据数量只有1万左右,实际的招聘信息数量肯定不止1万,所以可能会与实际信息有一定的误差。…

chatgpt赋能python:Python安装Gurobi优化器详细步骤

Python安装Gurobi优化器详细步骤 如果你是一个数据科学家或者运筹学专业的研究者,你肯定会经常接触到优化问题。Gurobi是一个流行的线性与整数规划优化软件包,它提供了出色的线性规划和整数规划支持,速度快,准确度高,…

nginx(八十三)error_page、proxy_intercept_errors深究

一 error_page和proxy_intercept_errors深究 强调: 本文只是基于状态码的角度来讨论error_page、proxy_intercept_errors差异性题外话: 让别人定位,一定要保留好事故现场,尽可能的提供更多的有用信息核心: 本文只讨论错误状态码的异常处理遗…

信息系统设计与分析

系统分析师作用 1. 业务需求 现有组织结构、组织目标、管理模式 部门业务、业务流程、业务规则 业务数据、业务过程与业务管理直接关系 业务优化与业务再造要求 2. 用户需求分析 新系统改进业务要求 对新系统的愿景与期望 对新系统使用要求 3. 系统需求分析 系统应具有哪些功能…

【JavaSE】Java(五十三):核心要点总结

文章目录 1. 简要说下什么是反射2. 什么是java序列化,什么情况下需要序列化3. 为什么需要克隆,如何实现克隆,深拷贝和浅拷贝区别4. throw 和 throws 区别5. final、finaly、finalize 区别 1. 简要说下什么是反射 Java反射是指在运行时获取类信…

chatgpt赋能python:Python安装dialog介绍

Python安装dialog介绍 Dialog是一个命令行工具,可以帮助用户在Linux系统中创建自定义对话框。它可以与多种编程语言一起使用,其中包括Python。在本文中,我们将详细介绍如何在Python中安装Dialog。 安装Dialog前的准备工作 在安装Dialog之前…

Git 命令行提交代码详细操作

Git 命令行提交代码操作(安装git后,鼠标右键打开Git Bash) 1、查看本地git绑定的用户名和邮箱: git config user.name git config user.email 2、① 修改本地git绑定的用户名和邮箱(全局): git config --global user.name “Your_userName” …

案例28:基于Springboot毕业设计系统开题报告设计

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

视频直播播放器弹幕功能API

POLYV播放器拥有弹幕功能,可以增加观看视频时的互动性。 功能API 参数 参数名类型默认值说明danmuEnablebooleanfalse是否开启弹幕功能showDanmubooleantrue开启弹幕功能后,弹幕初始显示状态。false则一开始不显示弹幕。banDanmuBtnbooleanfalse为true时…

【Vue】三:Vue组件: 组件使用和组件嵌套

文章目录 1.第一个组件1.1不使用组件前1.2创建组件1.3注册组件1.4使用组件1.5 细节 2.组件嵌套 1.第一个组件 1.1不使用组件前 1.2创建组件 Vue.extends({该配置项和new Vue的配置项几乎相同})区别: (1)创建Vue组件的时候,不能使…

MySQL 查询分析

一个低效查询引发的思考 上次在做银行对账,上传对账单后,出现对账超时的情况。查看日志发现,最后一条日志记录停在了对 c2c_zwdb.t_file_count 的查询 sql 上。使用 show processlist 命令来查看当前 SQL 的执行情况,如下&#x…

说说验证码功能的实现

前言 大家好,我是 god23bin,今天说说验证码功能的实现,相信大家都经常接触到验证码的,毕竟平时上网也能遇到各种验证码,需要我们输入验证码进行验证我们是人类,而不是机器人。 验证码有多种类型&#xff…

chatgpt赋能python:使用Python安装Gensim:简单而强大的自然语言处理库

使用Python安装Gensim:简单而强大的自然语言处理库 Gensim是一个Python库,它为自然语言处理任务和文本处理任务提供了简单而强大的接口。它可以用于文本相似性计算、主题建模、词嵌入和其他自然语言处理任务。Gensim库的优点之一是其简单性和易用性。在…

评述:量子传感器正掀起一场商业革命

光子盒研究院出品 量子传感器利用原子和光的基本属性来对世界进行测量。粒子的量子状态对环境极为敏感,这对传感来说是一个优点、但对制造量子计算机来说则是一个问题。使用粒子作为探针的量子传感器可以比设计的或基于化学或电信号的经典设备更精确地量化加速度、磁…

4.3 - 信息收集 - 端口扫描,操作系统识别

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」:此文章已录入专栏《网络安全快速入门》 端口&系统版本 一、端口扫描1、telnet2、Nmap3、Masscan 二、操作系统…

【链表的分类】

链表是一种常用的数据结构,它由一系列节点组成,每个节点包含一个数据元素和指向下一个节点的指针。根据节点的连接方式和节点的性质,链表可以分为多种类型。 单向链表(Singly Linked List) 单向链表是最基本的链表类…