You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFmpeg叠加层移动技术咨询:固定时长移动与指定时段表达式实现

我来帮你解决这两个FFmpeg叠加层动画的问题,都是通过overlay滤镜的表达式求值功能实现的,直接上具体方案:

问题1:3秒内将叠加层从x1移动到x2

要实现这个线性移动效果,我们可以利用FFmpeg的时间变量t(单位为秒)来计算叠加层的实时x坐标。假设你的起始位置x1=100,目标位置x2=500,移动时长3秒,对应的滤镜参数可以这么写:

ffmpeg -i bg.mp4 -i fg.png -filter_complex "[0:v][1:v]overlay=x='100 + (500-100)*t/3':y=230:enable='t<=3'" -c:a copy output.mp4

关键细节解释:

  • x='100 + (500-100)*t/3':这是核心的线性移动表达式,(x2-x1)是总移动距离,除以3秒得到每秒移动的距离,乘以当前时间t再加上起始x1,就得到实时的x坐标。
  • enable='t<=3':这个参数确保动画只在前三秒运行,3秒后叠加层会固定在x2的位置(如果不加这个,表达式会继续计算,导致x坐标超出预期范围)。
  • 你可以根据实际需求替换100和500为自己的x1、x2数值。
问题2:实现两段往返移动的动画

这个需求需要分多个时间区间处理:静止→移动到x2→静止→移回x1→静止。我们用嵌套的if和between函数判断当前时间所处区间,再执行对应的位置计算。同样假设x1=100,x2=500,对应的完整滤镜参数如下:

ffmpeg -i bg.mp4 -i fg.png -filter_complex "[0:v][1:v]overlay=x='if(between(t,0,5),100,if(between(t,5,8),100 + (500-100)*(t-5)/3,if(between(t,8,17),500,if(between(t,17,20),500 - (500-100)*(t-17)/3,100))))':y=230" -c:a copy output.mp4

表达式逻辑拆解:

  • between(t,0,5):0-5秒,叠加层固定在x1(100)的位置
  • between(t,5,8):5-8秒(共3秒),从x1线性移动到x2,用(t-5)计算这段时间内的进度,确保从0开始递增到1
  • between(t,8,17):8-17秒,叠加层固定在x2(500)的位置
  • between(t,17,20):17-20秒(共3秒),从x2线性移回x1,用(t-17)计算进度,通过x2 - 移动距离*进度实现反向移动
  • 20秒之后,叠加层回到x1(100)并保持静止

你可以根据需求替换100、500以及各个时间点的数值。

内容的提问来源于stack exchange,提问作者user871623

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:42:45