Answers:
嘿,有趣的任务。所以我认为解决方案是
ffmpeg -i 1.ts -i 2.ts -filter_complex "[0:v][1:v]overlay=x='if(lte(-w+(t)*100,w/2),-w+(t)*100,w/2)':y=0[out]" -map '[out]' -y out.mp4
此滤镜图从左向右移动第二张图片,直到它到达屏幕的一半(w / 2)。所以你需要修改的是这个表达式中的w / 2。某些静态停止点(100像素)相同:
ffmpeg -i 1.ts -i 2.ts -filter_complex "[0:v][1:v]overlay=x='if(lte(-w+(t)*100,100),-w+(t)*100,100)':y=0[out]" -map '[out]' -y out.mp4
希望能帮助到你。
if
和 lte
表达式可以简化 min
/ max
表达式。请参阅下面的其他答案。 (我最初是为另一个问题编写的,移到这里是为了不创建重复的线程。)
通常,对于幻灯片效果,您必须:
color
资源 。 movie
资源 overlay
过滤 以下是保存图像的示例 image.png
(大小:1920⨉1080,片段持续时间:15秒):
ffmpeg -f lavfi -i "\
color=black:d=15:s=1920x1080[background]; \
movie=image.png[overlay]; \
[background][overlay]overlay='W-n:(H-h)/2' \
" output.mp4
图像将从右向左滑动而不会停止:
以下是图像停在中心的示例:
ffmpeg -f lavfi -i "\
color=black:d=15:s=1920x1080[background]; \
movie=image.png[overlay]; \
[background][overlay]overlay='min(W-n\,0):(H-h)/2' \
" output.mp4
在任何给定时间叠加的位置被指定为选项 overlay
过滤。位置必须作为图像左上角的坐标给出。
上面第一个例子中的X / Y坐标对是 W-n
和 (H-h)/2
,其中:
W
是背景宽度(1920) n
是当前帧号 H
是背景高度(1080) h
是叠加高度(这里1080,但可能不同) 因此,在第0帧,图像最初将被放置在 1920 - 0 = 1920 从左边开始的像素,因此图像将从右侧滑入 ñ 增加。
一些技巧:
x
表达式必须评估为 0
,所以你可以使用 min(W-n, 0)
。在这种情况下,即使帧数大于宽度,图像也不会移动到负x位置,而是保持为0。