FFmpeg滤镜图构建求助:实现指定时段1秒快动作
问题
我正在用FFmpeg复刻一段视频,目标效果参考该视频的19秒处。目前代码已经实现了大部分功能,但没法在[vfr1][vfr2][vfr3]对应的特定时段实现1秒快动作——现在是给全片都加了setpts=0.5*PTS[vboom]。
现有代码如下:
exe = "-i " + file + " -i " + frame + " -i " + framestart + " -i " + frameEnd + " -i " + audioOverlay + " -filter_complex \"[0:v]pad="+mVideoWidth+":"+mVideoHeight+":576:0[vpad]; [vpad][1]overlay[vframed]; [vframed]split=3[vfr1][vfr2][vfr3]; [vfr1]reverse[vrev]; [vfr2][vrev][vfr3]concat=n=3,setpts=0.5*PTS[vboom]; [vboom][2]overlay=enable='lte(t,2)'[vpreout]; [vpreout][3]overlay=enable='gte(t,"+msec+"*3*0.5-2)' \" -map 4:a -b:v 8000k -shortest -preset ultrafast -crf 23 " + file2.getAbsolutePath();
我试过在滤镜链的不同位置添加以下片段,但均未成功:
//[0:v]trim=0:2,setpts=PTS-STARTPTS[v1];[0:v]trim=2:5,setpts=2*(PTS-STARTPTS)[v2];[0:v]trim=5,setpts=PTS-STARTPTS[v3]; //[0:v]trim=0:10,setpts=PTS-STARTPTS[vfr1];[0:v]trim=10:30,setpts=PTS-STARTPTS[vfr2];[0:v]trim=start=30,setpts=PTS-STARTPTS[vfr3]; //[0:v]trim=2:3,setpts=0.75*(PTS-STARTPTS); [0:v]trim=4:5,setpts=0.75*(PTS-STARTPTS); [0:v]trim=7:8,setpts=0.75*(PTS-STARTPTS); //[0:v]select='between(t,1,4)+between(t,4,6)',setpts=0.87*PTS;
解决方案
核心问题是你当前把setpts=0.5*PTS加在了concat之后,会作用于整个拼接完成的视频,而非[vfr1][vfr2][vfr3]对应的特定时段。要实现目标效果,需要先给每个拆分出来的流单独处理变速,再进行拼接。
具体修改方式
- 全片段快动作:如果要让
[vfr1][vfr2][vfr3]对应的三段都实现快动作,修改滤镜链中的变速与拼接部分:
[vfr1]reverse,setpts=0.5*PTS[vrev]; [vfr2]setpts=0.5*PTS[vfr2_fast]; [vfr3]setpts=0.5*PTS[vfr3_fast]; [vfr2_fast][vrev][vfr3_fast]concat=n=3[vboom];
- 单片段快动作:如果仅需要其中某一段(比如只有
[vfr2]对应时段)实现快动作,只给对应流添加setpts即可:
[vfr1]reverse[vrev]; [vfr2]setpts=0.5*PTS[vfr2_fast]; [vfr2_fast][vrev][vfr3]concat=n=3[vboom];
注意事项
setpts的系数越小,播放速度越快:0.5对应2倍速,刚好能把2秒的原片段压缩成1秒,符合你的需求。- 拼接前必须给每个流单独修正时间戳,
concat滤镜要求输入流的时间戳连续,否则会出现时序混乱。 - 如果需要配合
trim截取片段,要遵循先截取、再变速、最后拼接/反转的顺序,避免时间戳计算错误。
内容的提问来源于stack exchange,提问作者D-MAN
相关产品推荐
相关产品推荐

