如何在 FFmpeg 中创建“窗帘”(“谷仓门”)和“圆形擦拭”效果?

如何在 FFmpeg 中创建“窗帘”(“谷仓门”)和“圆形擦拭”效果?

我尝试使用 FFmpeg 创建两种效果:“窗帘”(“谷仓门”)和“圆形擦拭”,但没有成功。基本思路是从黑屏(100% 黑色填充)开始,在 1 秒(或更长时间)内显示整个视频(顶部和底部的黑色填充应该越来越少)。

示范

我怎样才能做到这一点?

答案1

一般来说,有两种方法可以达到这样的效果。

#1

创建灰度动画蒙版并将其作为 alpha 通道附加到视频。将视频叠加在黑色画布上。

优点:一次性操作即可生成掩码。比方法 2 快得多。
缺点:动画参数(如大小、速度、持续时间)是固定的。这些可以在 ffmpeg 中调整,但结果可能不流畅。需要保留并可访问遮罩文件。

#2

使用混合滤镜,以空白画布作为底层,设置表达式来实现效果。

优点:可定制。可能需要反复试验才能达到精确的效果。
缺点:比方法 1 慢得多。在较小的分辨率下,结果比正确抗锯齿的蒙版更粗糙。如果您不记得表达式或它们的工作原理,则还必须保存表达式,并且调整可能很困难。


话虽如此,以下是使用混合滤镜的两种效果。两种效果均从 2 秒开始,持续 3 秒。

垂直揭开的窗帘

ffmpeg -i in.mp4 -filter_complex \
         "[0]format=yuv444p,split=2[bg][v];[bg]drawbox=t=fill[bg]; \
          [v][bg]blend=all_expr='if(lte(2*abs(Y-H/2)/H,(T-2)/3),A,B)',\
             format=yuv420p" \
 out.mp4

可以从第一个命令调整更快的方法这里。该命令水平执行。

圆形擦拭,扩大

ffmpeg -i in.mp4 -filter_complex \
         "[0]format=yuv444p,split=2[bg][v];[bg]drawbox=t=fill[bg]; \
          [v][bg]blend=all_expr='if(lte(sqrt(pow(X-W/2,2)+pow(Y-H/2,2))/sqrt(pow(W,2)+pow(H,2)),(T-2)/3)/2,A,B)',\
             format=yuv420p" \
 out.mp4

相关内容