转自https://mp.weixin.qq.com/s?__biz=MzUyMTUxMDQzMw==&mid=2247483847&idx=1&sn=75336bd2bc826d3d8d995b972b8353c5&chksm=f9db4a89ceacc39f4bd21a1e84e5fe75f3b11fe7a2c9699a1aa1ea2fd5d77b00a6ac1198d16d&mpshare=1&scene=23&srcid=05107lQ0YZ3KSTTO9HPG0WaU#rd
小程之前介绍“把文字或图像绘制到视频上”时,讲解了FFmpeg的drawtext滤镜,而实际上,FFmpeg的滤镜很强大,远不止加字幕或加图片的功能。
滤镜是很有趣的,比如可以把图片变模糊、变色、缩放旋转,等等。
本文介绍FFmpeg滤镜的使用。
主要目的是让读者感受一下FFmepg的滤镜效果,这样在实际需要某种效果时,可以考虑使用FFmpeg。
小程这里直接使用FFmpeg的命令行来使用滤镜,不涉及写代码调用FFmpeg的内容,并且这里都是对图片进行滤镜处理,读者会看到很多有趣的处理效果。
但是,由于FFmpeg滤镜的内容很多,小程这里没有一一介绍,读者如果想详细了解这部分内容的话,可以查阅官方文档:
http://www.ffmpeg.org/ffmpeg-filters.html#Video-Filters
本文有较多图片。
先要让ffmpeg程序支持滤镜,对于FFmpeg的安装或编译,读者可以关注“广州小程”微信公众号,并查阅“音视频”方面的文章,里面有详细的介绍。
小程之前介绍过,让FFmpeg支持滤镜的话,需要在配置FFmpeg时指定使用avfilter:
./configure –enable-avfilter
最终编译出来的FFmepg是支持滤镜的,比如,小程的ffmpeg程序的滤镜信息是这样的:
小程的ffmpeg程序已经可以用于滤镜处理了,比如之前加字幕、加图片的操作,用的就是这个ffmepg程序。
参数boxblur。
./ffmpeg -i 1.jpg -vf boxblur=2 blur1.jpg
有几个办法。
调整rgb某个维度的权重实现变色。
选项有三组,分别为rs/gs/bs、rm/gm/bm、rh/gh/bh。每一个选项都指定了目标颜色(rgb中的一个),s表现偏暗,m表现偏中间,h表现偏亮(且平滑)。
选项的值范围为[-1, 1],正数表示偏向目标颜色,负数表示远离目标颜色。
比如这三个命令:
./ffmpeg -i 1.jpg -vf colorbalance=rs=1 colorbalance1-1.jpg
./ffmpeg -i 1.jpg -vf colorbalance=rm=1 colorbalance1-2.jpg
./ffmpeg -i 1.jpg -vf colorbalance=rh=1 colorbalance1-3.jpg
再比如把图片变得冷色一点:
./ffmpeg -i 2.jpg -vf colorbalance=rh=-0.6 colorbalance2.jpg
对rgba四个通道进行重新计算,并分别给定权重比例。
先看命令:
./ffmpeg -i 3.jpg -vf colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3 colorchannelmixer3.jpg
./ffmpeg -i 2.jpg -vf colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131 colorchannelmixer2.jpg
每个通道的权重从0到1,先给red的计算权重,即red=red*rr + blue*rb + green*rg +
alpha*ra,然后分别是green跟blue的计算权重。
改变色调,相当在调色板上调色。
./ffmpeg -i 2.jpg -vf hue=h=30:s=1 hue_30.jpg
s为饱和度,范围为[-10,10],默认为1。h为角度,不同角度有不同的颜色布局(类比调色板),范围为[0,360],超过360则相当于从0开始,默认为0。
以下效果为s=1(默认),h分别为30、60、90、120、160、180、210、250、280、320、360时的效果(在360时,就是原图):
再比如,只调饱和度s:
./ffmpeg -i 2.jpg -vf hue=h=0:s=-5 hue_s-5.jpg
以下效果为h=0(默认),s分别为-10、-5、0、1、5、10时的效果(在1时,就是原图):
./ffmpeg -i 2.jpg -vf lutyuv="y=maxval+minval-val:u=maxval+minval-val:v=maxval+minval-val" lutyuv1.jpg
./ffmpeg -i 2.jpg -vf lutyuv="y=negval:u=negval:v=negval" lutyuv2.jpg
lutyuv用于yuv颜色空间。这两个命令的效果是一样的,都是反转,得到底片的效果:./ffmpeg -i 2.jpg -vf lutyuv=y=negval lutyuv2.jpg
把亮度(y)反转,效果如下:./ffmpeg -i 2.jpg -vf lutyuv="u=128:v=128" lutyuv3.jpg
把色度移除(uv),得到黑白图:./ffmpeg -i 2.jpg -vf lutyuv="y=2*val" lutyuv4.jpg
提升亮度,效果如下:./ffmpeg -i 2.jpg -vf lutyuv='u=1.2*val:v=1.1*val' lutyuv5.jpg
调整uv的值,效果如下:
反转,得到底片的效果,参数值为0或1,为1时表示把alpha通道也反转,默认为0。
./ffmpeg -i 3.jpg -vf negate=0 negate1.jpg
uv互换。
./ffmpeg -i 2.jpg -vf swapuv swapuv1.jpg
参数crop,支持裁剪多大、在哪个位置开始,也支持带变量的更复杂的裁剪。
./ffmpeg -i 1.jpg -vf crop=200:300:100:100 crop1.jpg
./ffmpeg -i 1.jpg -vf crop=w=200:h=300:x=100:y=100 crop2.jpg
这两个命令是一样的,都是在(100,100)的位置,裁剪200*300的大小,效果如下:./ffmpeg -i 1.jpg -vf crop=400:500 crop2.jpg
这个命令是从中间开始,裁剪400*500的尺寸。
参数delogo,在指定的区域作模糊处理,达到消除logo的效果。
./ffmpeg -i 2.jpg -vf delogo=x=0:y=0:w=50:h=50:band=5:show=1 delogo2.jpg
band为模糊的强度,show为1时显示模糊的区域框,省略show或值为0时不显示区域框。
参数drawbox。
./ffmpeg -i 2.jpg -vf drawbox drawbox1.jpg
在边界画一个实心的黑框,效果如下:./ffmpeg -i 2.jpg -vf drawbox=10:10:200:100:[email protected] drawbox2.jpg
./ffmpeg -i 2.jpg -vf drawbox=x=10:y=10:w=200:h=100:[email protected] drawbox2.jpg
这两个命令是一样的,0.5为边框的透明度(0到1),效果如下:./ffmpeg -i 2.jpg -vf drawbox=x=10:y=10:w=300:h=230:[email protected]:t=10 drawbox3.jpg
t为边框厚度,效果如下:
参数drawgrid。
./ffmpeg -i 2.jpg -vf drawgrid=w=iw/3:h=ih/3:t=2:[email protected] drawgrid1.jpg
画一个3*3的白色的厚度为2,透明度为0.5的网络,效果如下:./ffmpeg -i 2.jpg -vf drawgrid=w=400:h=100:t=2:[email protected] drawgrid2.jpg
画每个单元为400*100的网格,效果如下:
参数为drawtext,这个小程之前已经详细介绍过了,请关注“广州小程”微信公众号查阅相应文章。
参数edgedetect。
./ffmpeg -i 2.jpg -vf edgedetect=low=0.1:high=0.4 edge2-1.jpg
./ffmpeg -i 2.jpg -vf edgedetect=low=0.5:high=0.8 edge2-2.jpg
low小于等于high,且值的范围为[0,1],是检测算法使用的阈值。
再比如:
./ffmpeg -i 1.jpg -vf edgedetect=low=0.1:high=0.2 edge1-1.jpg
效果是这样的:
参数为eq,可以调整亮度、饱和度、对比度等。
./ffmpeg -i 2.jpg -vf eq=brightness=0.2 eq1.jpg
brightness为亮度,值范围为[-1,1],效果是这样的:./ffmpeg -i 2.jpg -vf eq=contrast=1.5 eq2.jpg
contrast是对比度,值范围为[-2, 2],效果如下:./ffmpeg -i 2.jpg -vf eq=saturation=0.1 eq3.jpg
saturation是饱和度,值范围为[0,3],默认是1,效果如下:./ffmpeg -i 2.jpg -vf eq=gamma_r=0.2 eq4.jpg
调整gamma系数,范围为[0.1,10],默认是1,效果如下:
参数scale。
./ffmpeg -i 3.jpg -vf scale=200:200 scale1.jpg
缩放为200*200,效果如下:
参数hqx。
./ffmpeg -i 2.jpg -vf hqx=4 hqx1.jpg
效果是尺寸等比放大4倍。
参数hflip。
参数vflip。
参数noise。
./ffmpeg -i 3.jpg -vf noise=alls=100:allf=t+u noise1.jpg
alls表示所有像素成分的强度,范围为[0,100],默认为0;allf表示所有像素成分的噪音类型,t为临时噪音,u为统一噪音。效果如下:./ffmpeg -i 3.jpg -vf noise=alls=100:allf=a noise2.jpg
a表示平滑的平均噪音,效果如下:./ffmpeg -i 3.jpg -vf noise=alls=100:allf=p noise3.jpg
p表示随机噪音,效果如下:
参数overlay。
这个小程之前介绍在视频上加logo(图片或gif图)时讲解过,请读者关注“广州小程”微信公众号并查阅相应内容。
参数pad。
./ffmpeg -i 2.jpg -vf pad=500:500:40:40:violet pad1.jpg
./ffmpeg -i 2.jpg -vf pad=width=500:height=500:x=40:y=40:color=violet pad2.jpg
以上两个命令是一样的效果,增加一个500*500的底面板,(x,y)是原图摆放的位置:
参数rotate。
参数vignette。
FFmpeg的部分滤镜效果就介绍到这里,读者如果想详细了解,可以查看FFmpeg的滤镜文档:
http://www.ffmpeg.org/ffmpeg-filters.html#Video-Filters
总结一下,本文介绍了如何使用FFmpeg命令行来调用滤镜处理,并且给出了处理的效果。这里只是小部分滤镜介绍,希望能让读者对滤镜有个感知,如果实际要使用到,则可以详细查看相应的文档说明。