【FFmpeg笔记】 从零开始之滤镜(ffmpeg filter_complex)
zhezhongyun 2025-06-12 19:07 37 浏览
FFmpeg 除了具有强大的封装/解封装、编/解码功能外,还包含了一个非常强大的组建---滤镜avfilter。avfilter组建经常用于进行多媒体的处理与编辑,FFmpeg中包含多种滤镜
1.FFmpeg 滤镜filter的参数排列方式
为了便于理解Filter,下面用最简单的方式来描述Filter使用时的参数排列方式:
[输入流或标记名]滤镜参数[临时标记名];[输入流或标记名]滤镜参数[临时标记名]...
文字描述的排列方式很明确,接下来列举一个简单的例子:输入两个文件,一个视频input.mp4,一个图片logo.png,将logo进行缩放,然后放在视频的左上角ffmpeg -i test.mp4 -i logo.png -filter_complex "[1:v]scale=176:144[logo];[0:v][logo]overlay=x=0:y=0" filter.mp4
将logo.png的图像六缩放为176*144分辨率,然后定义一个临时标记名logo,最后将缩放后的图像[logo]铺在输入的视频test.mp4的视频流[0:v]的左上角
2.FFmpeg 滤镜filter时间内置变量
在使用Filter时,经常会用到根据时间轴进行操作的需求,在使用FFmpeg的Filter时可以使用Filter的时间相关的内置变量,下面先来了解下这些相关的变量,如下表,在下面可以使用到
3.FFmpeg 为视频添加水印
FFmpeg可以为视频添加水印,水印可以时文字,也可以时图片,主要用来标记视频归属
3.1 文字水印
在视频中增加文字水印需要准备的条件比较多,需要有文字字库处理的相关文件,在编译FFmpeg时需要支持FreeType、FontConfig、iconv,系统中需要有相关的字库,在FFmpeg中增加纯字母水印可以使用drawtext滤镜进行支持,下面就是drawtext的滤镜参数 使用举例
ffmpeg -i out2.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world ':x=20:y=20" waterfont.mp4
执行后即可在视频左上角增加hello world 文字水印,文字颜色为纯黑,为了让水印更柔和,可以通过drawtext滤镜的fontcolor参数调节颜色,比如设为绿色
ffmpeg -i out2.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world ':x=20:y=20:fontcolor=green" waterfont.mp4
还可以调用一些系统数据,比如水印按当前时间来显示
ffmpeg -re -i out2.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':x=20:y=20:fontcolor=green" waterfont4.mp43.2 图片水印
FFmpeg除了可以向视频添加文字水印外,还可以向视频添加图片水印,视频跑马灯等,为视频添加水印可以使用movie滤镜,下面就是movie滤镜的一些参数
下面举例说明,在FFmpeg中加入图片水印有两种方式,一是通过movie指定水印文件路径,另外一种方式是通filter读取输入文件的流并指定为水印,这里重点介绍如何读取movie图片文件作为水印
ffmpeg -i out2.mp4 -vf "movie=water_pic.png[wm];[in][wm]overlay=30:10[out]" waterPic.mp4
图片就会出现在视频的左上角
也可以用movie与colorkey滤镜配合做成半透明效果,例如
ffmpeg -i out2.mp4 -vf "movie=water_pic.png,colorkey=black:1.0:1.0 [wm];[in][wm]overlay=30:10[out]" waterPicAlpha.mp4
此时图片以30%透明度显示在左上角,[wm]作用为给前面命名相关学习资料推荐,点击下方链接免费报名,先码住不迷路~】
音视频免费学习地址:
https://xxetb.xet.tech/s/2cGd0
【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~
3.3 overlay的滤镜用法
overlay又称视频叠加技术,overlay视频技术使用非常广泛,常见的例子有上面的图片水印以及下面会提到的画中画功能,画中画功能值得是在一个大视频播放窗口中还存在一个小播放窗口,两个窗口不同的视频内容同时播放。 overlay 技术中设计两个窗口,通常把较大的窗口称为背景窗口,较小的窗口称为前景窗口,两者皆可以播放视频或显示图片.
overlay滤镜说明如下
overlay滤镜用法
使用overlay命令行基本格式如下:
ffmpeg -i input1 -i input2 -filter_complex overlay=x:y output
使用一个简单例子,将图片叠在视频的右上角,效果如下图
ffmpeg -i test.mp4 -i chenyao.png -filter_complex overlay=W-w:56 -max_muxing_queue_size 1024 overlay.mp43.4 FFmpeg生成画中画
除了上述overlay添加图标在视频上外,在使用FFmepg处理流媒体文件时,有时需要使用画中画效果。在FFmpeg中,可以通过overlay将多个视频流、多个多媒体采集设备、多个视频文件合并到一个界面中,生成画中画效果。在前面的滤镜使用中和以后的滤镜使用中,与视频操作相关的处理,大多数会与overlay滤镜配合使用,尤其时用在图层处理与合并场景中
从上面3.3的参数列表中可以看到,主要参数并不多,但实际上在overlay滤镜使用中,还有很多组合的参数可以使用,可以使用一些内部变量,例如overlay图层的宽、高、坐标等,下面列举几个画中画的例子
ffmpeg -re -i out2.mp4 -vf "movie=output.avi,scale = 480*320[test]; [in][test] overlay [out]" -vcodec libx264 videoInvideo.mp4上图为显示画中画的最基本方式,如果希望子视频显示在指定位置,例如显示在画面右下角,则需要用到overlay中x坐标与y坐标的内部变量,如同上面图片叠加视频的用法
ffmpeg -re -i out2.mp4 -vf "movie=output.avi,scale = 480*320[test]; [in][test] overlay=x=main_w-500:main_h-500 [out]" -vcodec libx264 videoInvideo.mp4以上两种视频画中画的处理均为静态位置处理,使用overlay还可以配合正则表达式进行跑马灯进行画中画处理
ffmpeg -re -i out2.mp4 -vf "movie=output.avi,scale = 480*320[test]; [in][test] overlay=x='if(gte(t,2),-w+(t-2)*20,NAN)':y=0 [out]" -vcodec libx264 videoInvideo.mp4
图片就不上了,效果为一个视频从左到右缓缓移动3.4 FFmpeg 滤镜图,滤镜链,滤镜之间的关系
滤镜图(filtergraph):跟在 -vf 之后的就是一个滤镜图 滤镜链(filterchain):一个滤镜图包含多个滤镜链 滤镜(filter):一个滤镜链包含多个滤镜 概括来说就是:滤镜 ∈ 滤镜链 ∈ 滤镜图 FFmpeg支持多种滤镜,查看全部滤镜 $ ffmpeg -filters
一个滤镜图的例子如下:
ffmpeg -i out2.mp4 -vf [in]scale=640.0:480.0[wm]; movie='logo.png',scale=92.25:30.0[logo];
[wm][logo]overlay=main_w-overlay_w-24.0:24.0[out] output.mp4在该示例中,有三个滤镜链:
- [in]scale=640.0:480.0[wm]
- movie='logo.png',scale=92.25:30.0[logo]
- [wm][logo]overlay=main_w-overlay_w-24.0:24.0[out] 可以看到,滤镜链是使用分号 ";" 来分隔,滤镜链中的滤镜使用逗号 "," 来分隔;滤镜链没有指定输入或者输出,默认使用前面的滤镜链的输出为输入,并输出给后面的滤镜链作为输入,
简单滤镜和复杂滤镜(Simple filtergraphs 和 Complex filtergraphs)
- Simple filtergraphs(简单滤镜):该滤镜只有一个输入和一个输出,实际就是添加在解码和编码步骤之间的操作,如下图所示。
简单filtergraphs配置了每个流的筛选器选项(与视频和音频分别-vf和-af别名)。
- Complex filtergraphs(复杂滤镜):复杂filtergraphs是那些不能被描述为简单的线性处理链的滤镜组。例如,当滤镜组具有多个输入和/或输出,或当输出流的类型是不同于输入。它们可以被表示为以下图:
复杂滤镜图使用-filter_complex 选项来表示,与-vf不同在于他有多个输入。该选项是全局的, -lavfi 选项等同于 -filter_complex,一个具体的例子就是,overlay 滤镜,该滤镜有两个视频输入,一个视频输出,输出视频是一个输入视频覆盖在另一个视频之上的结果,音频有同等的amix滤镜
-map :-vf、-filter_complex合并
有事会遇到有的使用-vf,有的又必须使用-filter_complex,怎样将这两项整合起来呢,下面有几个示例,总体的思路就是将单输入输出的-vf整合到 -filter_complex中去,这时会用到 第三条中的媒体流选择 -map 示例(该示例我未验证过)
************************* vf 与 filter_complex结合·示例一 **************************
ffmpeg -i input.mp4
-vf "crop='if(gte(iw,ih),ih,iw):if(gte(ih,iw),iw,ih)', scale=720x720"
-an -c:v libx264 -profile:v high -level 4.1 -preset superfast -crf 20
output.mp4
========================================
ffmpeg -i input.mp4 -filter_complex \
"[0:v]trim=0:4.95,setpts=PTS-STARTPTS[v1]; \
[0:v]trim=4.95:6.75,setpts=PTS-STARTPTS[v2]; \
[0:v]trim=6.75:8,setpts=PTS-STARTPTS[v3]; \
[v2]setpts=PTS/0.1[vslow2]; \
[v1][vslow2][v3]concat=n=3:v=1:a=0[out]" \
-map [out] -an -c:v libx264 -profile:v high -level 4.1 \
-preset superfast -crf 20 -r 30 output.mp4
=================合成====================
ffmpeg -i input.mp4 -filter_complex \
"[0:v]crop='if(gte(iw,ih),ih,iw):if(gte(ih,iw),iw,ih)',scale=720x720,split=3[1v][2v][3v]; \
[1v]trim=0:4.95,setpts=PTS-STARTPTS[v1]; \
[2v]trim=4.95:6.75,setpts=(PTS-STARTPTS)/0.1[v2]; \
[3v]trim=6.75:8,setpts=PTS-STARTPTS[v3]; \
[v1][v2][v3]concat=n=3:v=1:a=0[out]" \
-map [out] -an -c:v libx264 -profile:v high -level 4.1 \
-preset superfast -crf 20 -r 30 output.mp4
参考:
- FFmpeg从入门到精通 -刘岐
- FFmpeg中的滤镜(filter)知识点记录
- FFmpeg中overlay滤镜用法-水印及画中画
原文 【FFmpeg笔记】 从零开始之滤镜
相关推荐
- Python入门学习记录之一:变量_python怎么用变量
-
写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...
- python变量命名规则——来自小白的总结
-
python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...
- Python入门学习教程:第 2 章 变量与数据类型
-
2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...
- 绘制学术论文中的“三线表”具体指导
-
在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...
- Python基础语法知识--变量和数据类型
-
学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...
- 一文搞懂 Python 中的所有标点符号
-
反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...
- Python变量类型和运算符_python中变量的含义
-
别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...
- 从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序
-
在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...
- Python中下划线 ‘_’ 的用法,你知道几种
-
Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...
- 解锁Shell编程:变量_shell $变量
-
引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...
- 一文学会Python的变量命名规则!_python的变量命名有哪些要求
-
目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...
- 更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for
-
src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...
- C++第五课:变量的命名规则_c++中变量的命名规则
-
变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....
- Rust编程-核心篇-不安全编程_rust安全性
-
Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...
- 探秘 Python 内存管理:背后的神奇机制
-
在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- opacity 属性 (32)
- transition 属性 (33)
- 1-1. 变量声明 (31)
