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

使用FFmpeg实现小视频在大视频内左右往复循环移动的代码指导

嗨,这个需求用FFmpeg的滤镜系统就能完美实现!我给你准备了直接可用的命令,还有详细的参数解释,方便你调整细节:

实现小视频在大视频内左右往复循环的FFmpeg命令

首先给你完整的可运行命令(假设大视频是big.mp4,小视频是small.mp4,输出为output.mp4):

ffmpeg -i big.mp4 -i small.mp4 -filter_complex "[0:v]setpts=PTS-STARTPTS[bg];[1:v]setpts=PTS-STARTPTS,format=yuva420p,colorchannelmixer=aa=1[fg];[bg][fg]overlay=x='if(gte(t,0),mod(t*50,2*(W-w))-if(mod(t*50,2*(W-w))>(W-w),2*(mod(t*50,2*(W-w))-(W-w)),0),0)':y=(H-h)/2:shortest=1" output.mp4

参数详细拆解

我把每个部分的作用拆解开,方便你按需调整:

  • -i big.mp4 -i small.mp4:指定背景大视频和前景小视频的输入文件
  • [0:v]setpts=PTS-STARTPTS[bg]:重置背景视频的时间轴,确保和前景视频同步开始
  • [1:v]setpts=PTS-STARTPTS,format=yuva420p,colorchannelmixer=aa=1[fg]:
    • 重置前景视频的时间轴,避免时间不同步
    • 转换为带Alpha通道的视频格式,保证overlay滤镜正常工作
    • colorchannelmixer=aa=1确保前景视频的透明度正常(如果你的小视频本身带透明通道,这部分可以省略)
  • overlay滤镜(核心动画控制):
    • x:控制水平往复运动的关键表达式
      • t*50:50是移动速度(单位:像素/秒),数值越大移动越快,你可以随意调整
      • mod(t*50,2*(W-w)):计算来回一次的总移动距离(W是大视频宽度,w是小视频宽度)
      • 后面的条件判断用来实现“反向”:当小视频移动到最右侧(位置超过W-w),自动计算反向后的位置,实现从右往左移动
    • y=(H-h)/2:让小视频垂直居中显示,你可以改成固定数值(比如y=80)来调整垂直位置
    • shortest=1:让输出视频的长度等于小视频的时长,也就是小视频播完就停止,完全符合你的需求

额外调整技巧

  • 如果想让大视频循环播放直到小视频结束:给背景视频加上循环滤镜,修改背景部分的滤镜为[0:v]loop=loop=-1:size=0,setpts=PTS-STARTPTS[bg],这样大视频会无限循环,直到小视频播放完毕
  • 调整运动的平滑度:如果觉得动画不够流畅,可以适当降低移动速度,或者确保输入视频的帧率一致

注意事项

  • 建议使用较新版本的FFmpeg,旧版本可能对某些表达式的支持不完善
  • 如果运行命令时出现错误,可以先检查输入视频的格式是否正常,或者逐步简化命令排查问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:38:44