FFmpeg 滤镜详解

1. 概念介绍

在多媒体处理中,术语滤镜(filter)指的是修改未编码的原始音视频数据帧的一种软件工具。

2. 基本原理

● 在编码前,ffmpeg可以对raw(真实/原)音频和视频使用libavfilter库中的滤镜进行处理。(非压缩数据帧)

● 多个滤镜可以组成滤镜链图(滤镜链图filtergraphs )。

● 在ffmpeg看来只有2种滤镜:简单滤镜,复合滤镜。

2.1 简单滤镜

简单滤镜就是只有1个输入和输出的滤镜,滤镜两边的数据都是同一类型的,可以理解为在非压缩数据帧到再次编码前简单附加了一步:

2.2 复合滤镜

complex filtergraph,通常是具有多个输入输出文件,并有多条执行路径;ffmpeg命令行中使用-lavfi、-filter_complex,基本原理图如下:

2.3 原理示例

在libavfilter, 一个filter可以包含多个输入、多个输出。下图是一个filtergraph的示例:

在这个滤镜链图中,利用split滤镜把输入流分离成了两路流,其中一路通过crop滤镜和vfilp滤镜的同一路级联应用,再同另外一路一起通过overlay滤镜处理的流合成进行输出。则可以采用如下的命令行实现:

这个filtergraph可以用下面命令行表示:

ffmpeg -i INPUT -vf 'split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2' OUTPUT

这样最终输出将是视频上部是原始,下部是上部的镜像。(倒影效果)

ffplay -i Irving_360p.mp4 -vf 'split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2'

同一路的滤镜间用逗号(‘,’)进行分割,不同路的滤镜间用分号(‘;’)进行分割。

在这个例子里面crop和vflip是在同一路中的滤镜,split和overlay则不是同一路的(同一路的级联是对连续的视频进行,如果涉及到一输多、多输一或者多输多则都不是在同一路的,即不是同一路级联)。可以通过在方括号(’[]’)中的标签名来命名处理的链路。这个例子里,split滤镜生成了两路就通过[main]和[tmp]进行了标签命名以方便后续处理。

其中被split处理输出的第二路流被命名为[tmp],它又被crop滤镜处理裁去下半部视频,然后通过vflip进行了水平镜像(垂直翻转,即把视频镜像到下半部了)。这是整个输出被命名为flip。再把[main]与flip通过overlay进行覆盖合成,即把源输入通过split滤镜获得的[main]的上半部分覆盖到由crop和vflip滤镜级联处理的输出(这里的[flip])上最终得到了镜像结果。

一些滤镜支持参数列表: 滤镜名=由冒号(‘:’)隔开的多个参数

2.4 例子

比如视频缩放、截取、翻转、叠加、模糊等。其中定义了很多的filter,例如以下常用的一filter。

#缩放
ffplay -i good.mp4 -vf scale=iw/2:ih/2
#叠加
ffmpeg -i good_scale.mp4 -i mark.png -filter_complex overlay=main_w-overlay_w-10:main_h-overlay_h-10 good_mark.mp4
#裁剪
ffplay -i good_scale.mp4 -vf crop=w=200:h=200:x=100:y=0
#截取视频
ffmpeg -i good_scale.mp4 -vf trim=10:30 good_trim.mp4
#模糊
ffplay -i good.mp4 -vf boxblur=luma_radius=2:luma_power=1
#边缘检测
ffplay -i good_scale.mp4 -vf 'edgedetect=low=0.1:high=0.4'

 

3. Filter的语法

一个滤镜链图(filtergraph)是连接滤镜的有向图。它可以包含循环动作,也可以在多个滤镜间形成链路,每个链接都有一个连接到滤镜的输入和一个连接到滤镜的输出。(参考)

滤镜链图采用文本表示,其有由一些ffmpeg和ffplay通用的选项-filter/-vf/-af和-filter_complex(ffmpeg)以及-vf/-af(ffplay)外加定义与libavfilter/avfilter.h的avfilter_graph_parse_ptr()等来描述。

(1)一个滤镜链包含序列链接起来的滤镜,这个序列由“,”分隔各个滤镜描述;

(2)一个滤镜链图包含序列滤镜链,这个序列有“;”分隔各个滤镜链描述

CSDN后台私信或文末卡片加入免费领取最新最全C++/音视频开发学习提升资料,内容包括(C/C++,Linux 服务器开发,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

一个滤镜由一个字符串表单表示:

[input_link_lable1][input_link_lable2]... filter_name=parameters [output_link_lable1][output_link_lable12]...

(1) 输入输出都有连接标号(link lable),连接符号是可选项,在滤镜名和参数前 和 后 有一个连接标签列表。一个连接标签允许命名1个名字的连接,其作为滤镜的输入或者输出端口。

如果一个输出端没有命名标签,它默认连接到滤镜链上后面滤镜中第一个没有命名标签的输入端

(2) filter_name是滤镜类名字

(3) =arguments用于指定滤镜选项:参数表示法如下规则

(3.1)“:”分隔的key=value列表

举个例子:ffplay -i good.mp4 -vf scale=iw/2:ih/2

(3.2)一个“:”分隔的列表value值,在这种情

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值