第 2 章:FFmpeg简介

2.1 历史

历史
一些相关术语介绍:

  • 容器(Container)格式:一种文件封装格式,里边主要包含了流,一般会使用一个特定的后缀名标识,例如.mov、.avi、.wav等。
  • 流 (Stream):在容器中存储音频(Audio)或者视频(Video)、字幕(Subtitle)等数据。
  • 元数据(Metadata):一般位于容器之中,告诉我们一些额外信息,一个常见的例子是MP3文件中的ID3 tag。
  • 编解码器(Codec):它实际上是enCOder与DECoder这两个词的混搭。大部分情况下我们指的是一种压缩标准,如我们所说的AVC/H.254、HEVC/H.265、VVC/H.266、AV1等。

2.2 FFmpeg的基本组成

  FFmpeg框架可以简单分为两层,上层是以ffmpeg、ffplay、ffprobe为代表的命令行工具;其底层支撑是一些基础库,包含AVFormat、AVCodec、AVFilter、AVDevices、AVUtils等模块库。细节结构如下图所示:
在这里插入图片描述

2.2.1 封装/解封装模块AVFormat

  AVFormat中实现了目前多媒体领域中绝大多数媒体封装格式和流媒体协议,包括封装(Muxer)和解封装(Demuxer)器, 包括如:

  • MP4FLVMKVTS文件封装格式,
  • RTMPRTSPMMSHLS等网络协议。

  FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。

2.2.2 编/解码模块AVCodec

  AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,既支持编码,也支持解码。AVCodec除了以原生方式支持H.264、AAC、MJPEG等编解码格式之外,还支持第三方的编解码器,如:

  • H.264(AVC)编码,需要使用x264编码器;
  • H.265(HEVC)编码,需要使用x265编码器;
  • MP3(mp3lame)编码,需要使用libmp3lame编码器

2.2.3 滤镜模块AVFilter

  AVFilter库提供了一个通用的音、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和输出。滤镜处理的例子如下图

  这个例子将输入的视频切割成两部分流,一部分流抛给crop与vflip滤镜处理模块,另一部分保持原样;当crop与vflip处理完后,将流合并到overlay图层中,并显示在最上一层,输出新视频。对应命令如下:

ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:00, vflip [flip]; [main] [flip] overlay=0:H/2" OUTPUT

处理前后如下:上半部分保留,上半部分同时做镜像运动到下边,合成后输出。
在这里插入图片描述

 下面简单说下滤镜的构成规则

  • 相同滤镜的线性链用逗号分割
  • 不同滤镜的线性链使用分号分隔

2.2.4 设备模块AVDevice

  AVDevice提供了一些常用的输入输出设备的处理框架。比如在macOS上和iOS上,一般使用AVFoundation调用底层的音视频及共享桌面输入。在Windows上,常用dshow作为音视频输入。在Linux上有更多选择,:音频输入输出设备有oss、alsa等,视频设备有opengl、video4linux2、x11grab等。sdl和sdl2是一个跨平台的输出设备的不同版本,在大多数平台都能用。

2.2.5 图像转换模块swscale

  swscale模块提供了底层的图像转换API接口,它允许进行图像缩放和像素格式转换,通常转换是有损的。

2.2.6 音频转换模块swresmaple

  swresample模块提供了音频重采样、格式转换、Rematrixing(改变通道布局)等

2.2.7 编解码工具ffmpeg

  • 解封装,或称解复用
  • 解码
  • 编码
  • 封装,或称复用

其中,整体处理的工作流程如下图所示。
在这里插入图片描述

2.2.8 播放器ffplay

ffmplay主要作为播放测试工具使用,也能显示音频的波形信息等。注意编译安装ffplay依赖于sdl。

2.2.9 多媒体分析器ffprobe

ffprobe是一个强大的多媒体分析工具,可以从媒体文件或者媒体流中获取音频格式,视频宽高,时长等信息。下一章具体讲。

2.3 不同平台的编译

建议谷歌

2.4 FFmpeg特性选择与定制

使用configure --help查看第三方外部库支持

./configure --list -encoders 查看编码器
./configure --list -decoders 查看解码器
./configure --list -muxers 查看封装支持
./configure --list -demuxers 查看解封装支持
./configure --list -protocols 查看通信协议

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型隐私防泄漏:差分隐私、参数高效化

大语言模型隐私防泄漏:差分隐私、参数高效化 写在最前面题目6:大语言模型隐私防泄漏Differentially Private Fine-tuning of Language Models其他初步和之前的基线微调模型1微调模型2通过低秩自适应进行微调( 实例化元框架1) 在隐…

pta L1-063 吃鱼还是吃肉

L1-063 吃鱼还是吃肉 分数 10 全屏浏览 切换布局 作者 陈越 单位 浙江大学 国家给出了 8 岁男宝宝的标准身高为 130 厘米、标准体重为 27 公斤;8 岁女宝宝的标准身高为 129 厘米、标准体重为 25 公斤。 现在你要根据小宝宝的身高体重,给出补充营养的…

浅谈 刷算法题时遇到运行超时异常 的解决办法

