FFmpeg filter浅析--上篇

2022-11-19 10:13:19 浏览数 (2)

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文件

0 人点赞