当你看到这样的动图时,你会想到这是用FFmpeg做出来的吗?
FFmpeg,作为一款强大的视频编辑处理工具,在基础的视频处理上十分可靠,在音视频编解码上大放异彩,那么它在动态效果上的应用怎么样呢,笔者为此做了一定的实践,踩了不少坑,现将FFmpeg文字方框动效实现的工作总结如下。
下文将按照实现最终动效的探索顺序一步一步展示。
1、文字淡入淡出
首先要实现的第一个动效是:文字淡入淡出
经过查询,可以用fade函数来控制文字的淡入淡出,用enable来控制时间。
话不多说,直接上案例代码:
ffmpeg -i test.mp4 -lavfi "drawtext=text='Summer Video':fontsize=40:box=1:x=w/2:y=h/2:enable='between(t,8,15)',fade=t=in:start_time=8:d=1:alpha=1,fade=t=out:start_time=14.5:d=1:alpha=1[fg];[0][fg]overlay=format=auto,format=yuv420p" -c:a copy output2.mp4
tips及小坑:
- “-lavfi” 等价于 “-filter_complex”
- -y无条件覆盖之前的输出
- -c:a copy对音频可以不用编码所以直接复制比较快
- fade函数的alpha必须等于1,否则会黑屏
2、向上向下擦除效果
要实现向上向下擦除效果,目前ffmpeg并没有特定的滤镜实现,因此只能曲线救国,通过控制x,y与时间戳t参数的计算公式的方式去实现。具体代码如下:
ffmpeg -i test.mp4 -lavfi "drawtext=text='Summer Video':fontsize=50:box=1:boxcolor=white:alpha=0.5:x=(w-tw)/2:y='if(lte(t,9),(h-th)/2+(t-9)*30,if(gte(t,14),(h-th)/2+(t-14)*30,(h-th)/2))':enable='between(t,8,15)',fade=t=in:start_time=8:d=1:alpha=1,fade=t=out:start_time=14:d=1:alpha=1[fg];[0][fg]overlay,format=yuv420p" -c:a copy output2.mp4
通过写x,y与t的表达式,可以人工去制造x,y的动态变化,同时从此例可以看到,ffmpeg的if语法以及lte,gte函数的使用。
3、背景框+文字
如果想要背景框和文字一起出现,那么可以用以下代码实现:
ffmpeg -i test.mp4 -filter_complex "drawbox=(iw-w)/2:(ih-h)/2:360:100:[email protected]:t=fill:enable='between(t,8,15)',drawtext=text='Summer Video':fontsize=50:x=(w-tw)/2:y='if(lte(t,9),(h-th)/2+(t-9)*30,if(gte(t,14),(h-th)/2+(t-14)*30,(h-th)/2))':enable='between(t,8,15)',fade=t=in:start_time=8:d=1:alpha=1,fade=t=out:start_time=14:d=1:alpha=1[fg];[0][fg]overlay=format=auto,format=yuv420p" -c:a copy output2.mp4
- T是填充度,表示填充的像素个数 t=fill表示填充
- Drawbox中iw即为视频输入画面的宽度,所以中心位置应该为:
- x=(iw-w)/2:y=(ih-h)/2:w=360:100(视频尺寸为1280*720)
- 注意:单独使用drawtext时要记得在drawtext=后加上双引号“