如何使用FFmpeg按固定间隔在主视频中添加绿幕视频叠加层
如何使用FFmpeg按固定间隔在主视频中添加绿幕视频叠加层
我来帮你搞定这个需求!你已经有了绿幕抠图叠加的基础命令,现在只需要给叠加的时机加上时间控制就可以了,分两种情况给你详细说:
一、让绿幕视频在指定时间单次出现
比如你想让绿幕视频在第5分钟(也就是300秒)开始显示,假设你的green.mp4时长是5秒,那可以在原命令的基础上,给绿幕视频加上时间轴调整的滤镜,具体命令如下:
ffmpeg -i input.mp4 -i green.mp4 -filter_complex \ '[1:v]colorkey=0x00ff00:0.4:0.2,trim=start=0:end=5,setpts=PTS-STARTPTS+300/TB[ckout]; \ [0:v][ckout]overlay[out]' \ -map '[out]' -c:v libx264 -pix_fmt yuv420p res.mp4
关键参数解释:
trim=start=0:end=5:截取绿幕视频的前5秒(如果你的绿幕视频本身就是目标显示时长,这个可以省略,但加上能避免意外)setpts=PTS-STARTPTS+300/TB:把这段截取的绿幕视频的时间轴偏移到300秒的位置,这样它就会精准在主视频的第5分钟开始显示
二、让绿幕视频按固定间隔重复出现
比如你想每隔5分钟(300秒)显示一次,每次显示5秒,持续到主视频结束,这里有两种实现方式:
方式1:手动指定所有显示时间区间
适合你想自定义特定时间点的场景,命令如下:
ffmpeg -i input.mp4 -i green.mp4 -filter_complex \ '[1:v]colorkey=0x00ff00:0.4:0.2,trim=start=0:end=5,loop=loop=-1:size=1:start=0,setpts=N/(FRAME_RATE*TB)[loop_ck]; \ [0:v][loop_ck]overlay=enable='gte(t\,300)*lte(t\,305)+gte(t\,600)*lte(t\,605)+gte(t\,900)*lte(t\,905)'[out]' \ -map '[out]' -c:v libx264 -pix_fmt yuv420p res.mp4
关键参数解释:
loop=loop=-1:size=1:start=0:把截取后的5秒绿幕视频设置为无限循环,确保每个时间点都能调用到enable选项的表达式:gte(t\,300)*lte(t\,305)表示当主视频时间t大于等于300秒且小于等于305秒时显示绿幕,后面的+gte(t\,600)*lte(t\,605)对应第10分钟的显示区间,你可以根据需求继续添加更多时间段
方式2:自动计算间隔(更省心)
如果是严格的固定间隔,比如每隔300秒就显示5秒,不用手动写每个时间段,用数学表达式自动计算即可:
ffmpeg -i input.mp4 -i green.mp4 -filter_complex \ '[1:v]colorkey=0x00ff00:0.4:0.2,trim=start=0:end=5,loop=loop=-1:size=1:start=0,setpts=N/(FRAME_RATE*TB)[loop_ck]; \ [0:v][loop_ck]overlay=enable='mod(t,300)<5'[out]' \ -map '[out]' -c:v libx264 -pix_fmt yuv420p res.mp4
关键参数解释:
mod(t,300)<5:这个表达式的意思是,当主视频时间t除以300的余数小于5秒时,就显示绿幕视频,自动实现每隔5分钟显示一次、每次5秒的效果,非常省心!
注意:如果你的绿幕视频实际时长不是5秒,记得把命令里的end=5和mod(t,300)<5中的数字改成你的绿幕视频实际时长哦~
备注:内容来源于stack exchange,提问作者DigitalNomad
相关产品推荐
相关产品推荐

