我如何使用 FFMPEG 指定视频覆盖的持续时间?

我如何使用 FFMPEG 指定视频覆盖的持续时间?

我正在为 YouTube 制作视频,我已经在完整的视频编辑程序中编辑和润色了它。我最不想做的事情就是添加一个覆盖横幅订阅播放列表按钮,我将把它们变成注释。我希望它出现在视频的前 5 秒。不幸的是,我的完整视频编辑程序无法做到这一点,所以我想使用 FFMPEG 来实现这个效果。

我看过一些关于这个的教程(这个其中一些看起来非常棒,但是都没有提到如何指定覆盖的持续时间。

有人知道我该如何实现这个吗?提前谢谢!:)

答案1

淡入淡出和叠加

你可以将淡入淡出和叠加滤镜链接在一起,如下所示:

ffmpeg -i input.mp4 -f image2 -loop 1 -r 24 -i banner.png -filter_complex \
'[1:v]fade=out:96:24:alpha=1[wm];[0:v][wm]overlay=10:10[outv]' \
-map [outv] -map 0:a -c:a copy -c:v libx264 -preset veryfast output.mp4

-f image2 -loop 1 -r 24 -i banner.png将 banner.png 变成 24fps 的视频,无限循环。

[1:v]fade=out:96:24:alpha=1[wm]使水印从第 96 帧(4 秒 @ 24fps)开始淡出,并在 24 帧(1 秒 @ 24fps)内淡出;并且它将淡出阿尔法通道,这意味着水印将变为透明,而不是淡化为黑色块。这将创建一个标记为 [wm] 的输出。请注意,淡化长度的最小值为 1 帧。

[0:v][wm]overlay=0:0[outv] 覆盖input.mp4 上的横幅,创建标有 [outv] 的输出。

-map [outv] -map 0:a告诉 ffmpeg 在输出中使用 [outv] 和来自 input.mp4 的音频。其余选项是编码选项。

您可以让横幅淡入通过链接两个淡入淡出过滤器来实现淡出。以下将使横幅从第 96 帧开始淡入,持续时间为 24 帧;然后从第 216 帧(9 秒 @ 24fps)开始淡出,持续时间为 24 帧:

ffmpeg -i input.mp4 -f image2 -loop 1 -r 24 -i banner.png -filter_complex \
'[1:v]fade=in:96:24:alpha=1,fade=out:216:24:alpha=1[wm];[0:v][wm]overlay=10:10[outv]' \
-map [outv] -map 0:a -c:a copy -c:v libx264 -preset veryfast output.mp4

-ss使用和寻找流-t

这实现了类似的最终结果,但需要创建更大的中间文件。然而,它只对前五秒部分进行转码,因此可以节省处理能力并且可能更快。

-t这涉及使用和将视频切成两部分-ss,将水印放在第一个五秒的视频上,然后连接把两个视频放在一起。

ffmpeg -i input.mp4 -i watermark.png \
-filter_complex '[0:v][1:v]overlay[outv]' -map [outv] -map 0:a \
-t 5 -c:a copy -c:v libx264 -crf 22 -preset veryfast start.mp4

ffmpeg -i input.mp4 -ss 5 -c copy end.mp4

然后使用 concat 解复用器连接两个视频:首先创建一个名为inputs.txt的文件,其中包含以下行:

file 'start.mp4'
file 'end.mp4'

然后,

ffmpeg -f concat -i inputs.txt -c copy output.mp4

相关内容