我连接了 9 张图片,每张图片的尺寸完全相同,均为 320x562。它们被放置在一个水平行中,从而生成一个 2880x562 的文件。
现在我想把320x562的空白屏幕作为背景,并将这个大的平面文件从右向左移动作为覆盖以产生滑动效果。
这是我经过一些实验后使用的命令:
ffmpeg -loop 1 -i result.jpg -filter_complex "nullsrc=size=320x562 [background];[0:v] setpts=PTS-STARTPTS [catalog]; [background][catalog] overlay=shortest=1:x='if(gte(t,4)*lte(x, 2880), -(t-4)*165)'" -t 24 -y out.mp4
它将覆盖图像放置在与背景相同的位置作为起点。
尽管它看起来正在做我想要做的事情,但我无法理解用于计算覆盖值的表达式X
。
我想让覆盖层在和处开始浮动
t>4
,x<=2560
因此即使t
增加,幻灯片也应该在覆盖层的右上位置与背景的右上位置相交处停止。计时似乎有效,但位置限制无效。我如何引用当前的X
?表达式的一部分有误
-(t-4)*144
。总持续时间为 24。叠加层在第 4 秒后开始滑动。因此,视频应显示9 * 320
20 秒内像素 (2880) 的滑动。但它给出的是 144,因为 2880/20 的结果使叠加层在大约 22 秒后耗尽,之后会出现一些垃圾像素。让叠加层在结束时准确结束的最佳方法是什么?
答案1
由于您正在从右向左滑动目录图像,并希望在第 9 个图像与背景重合时停止,因此您需要覆盖层x
= -8*320
。-2560
但由于您在发生这种情况时停止覆盖,因此您只需要计算速度,即 2560/20 = 128。
所以,
ffmpeg -loop 1 -t 24 -i result.jpg
-filter_complex
"nullsrc=size=320x562[background];
[background][0:v]overlay=shortest=1:x='min(0,-(t-4)*128))'"
-y out.mp4