ffmpeg滤镜效果

1,116 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

写在前面

为方便展示在文档中,我们预先将视频截取前两秒的画面,并将其转换为GIF

命令:ffmpeg -i [原始视频] -ss [开始时间] -t [截取市场] -r [帧率值] [输出文件]

套用到我们的需求中为:ffmpeg -i 原视频.mp4 -ss 0 -t 2 -r 10 原始.gif

原始视频

如果想要直接看效果可以使用命令:ffplay -i [原始视频] ......

如果想要直接生成效果文件则可以使用命令:ffmpeg -i [原始视频] ...... [输出文件]

关于滤镜的延迟生效问题,我们只需要在滤镜参数中添加enable属性进行设置即可

比如: 下面有个模糊处理的滤镜,其 -vf 的相关参数为 boxblur=2:1:cr=0:ar=0 如果我们想让滤镜在2s后生效,我们可以将参数添加enable属性,即boxblur=enable='gt(t,2)':boxblur=2:1:cr=0:ar=0

完整命令 ffmpeg -i [原始视频] -vf boxblur=enable='gt(t,2)':2:1:cr=0:ar=0 [输出文件]

enable后面为相关的时间表达式,表达式参考链接: ffmpeg.org/ffmpeg-util…

巨量创意链接: cc.oceanengine.com/creative-fa…

模糊处理

  • 参数:boxblur
  • 功能:模糊处理

参数值可以使用:w,h等变量表达式

  • 命令举例:ffmpeg -i [原始视频] -vf boxblur=2:1:cr=0:ar=0 [输出文件]
  • 效果:

模糊

颜色平衡

  • 参数:colorbalance

  • 功能:修改输入帧的基本颜色(红、绿、蓝)的强度。

  • 可接收参数

参数参数说明
rsAdjust red, green and blue shadows (darkest pixels).
调整红色,绿色和蓝色的阴影(最深的像素)。
Allowed ranges for options are [-1.0, 1.0]. Defaults are 0.
选项的允许范围为[-1.0,1.0]。默认值为0。
gs同上
bs同上
rmAdjust red, green and blue midtones (medium pixels).
调整红色、绿色和蓝色的中间色调(中等像素)。
gm同上
bm同上
rhAdjust red, green and blue highlights (brightest pixels).
调整红色、绿色和蓝色高光(最亮的像素)。
gh同上
bh同上
plPreserve lightness when changing color balance. Default is disabled.
改变颜色平衡时保持亮度。默认设置为禁用。
  • 命令举例:ffmpeg -i [原始视频] -vf colorbalance=rh=-.5:pl=false [输出文件]
  • 效果:

颜色平衡

色调调节

  • 参数:colorchannelmixer
  • 功能:通过重新混合颜色通道来调整视频输入帧,通过添加与相同像素的其他通道相关联的值来修改颜色通道。

参数本质就是加权求值时候的权重,每个参数接受0-1得值,滤镜本质是将每个颜色值加权求值.公式: red=red*rr+blue*rb+green*rg+alpha*ra 。green/blue和alpha同理。参数默认值对应得是1,其他为0.如:rr,rg,rb,ra。其中rr默认为1,其他为0

  • 命令举例:

    • 灰色色调:ffmpeg -i [原始视频] -vf colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3 [输出文件]
    • 深褐色色调:ffmpeg -i [原始视频] -vf colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131 [输出文件]
  • 效果:

灰色色调

褐色色调

边框效果

  • 参数:drawbox
  • 功能:在输入图像上绘制一个彩色框
  • 可接收参数:
参数参数说明
x指定框的左上角坐标的表达式。默认为0
y指定框的左上角坐标的表达式。默认为0
w宽度
h高度
c颜色 red@透明度
t厚度
The expression which sets the thickness of the box edge. A value of fill will create a filled box. Default value is 3.
设置盒边厚度的表达式。填充值将创建一个填充框。默认值是3。
  • 命令举例:ffmpeg -i [原始视频] -vf drawbox=x=10:y=10:w=100:h=100:color=green@0.5:t=fill [输出文件]

  • 效果:

边框

网格效果

  • 参数:drawgrid
  • 功能:给出起始坐标 和 网格的宽高颜色就可以绘画出一个网格覆盖在视频上
  • 可接收参数:
  • 命令举例:ffmpeg -i [原始视频] -vf drawgrid=width=100:height=100:thickness=2:color=black@0.9 [输出文件]
  • 效果:

网格

边缘检测

  • 参数:edgedetect
  • 功能:这个最好还是当作中间操作来用,因为单纯过这个滤镜并不会有什么美感,但是边缘检测却是实现其他操作的必经之路,比如:油画效果,动画片效果等等。
  • 可接收参数:
  • 命令举例:
    • 边缘检测:ffmpeg -i [原始视频] -vf edgedetect=low=0.1:high=0.4 [输出文件]
    • 油画/动画效果:ffmpeg -i [原始视频] -vf edgedetect=mode=colormix:high=0 [输出文件]
  • 效果:

边缘检测

油画

亮度、饱和度、对比度

  • 参数:eq

  • 功能:用来调整亮度、饱和度、对比度、gama变换

  • 可接收参数:

参数说明
contrast对比度
brightness亮度
saturation饱和度
gammagama变换
gamma_r
gamma_g
gamma_b

高亮:ffmpeg -i [原始视频] -vf eq=brightness=0.3 [输出文件]

对比度:ffmpeg -i [原始视频] -vf eq=contrast=2 [输出文件]

高饱和:ffmpeg -i [原始视频] -vf eq=saturation=2 [输出文件]

冷暖分割

  • 命令:ffmpeg -i [原始视频] -vf geq=r='X/W*r(X,Y)':g='(1-X/W)*g(X,Y)':b='(H-Y)/H*b(X,Y)' [输出文件]

  • 效果

浮雕

  • 命令:ffmpeg -i [原始视频] -vf format=gray,geq=lum_expr='(p(X,Y)+(256-p(X-4,Y-4)))/2' [输出文件]
  • 效果

光明燃烧效果

  • 命令:ffmpeg -i [原始视频] -vf lutyuv="y=2*val" [输出文件]
  • 效果

多彩效果

  • 命令:ffmpeg -i [原始视频] -vf lutyuv=u='(val-maxval/2)*2+maxval/2':v='(val-maxval/2)*2+maxval/2' [输出文件]

  • 效果

  • 命令:ffmpeg -i [原始视频] -vf swapuv [输出文件]

  • 效果:

光晕效果

  • 命令:ffmpeg -i [原始视频] -vf vignette=PI/4 [输出文件]
  • 效果

粒子特效

  • 粒子效果

  • 原始视频

  • 命令:ffmpeg -i [主视频] -itsoffset [覆盖视频延迟时间] -i [覆盖视频] -filter_complex "[1]format=rgba,colorchannelmixer=aa=[透明度][front];[0][front]overlay=repeatlast=0,format=yuv420p" -y [输出视频]

在一秒之后显示覆盖视频,覆盖视频的透明度为0.6

命令:ffmpeg -i [主视频] -itsoffset 1 -i [覆盖视频] -filter_complex "[1]format=rgba,colorchannelmixer=aa=0.6[front];[0][front]overlay=repeatlast=0,format=yuv420p" -y [输出视频]

  • 效果