如何用FFmpeg实现多张图片连续向左滑动且无黑背景切换?
FFmpeg实现图片连续滑动切换效果(无黑色背景)
当前通过FFmpeg实现单张图片从右侧滑动至居中的效果,所用命令如下:
#slide 1st image from right to center #countdown 10 seconds #slide 1st image from center to left and in the same time #slide 2nd image from right to center #countdown 10 seconds #... ffmpeg -loglevel quiet -loop 1 -i input.png -filter_complex "split=2[bg][slider];[bg]drawbox=c=black:t=fill[bg];[bg][slider]overlay=x='max(W-w*t,0)':y=0" -t 10 -y output.mp4目前切换图片时存在黑色背景,需要实现前一张图片从居中位置滑向左方的同时,后一张图片从右侧滑至居中的连续滑动效果。
实现思路
要消除切换时的黑色背景,核心是让两张图片在过渡阶段叠加显示,通过滤镜分别控制它们的位置动画,再将静态停留片段和过渡片段按时间线拼接。
多图连续滑动示例命令
以两张图片img1.png和img2.png为例,实现以下流程:
- 第一张图从右侧滑入并居中,停留10秒
- 第一张图左滑出、第二张图右滑入的过渡(持续1秒)
- 第二张图居中停留10秒
ffmpeg -loglevel quiet -loop 1 -i img1.png -loop 1 -i img2.png -filter_complex " # 处理第一张图的完整动画:右滑入+停留+左滑出 [0:v]trim=duration=11,setpts=PTS-STARTPTS[img1_full]; [img1_full]split=2[img1_static][img1_slide_out]; [img1_static]trim=0:10[img1_stay]; [img1_slide_out]trim=10:11,setpts=PTS-STARTPTS, overlay=x='(W-w)/2 - (W-w)*t':y=0[img1_left_slide]; # 处理第二张图的完整动画:右滑入+停留 [1:v]trim=duration=11,setpts=PTS-STARTPTS[img2_full]; [img2_full]split=2[img2_slide_in][img2_static]; [img2_slide_in]trim=0:1,setpts=PTS-STARTPTS, overlay=x='W - w*t':y=0[img2_right_slide]; [img2_static]trim=1:11[img2_stay]; # 按顺序拼接所有片段 [img1_stay][img1_left_slide][img2_right_slide][img2_stay]concat=n=4:v=1:a=0[v] " -map "[v]" -y output.mp4
关键参数说明
- trim+setpts:截取不同时间段的片段并重置时间戳,保证动画时间线正常
- overlay位置表达式:
- 第一张图左滑:
x='(W-w)/2 - (W-w)*t',从居中位置开始,1秒内完全滑出屏幕左侧 - 第二张图右滑入:
x='W - w*t',从屏幕右侧外开始,1秒内移动到居中位置
- 第一张图左滑:
- concat滤镜:将静态停留和过渡片段按顺序拼接,实现无间断的连续效果
如果需要添加更多图片循环切换,只需按照相同逻辑扩展对应图片的处理分支,再调整concat的输入片段数量即可。
内容的提问来源于stack exchange,提问作者mikezang
相关产品推荐
相关产品推荐

