网站首页 > 技术文章 正文
FFmpeg基本由 七 个模块组成,分别是:AVFormat、AVCodec、AVFilter、AVDevice、AVUtil、swresample、swscale。
- AVFormat是封装模块:主要负责音视频文件的输入和输出。它的主要功能是对多媒体文件的格式进行解封装(demuxing)和封装(muxing)
解封装(Demuxing):从多媒体文件中提取音频、视频、字幕等流。FFmpeg 可以处理多种格式的封装文件,如 MP4、MKV、AVI 等。
封装(Muxing):将音频、视频流等数据重新封装成一个多媒体文件。比如将编码后的音频和视频流封装到 MP4 文件中。
- AVCodec是编解码模块:它包含了各种编码器和解码器,用于对音频和视频进行压缩和解压缩。
解码(Decoding):将压缩的音频或视频流(如 H.264、AAC 等格式)解码成原始的音频或视频帧(YUV、PCM 等)。
编码(Encoding):将原始音频或视频帧编码为压缩的格式,如将 RGB 视频转换为 H.264 格式的视频流,或将 PCM 音频转换为 AAC 格式的音频流。
- AVFilter是滤镜模块:提供了多种滤镜(filters),可以实现通用的音频、视频、字幕等滤镜处理,可以在解码、编码或封装过程中对音视频数据进行处理。
视频处理:对视频进行各种处理,如缩放、裁剪、旋转、色彩调整等。
音频处理:对音频进行处理,如音量调节、混音、效果处理等。
过滤链(Filterchains):多个滤镜可以组成一个处理链,用于对输入数据进行复杂的处理。
在AVFilter中,滤镜框架可以有多个输入和多个输出,比如下面:
上图中的含义是:处理视频文件,对视频进行裁剪、翻转,并将处理后的部分覆盖到原视频的下半部分,生成一个新的输出视频。
#操作的命令如下:
ffmpeg -i /mnt/e/498312bdc286584c6e01571dd6087bc4.mp4 -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" /mnt/e/output.mp4
#命令行解释
## -i用于指定输入的要处理的视频文件
## -vf 是用于指定视频滤镜(video filter)的选项,后面的内容是一个复合滤镜链(filter chain),定义了一系列视频处理操作。它包含了多个视频滤镜,分号 ; 用于分隔每个滤镜的操作。
###滤镜链的解释:
####split [main][tmp]
split 滤镜将输入视频分为两个相同的流,分别命名为 [main] 和 [tmp]。
[main] 是视频的主流,不做任何更改,将继续用于后续的处理。
[tmp] 是副本,稍后会进行裁剪和翻转。
#####[tmp] crop=iw:ih/2:0:0, vflip [flip]
[tmp] 代表的是被 split 操作拆分出来的视频副本。
crop=iw:ih/2:0:0:这个 crop 滤镜裁剪视频:
iw 是输入视频的宽度(input width)。
ih/2 是输入视频的高度的一半,表示裁剪到上半部分。
0:0 表示从左上角坐标 (0, 0) 开始裁剪。
vflip:这个滤镜将裁剪后的视频进行垂直翻转(vertical flip)。
[flip]:翻转后的视频流被命名为 [flip],将用于后续的叠加操作。
#####[main][flip] overlay=0:H/2
[main] 是原始视频流。
[flip] 是翻转后的裁剪视频流。
overlay=0:H/2:这个 overlay 滤镜将翻转后的裁剪视频叠加到原始视频上,具体的叠加位置由 overlay 参数决定:
0 表示翻转视频的左上角横坐标为 0,即在原始视频的左边对齐。
H/2 表示翻转视频的纵坐标为原始视频的高度的一半(H 是原始视频的高度),即将翻转视频叠加到原始视频的下半部分。
##/mnt/e/output.mp4
最后,指定输出文件的路径 /mnt/e/output.mp4,将处理后的视频保存到该路径。
效果如下:
简单总结一下,滤镜的使用规则:
(1)相同的Filter线性链之间用逗号分隔
(2)不同的Filter线性链之间用分号分隔
在上面的例子中,crop和vflip使用的是同一个滤镜处理的线性链,而split滤镜和overlay则使用了另外的线性链,一个线性链与另外的线性链汇合时是通过方括号“[]”括起来的标签进行标识的。在本例中,处理后的两个流是通过[main]与[flip]进行关联汇合的。
split滤镜将分隔后的视频流的副本打上标签[tmp],通过crop滤镜对该部分流进行处理,然后进行纵坐标调换操作,打上[flip]标签,最终将[main]标签与[flip]标签进行合并,[flip]标签的视频流从视频的左边最中间的位置开始显示,这样就出现了镜像的效果。
- AVDevice负责设备输入输出模块:它处理与硬件设备(如摄像头、麦克风、屏幕等)交互的操作,支持捕获和播放音视频流。
设备捕获:用于从摄像头、麦克风等设备捕获音视频数据。
设备播放:用于向显示设备或音频输出设备播放音视频数据。
常用的接口:
avdevice_register_all(): 注册所有可用的设备。
avdevice_capabilities_create(): 获取设备的支持能力。
avformat_open_input(): 用于打开输入设备,如摄像头、麦克风等。
- AVUtil工具模块:提供了音视频处理的各种基础功能,包括数据结构、编解码器信息、时间处理等。
数据结构:定义了用于存储音视频数据的结构体,如 AVFrame(存储音视频帧)、AVPacket(存储音视频数据包)、AVCodecContext(编解码器上下文)。
时间与时长:提供时间处理的功能,如帧率、时间基准转换等。
内存管理:提供内存分配、释放等基础功能。
- swresample音频转换计算模块:
提供了高级的音频重采样API,for example,允许操作音频采样、音频通道布局转换与布局调整。
- swscale视频图像转换计算模块:
提供了高级的图像转换API,比如允许进行图像缩放和像素格式转换,常见的是将图像从1080p转换为720p或者480p等等的缩放。或者将图像数据从YUV420P转换为YUYV,或者YUV转RGB等格式图像转换,这些转换接口,与OpenCV中的图像颜色空间转换接口有异曲同工之妙。
- 上一篇: 音视频八股文(11)-- ffmpeg 音频重采样
- 下一篇: 视频行为分析系统v4版本
猜你喜欢
- 2024-12-05 FFmpeg基础学习路线
- 2024-12-05 FFmpeg4.2.2 交叉编译
- 2024-12-05 有哪些优秀的 C++ 代码库可以推荐学习?
- 2024-12-05 多媒体处理工具 FFmpeg 工具集
- 2024-12-05 FFmpeg从入门到精通
- 2024-12-05 音视频录制+RTMP直播推拉流
- 2024-12-05 FFmpeg/WebRTC/RTMP 音视频流媒体高级开发知识点总结
- 2024-12-05 FFmpeg如何提升—进阶版
- 2024-12-05 解决SRT稳定推流到SRS———网络丢包部分
- 2024-12-05 深入剖析ffplay.c之数据队列(1)
- 1509℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 538℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 497℃MySQL service启动脚本浅析(r12笔记第59天)
- 476℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 474℃启用MySQL查询缓存(mysql8.0查询缓存)
- 454℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 434℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 431℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)