关于FFMPEG中的filter滤镜的简单介绍
滤镜的作用主要是对原始的音视频数据进行处理以实现各种各样的效果。比如叠加水印,翻转缩放视频等。
下图表示的正常转码流程,滤镜在解码和编码中间,虚线表示可有可无。
使用命令查看ffmpeg支持的滤镜
ffmpeg -filters
查看某个滤镜的详细参数
ffmpeg -h filter=pad
上图显示的pad滤镜的功能和需要的参数。
ffmpeg中的滤镜可分为:
- source filter 只有输出
- audio filter 音频过滤器
- video filter 视频过滤器
- multimedia filter 复杂过滤器
- sink filter 只有输入
这里需要重点提的两个特别的filter:buffer和buffersink。
(1)buffer:滤波器buffer代表filter graph中的源头,原始数据就往这个filter节点输入的。通过调用该滤波器提供的函数(如av_buffersrc_add_frame)可以把需要滤波的帧传输进入滤波过程。在创建该滤波器实例的时候需要提供一些关于所输入的帧的格式的必要参数(如:time_base、图像的宽高、图像像素格式等)。
(2)buffersink:一个特殊的滤波器,滤波器buffersink代表filter graph中的输出节点,处理完成的数据从这个filter节点输出。通过调用滤波器提供的函数(如av_buffersink_get_frame)可以提供出被滤波过程过滤完成后的帧。
除了source和sink filter,其他filter都至少有一个输入、至少一个输出。
也可以简单的分为简单滤镜和复杂滤镜。
简单滤镜:只有一个输入和输出,命令行中使用 -vf(视频滤镜), -af(音频滤镜)
复杂滤镜:有多个输入和输出,命令行中使用 -lavfi 或 -filter_complex
下图中官方给出一个filtergrpah示例:
在这个滤镜图中,我们可以看到使用4个滤镜
1.使用split滤镜将输入流复制成两路流输出,一个叫main. 一个tmp
2.使用crop滤镜对tmp流进行裁剪
3.使用vflip对tmp流进行垂直翻转
4.使用overlay将tmp流叠加在main流中
可以使用命令行表示如下
ffmpeg -i INPUT -vf 'split [main][tmp]; [tmp] crop=iw:ih/2:0:0,vflip [flip]; [main][flip] overlay=0:H/2' OUTPUT
同一路的滤镜间用逗号(‘,’)进行分割,不同路的滤镜间用分号(‘;’)进行分割。
Filter的语法
Filter 的语法
filter_name=param_name1=param_value1:param_name2=param_value2
filter_name : 是fliter的名称, 必须有;它的参数是可选 的,以":"分隔或"+"号,可以有参数名,也可以没有;
例如:
ffmpeg -i video.avi -filter_complex 'extractplanes=y+u+v[y][u][v]' -map '[y]' y.avi -map '[u]' u.avi -map '[v]' v.avi
这个抽取视频Y、U、V分量的filter,就有三个输出,分别是 [y][u][v], 抽取后,将不同的输出保存到不同的文件中
没有音频、视频输入的filter称为source filter
没有音频、视频输出的filter称为sink filter
filterchain的语法
filter1,filter2,....
它是多个filter的组合,以逗号分隔;并且每个filter是输入是前一个filter的输出;
ffmpeg -i audio.aac -filter_complex "aresample=async=16000,adelay=316397,volume=1.0" -acodec libfdk_aac -y output.mp4
这里用到了三个filter,分别的aresample, adelay, volume, 组成一个filterchain;
filtergraph的语法
filterchain1;filterchain2;...
它是多个filterchain的组合,以分号";"分隔,
ffmpeg -i INPUT -filter_complex "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT
这里用到了三个filterchain, 分别是:
split [main][tmp]; // 它只有一个filter,即 split; 它有一个默认的输入,即INPUT解码后的frame;
有两个输出, 以 [main], [tmp] 标识;
[tmp] crop=iw:ih/2:0:0, vflip [flip] // 它由两个filter组成,即crop和vflip;一个输入 [tmp], 一个输出[flip];
[main][flip] overlay=0:H/2 // 它由一个filter组成,即overlay, 有两输入,分别是[main][flip], 一个默认的输出;
常用滤镜
- scale:视频/图像的缩放
- overlay:视频/图片的叠加
- crop:视频/图像的裁剪
- trim:截取视频的片段
- rotate:以任意⻆度旋转视频
- movie:加载第三方的视频,图片
- yadif:去隔行
- pad: 填充视频
- drawtext: 添加文字