文章目录 一、背景介绍二、解决办法2.1 C/C 语言2.2 Java 语言2.2.1 ACM模式下 Java的I/O原理 三、模板详情 一、背景介绍 最近在牛客、leetcode 刷算法题时发现一个奇怪的问题,明明解题思路、所用算法与题解一致,并且在本地IDE运行是通过的&#xff0c…

【HTML】H5新增元素记录

H5 新增元素特性 1. 语义化标签 语义化标签的好处: 对于浏览器来说,标签不够语义化对于搜索引擎来说,不利于SEO的优化 语义化标签: header:头部元素nav:导航section:定义文档某个区域的元素article:内容元素aside…

深度学习:Pytorch分布式训练

深度学习:Pytorch分布式训练 简介模型并行数据并行参考文献 简介 在深度学习领域,模型越来越庞大、数据量不断增加,训练这些大型模型越来越耗时。通过在多个GPU或多个节点上并行地训练模型,我们可以显著减少训练时间。此外&#…

python学习 | 我有两个dataframe,想通过某1列进行匹配

需求 我有两个dataframe,第1个dataframe A的columns是[‘id’, ‘A’, ‘B’, ‘C’],第2个dataframe B的columns是[‘id’, ‘1’, ‘2’, ‘3’],其中’id’列A是B的子集,我想通过’id’列进行匹配,把A给扩充成[‘i…

js 特定索引下拆分字符串并组建成新的字符串数据

要在特定索引处拆分字符串,请使用 slice 方法获取字符串的两个部分,例如 str.slice(0, index) 返回字符串的一部分,但不包括提供的索引,而 str.slice(index) 返回字符串的其余部分。 过程:我们创建一个可重用的变量&a…

「GO基础」目录

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

删除word中下划线的内容

当试卷的题目直接含答案,不利用我们刷题。这时如果能够把下划线的内容删掉,那么将有利于我们复习。 删除下划线内容的具体做法: ①按ctrl H ②点格式下面的字体 ③选择下划线线型中的_____ ④勾选使用通配符并在查找内容中输入"?&qu…

Linux 序列化、反序列化、实现网络版计算器

目录 一、序列化与反序列化 1、序列化(Serialization) 2、反序列化(Deserialization) 3、Linux环境中的应用实例 二、实现网络版计算器 Sock.hpp TcpServer.hpp Jsoncpp库 Protocol.hpp 类 Request 类 Response 辅助函…

SQLite数据库中JSON 函数和运算符(二十七)

返回:SQLite—系列文章目录 上一篇:维护SQLite的私有分支(二十六) 下一篇:SQLite—系列文章目录 ​1. 概述 默认情况下,SQLite 支持 29 个函数和 2 个运算符 处理 JSON 值。还有两个表值函数可用于分解 JSON 字…

程序员自由创业周记#32:新产品构思

程序员自由创业周记#32:新产品构思 新作品 我时常把自己看做一位木匠,有点手艺,能做一些作品养活自己。而 加一、Island Widgets、Nap 就是我的作品。 接下来在持续维护迭代的同时,要开启下一个作品的创造了。 其实早在2022的1…

【C++初阶】List使用特性及其模拟实现

1. list的介绍及使用 1.1 list的介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前…

(2022级)成都工业学院数据库原理及应用实验五: SQL复杂查询

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求,请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 在实验三的基础上完成下列查询: 1、查询医生…

漆包线行业你了解多少?专业漆包线行业MES生产管理系统

今天就说说漆包线行业,漆包线是工业电机(包括电动机和发电机)、变压器、电工仪表、电力及电子元器件、电动工具、家用电器、汽车电器等用来绕制电磁线圈的主要材料。 漆包线上游是铜杆行业,下游是各种消费终端,主要是电…

[大模型]Qwen-Audio-chat FastApi 部署调用

Qwen-Audio-chat FastApi 部署调用 Qwen-Audio 介绍 Qwen-Audio 是阿里云研发的大规模音频语言模型(Large Audio Language Model)。Qwen-Audio 可以以多种音频 (包括说话人语音、自然音、音乐、歌声)和文本作为输入,并以文本作为…

Linux-用户管理类命令实训

查看根目录下有哪些内容 进入/tmp目录,以自己的学号建一个目录,并进入该目录 像是目前所在的目录 在当前目录下,建立权限为741的目录test1 在目录test1下建立目录test2/test3/test4 进入test2,删除目录test3/test4 (7&…

Python实现在线翻译工具

Python实现在线翻译工具 使用Python的内置的标准库tkinter和webbrowser,实现一个简单Python在线翻译工具。 tkinter库用来创建一个图形用户界面(GUI),webbrowser库用来打开网页。 webbrowser 是 Python 的一个标准库&#xff0…

7.MMD 法线贴图的设置与调教

前期准备 人物 导入温迪模型导入ray.x和ray_controler.pmx导入天空盒time of day调成模型绘制顺序,将天空盒调到最上方给温迪模型添加main.fx材质在自发光一栏,给天空盒添加time of lighting材质 打开材质里的衣服,发现只有一个衣服文件 …

SpringBoot集成FTP

1.加入核心依赖 <dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.8.0</version></dependency> 完整依赖 <dependencies><dependency><groupId>org.springfra…