滤镜(Filters):在编码前,对原音视频使用libavfilter库中的滤镜进行处理,FFmpeg内置了许多多媒体过滤器,可以通过多种方式组合它们。
分为两种滤镜:简单滤镜和复合滤镜
简单滤镜:
简单滤镜就是只有1个输入和输出的滤镜,使用-vf和-af分别对应视频和音频
复合滤镜:
复合滤镜就是那些不能简单的描述为一个线性处理过程应用到一个流的情况,例如包含多个输入输出。
复合滤镜使用-filter_complex进行设置
滤镜的使用一般是 滤镜名=由于冒号(:)隔开各个参数
滤镜链图(filtergraphs)是连接滤镜的有向图,它可以包含循环动作,也可以在多个滤镜间形成链路,每个链接都有一个连接到滤镜的输入和一个连接到滤镜的输出
一个滤镜链(filterchains)包含序列链接起来的滤镜,这个序列由“,"分隔各个滤镜
一个滤镜链图(filtergraphs)包含序列滤镜链,这个序列由“;”分隔各个滤镜链
同一路的滤镜间用逗号(,)进行分割,不同路的滤镜间用分号进行分割(;)
例如用在视频中同时加入多个文字和多个图片,使用到多个滤镜就需要使用滤镜链,而指定输入输出标签就形成滤镜链图
ffmpeg -i video.mp4 -i logo.png -i logo1.png -filter_complex "[1:v]scale=30:30[img1];[2:v]scale=30:30[img2];[0:v][img1]overlay=(main_w-overlay_w)/2+t*100:(main_h-overlay_h)/2[bkg];[bkg][img2]overlay=0:0",drawtext="fontfile=fonts/Medium.ttf:text='hello':fontcolor=white:fontsize=50:x='if(between(t,2,10),150,NAN)':y=120" -y output.mp4
解析:
1.[0:v]指定流 ,0表示第0个文件,v表示操作对象里的视频信息。
2.[img1]是对scale滤镜的处理结果命名标记标签,[0:v][img1]表示将scale缩略处理后的图片覆盖到视频上,类似这个包含链接输入输出标记如[img1]的就组成滤镜链图filtergraphs
3.由于使用overlay添加图片水印,使用drawtext添加文字水印,这个两个滤镜间使用逗号,分割开来,组成一个滤镜链
4.overlay中t*100,表示从x轴以100的速度移动
5.x='if(between(t,2,10),150,NAN)’表示在2,10秒的区间显示字幕。if(条件,条件为true时的值,条件为false时的值)