FFmpeg 滤镜详解

FFmpeg Filter

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] crop=iw:ih/2:0:0, vflip [flip]; main overlay=0:H/2" OUTPUT 这样最终输出将是视频上部是原始,下部是上部的镜像。(倒影效果) ffplay -i Irving_360p.mp4 -vf "split main; [tmp] crop=iw:ih/2:0:0, vflip [flip]; main 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)一个滤镜链图包含序列滤镜链,这个序列有“;”分隔各个滤镜链描述

一个滤镜由一个字符串表单表示: input_link_lable1... filter_name=parameters output_link_lable1...

(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值,在这种情况下,键(key)假定为选项名声明顺序 举个例子:ffplay -i good_scale.mp4 -vf fade=in:0:30(淡入视频的前30帧),按顺序声明了3个选项type、start_frame和nb_frames (3.3)上面两个规则混用 (3.4)如果选项的值本身就是一个列表(例如format滤镜有一个像素格式列表选项),则这种列表通常用“|”分隔 举个例子:将输入视频转换为列表中的任何格式 ffmpeg -i good_scale.mp4 -vf "format=pix_fmts=yuv420p|yuv444p|yuv410p" format.mp4

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

 

4. 功能工具

4.1 工具graph2dot

FFmpeg工具目录下包含一个graph2dot程序可以用来分析滤镜链图描述并产生用dot语言描述的对应文本表示。 命令:dot -Tpng graph.tmp -o graph.png 描述文件:graph.tmp

生成图:

下载链接

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值