filter
FFmpeg的滤镜模块AVFilter是一种以管道的方式对音视频进行滤镜(filter)操作以添加特效功能的框架
(filter翻译为过滤器更为合适,下面统一以“过滤器”为准)
原始的音频帧(如PCM)或视频帧(如YUV,RGB等)经过filter处理后,得到具有特殊效果的音频帧或视频帧,比如添加旋转、缩放、降噪效果的视频帧,添加回声效果、重采样、音量大小调节后的音频帧等
FFmpeg的libavfilter库内置了非常丰富的过滤器,从官方网站上可以看到audio filters有116个,video filters高达288个,在内置filter不满足需求时还可以自定义filter
代码语言:javascript复制http://ffmpeg.org/ffmpeg-filters.html
filter graphs
filter可以单独使用,也可以多个filter形成filter chain,filter chain形成filter graph,过滤器图可以划分为simple和complex
Simple filtergraphs
simple filtergraphs是指只有一个输入和一个输出,且两者都是同一个类型,即只能为音频filter或者只能为视频filter
语法要点
代码语言:javascript复制// -vf: 视频filter
// -af: 音频filter
// 多个filter形成链时, 用逗号分隔, filter的参数用冒号分隔
filter1,filter2,...,filterN
举例如下:
单个filter处理
代码语言:javascript复制ffmpeg -i oceans.mp4 -vf drawgrid=w=iw/3:h=ih/3:t=2:c=white@0.5 out.mp4
上述命令将对输入视频用线宽为2的白色线画一个3x3的网格
多个filter处理
代码语言:javascript复制ffmpeg -i oceans.mp4 -vf drawgrid=w=iw/3:h=ih/3:t=2:c=white@0.5,scale=w=iw/2:h=ih/2 out.mp4
上述命令先将输入视频用线宽为2的白色线画一个3x3的网格作为中间输出,然后作为scale过滤器的输入执行w/h减半的处理,最终输出out.mp4
每个过滤器需要传哪些参数可以参考官方文档,也可以用如下命令进行查询
ffmpeg -h filter=filter_name
比如上面的drawgrid过滤器
Complex filtergraphs
complex filtergraphs是指不能简单的描述为应用于一个流的线性处理链,即当图形中有多个输入/输出,或者输出流类型与输入不同
语法要点:
相同filter线性链之间用逗号分隔;
不同filter线性链之间用分号分隔;
[in_link_N]、[out_link_N]: 用来标识输入输出的标签
举例如下
代码语言:javascript复制/**
* input -> split ------[main]------> overlay -> output
| |
[tmp] [flip]
| |
---> crop ---> vflip ----
*
*/
命令为
代码语言:javascript复制ffmpeg -i oceans.mp4 -vf "split[main][tmp];[tmp]crop=iw:ih/2:0:0,vflip[flip];[main][flip]overlay=0:H/2" -b:v 3859k out.mp4
上述命令先将输入文件经过split过滤器,输出main和tmp;
tmp依次经过crop过滤器和vflip过滤器,输出为flip;
main和flip输入overlay过滤器输出out文件