FFmpeg filter浅析

filterFFmpeg的滤镜模块AVFilter是一种以管道的方式对音视频进行滤镜(filter)操作以添加特效功能的框架(filter翻译为过滤器更为合适,下面统一以“过滤器”为准)
原始的音频帧(如PCM)或视频帧(如YUV,RGB等)经过filter处理后,得到具有特殊效果的音频帧或视频帧,比如添加旋转、缩放、降噪效果的视频帧,添加回声效果、重采样、音量大小调节后的音频帧等
FFmpeg的libavfilter库内置了非常丰富的过滤器,从官方网站上可以看到audio filters有116个,video filters高达288个,在内置filter不满足需求时还可以自定义filter

http://ffmpeg.org/ffmpeg-filters.html

filter graphs

filter可以单独使用,也可以多个filter形成filter chain,filter chain形成filter graph,过滤器图可以划分为simple和complex

Simple filtergraphs

simple filtergraphs是指只有一个输入和一个输出,且两者都是同一个类型,即只能为音频filter或者只能为视频filter

图片

语法要点

// -vf: 视频filter
// -af: 音频filter
// 多个filter形成链时, 用逗号分隔, filter的参数用冒号分隔
filter1,filter2,...,filterN

举例如下:

单个filter处理

ffmpeg -i oceans.mp4 -vf drawgrid=w=iw/3:h=ih/3:t=2:c=white@0.5 out.mp4

上述命令将对输入视频用线宽为2的白色线画一个3×3的网格

图片

多个filter处理

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的白色线画一个3×3的网格作为中间输出,然后作为scale过滤器的输入执行w/h减半的处理,最终输出out.mp4

图片

每个过滤器需要传哪些参数可以参考官方文档,也可以用如下命令进行查询ffmpeg -h filter=filter_name比如上面的drawgrid过滤器

图片

Complex filtergraphs
complex filtergraphs是指不能简单的描述为应用于一个流的线性处理链,即当图形中有多个输入/输出,或者输出流类型与输入不同

图片

语法要点:

相同filter线性链之间用逗号分隔;

不同filter线性链之间用分号分隔;

[in_link_N]、[out_link_N]: 用来标识输入输出的标签

举例如下

/**
 * input -> split ------[main]------> overlay -> output
              |                           |
            [tmp]                      [flip]
             |                          |
             + ---> crop ---> vflip ----+
 *
*/

命令为

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

图片

~~END~~进技术交流群加:wxid_alaiye 作者:雪月清

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论