ffmpeg第6篇:滤镜语法
前言
哈哈,回来继续填坑了,前段时间较忙没时间写,现在继续~😀
简介
滤镜是ffmpeg的一个很强大的功能,它支持许多有用的视频处理功能,常见的滤镜如:缩放、旋转、水印、裁剪等
一个比较经典的滤镜使用方法如下(来自ffmpeg官网):
[main]
input --> split ---------------------> overlay --> output
| ^
|[tmp] [flip]|
+-----> crop --> vflip -------+
上面的示意图的流程是:将input复制A B两份,A当作主画面,B先裁剪,再垂直翻转,然后将B覆盖在A上当作水印
如果上面的事情用ffmpeg来实现的话,命令最终会是这样
ffmpeg -i buck.mp4 -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" out.mp4 -y
如果是不了解滤镜的同学,猛一看肯定是懵逼的,反正我当时是完全懵逼的状态😂,没关系,慢慢来
看过之前文章(ffmpeg第2篇:简单滤镜与复杂滤镜的区别)的同学应该知道,滤镜分简单滤镜和复杂滤镜,用-vf
或-lavfi
来表示
而上面的命令用的是-vf
,显然这是一个简单的滤镜,因为它只有一个输入和输出
语法规则
分段
将滤镜代码单独拿出来
split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2
可以看到有分号(;)和逗号(,)两种分隔符
那什么时候用分号,什么时候用逗号呢?简单来说,规则就是:同一路的滤镜间用逗号进行分割,不同路的滤镜间用分号进行分割
怎么理解上面的规则呢,不妨将整体滤镜逐个拆解
-
split [main][tmp];
这个动作就是将input复制两份,一份名字是main,另一份名字叫tmp,后面跟了分号,因为拆完后已经两路流了,不能再当一路流处理了,所以用分号隔开 -
[tmp] crop=iw:ih/2:0:0, vflip [flip];
这个动作就是将tmp先剪裁(crop)再做垂直翻转(vflip),输出名字为flip的新数据流,对于裁剪和翻转来说,都是处理的tmp这一路流,用逗号隔开即可。翻转后面跟了分号,因为翻转完咱们对它的操作结束了,后面要用它与main合并了,如果你还想继续处理,那可以加个逗号继续处理,比如咱们还想再给它压缩一下分辨率为640x360,就可以这样
[tmp] crop=iw:ih/2:0:0, vflip, scale=640:360 [flip];
怎么样,现在能明白了吧😜 -
[main][flip] overlay=0:H/2
将最初的main流与经过处理的flip流合并
表达式
看一个新的命令
ffmpeg -i buck.mp4 -vf "split [main][tmp]; [tmp] crop=iw/4:ih/4:0:0 [crop]; [main][crop] overlay=y='if(lte(t,2),0,H-h)'" out.mp4 -y
相比上个命令,这个命令多了一对单引号包括起来的表达式:'if(lte(t,2),0,H-h)'
这个表达式中的t是ffmpeg内置的参数,表示的是timestamp时间戳的意思
其实对于程序员来说,一看就明白,它其实是个表达式,相当于在ffmpeg命令中执行程序,对于这种形式的命令(其它的还有诸如 gt、mod、between),ffmpeg要求使用单引号包括起来,便于ffmpeg解析,这是硬性要求,没什么不好理解的,知道有这个规则就好。
输入输出
每一个滤镜都应该有输入输出,上面的命令ffmpeg -i buck.mp4 -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" out.mp4 -y
中,咱们在分段章节拆分出了三个滤镜,但是可以看到只有中间的滤镜是有输入([tmp])和输出([flip])的,第一个没有输入,只有两个输出([main][tmp]),而最后一个只有两个输入([main][flip]),没有输出,为什么?
因为这个命令中,只有一个输入和输出,所以:
- 对于第一个滤镜来说,默认将输入(buck.mp4)当作它的输入
- 对于最后一个滤镜来说,默认将输出文件(out.mp4)当作它的输出
再看看这个命令
ffmpeg -i buck.mp4 -stream_loop -1 -i 3.mp4 -lavfi "[0:v] transpose [trans];[trans][1:v] overlay" -shortest out.mp4 -y
这个命令中,有两个输入(buck.mp4、3.mp4),对于第一个滤镜([0:v] transpose [trans];
)则需要手动指定具体是哪个输入
结语
对于ffmpeg滤镜来说,我觉得最难明白的就是它的语法,反正我学习下来感受是这样的
对于掌握的同学来说,这些很简单,但是对于不熟悉ffmpeg的同学来说,这个门槛可一点都不低
等了解了它的语法规则后我感觉你就学会了一半,剩下的无非是熟悉它支持哪些滤镜,每个滤镜的功能是什么样子的
文章目录
ffmpeg第1篇:日志级别控制、保存日志到指定文件、处理进度查询
ffmpeg第2篇:简单滤镜与复杂滤镜的区别
ffmpeg第3篇:为视频添加静态水印
ffmpeg第4篇:为视频添加动态水印
ffmpeg第5篇:让水印图片旋转起来
ffmpeg第6篇:滤镜语法
ffmpeg第7篇:数据流选择神器-map指令