如何在FFmpeg的filter_complex处理流程中直接裁剪输出视频的37:23-37:33片段(无需额外独立命令)
如何在FFmpeg的filter_complex处理流程中直接裁剪输出视频的37:23-37:33片段(无需额外独立命令)
没问题!完全可以在你现有的filter_complex流程里直接完成这个裁剪操作,不用额外跑单独的命令。核心思路是把处理好的最终视频和音频拆成「0到37:23」、「37:33到结束」两段,然后把这两段拼接起来。
首先把时间转换成秒数会更精准:37:23 = 37×60+23 = 2243秒,37:33 = 37×60+33 = 2253秒。接下来直接修改你原有的filter_complex,在末尾添加分段拼接的逻辑即可,完整命令如下:
ffmpeg \ -i first_vid.mkv \ -i second_vid.mp4 \ -i third_vid.mkv \ -i fourth_vid.mkv \ -filter_complex \ "nullsrc=size=1280x720 [base]; \ [0:v] \ trim=start=40,\ setpts=PTS-STARTPTS,\ scale=640x360,\ drawtext=fontfile=/Users/vr/Downloads/gameplay_vids/generated/control-freak-font/CONTF___.ttf\ :text='one'\ :fontsize=32\ :fontcolor=0xFFFFFF\ :alpha='if(lt(t,30),0,if(lt(t,35),(t-30)/5,if(lt(t,65),1,if(lt(t,70),(5-(t-65))/5,0))))'\ :x=w-text_w-12\ :y=h-text_h-12 [upperleft];\ [1:v] \ trim=start=35.05, \ setpts=PTS-STARTPTS, \ scale=640x360, \ drawtext=fontfile=/Users/vr/Downloads/gameplay_vids/generated/control-freak-font/CONTF___.ttf \ :text='two' \ :fontsize=32 \ :fontcolor=0xFFFFFF \ :alpha='if(lt(t,30),0,if(lt(t,35),(t-30)/5,if(lt(t,65),1,if(lt(t,70),(5-(t-65))/5,0))))' \ :x=w-text_w-12 \ :y=h-text_h-12 [upperright]; \ [2:v] \ trim=start=36.467, \ setpts=PTS-STARTPTS, \ scale=640x360, \ drawtext=fontfile=/Users/vr/Downloads/gameplay_vids/generated/control-freak-font/CONTF___.ttf \ :text='three' \ :fontsize=32 \ :fontcolor=0xFFFFFF \ :alpha='if(lt(t,30),0,if(lt(t,35),(t-30)/5,if(lt(t,65),1,if(lt(t,70),(5-(t-65))/5,0))))' \ :x=w-text_w-12 \ :y=h-text_h-12 [lowerleft]; \ [3:v] \ trim=start=35.097, \ setpts=PTS-STARTPTS, \ scale=640x360, \ drawtext=fontfile=/Users/vr/Downloads/gameplay_vids/generated/control-freak-font/CONTF___.ttf \ :text='four' \ :fontsize=32 \ :fontcolor=0xFFFFFF \ :alpha='if(lt(t,30),0,if(lt(t,35),(t-30)/5,if(lt(t,65),1,if(lt(t,70),(5-(t-65))/5,0))))' \ :x=w-text_w-12 \ :y=h-text_h-12 [lowerright]; \ [2:a] \ atrim=start=36.467, \ asetpts=PTS-STARTPTS[outa]; \ [base][upperleft] overlay=shortest=1 [tmp1]; \ [tmp1][upperright] overlay=shortest=1:x=640 \ [tmp2];[tmp2][lowerleft] overlay=shortest=1:y=360 \ [tmp3];[tmp3][lowerright] overlay=shortest=1:x=640:y=360[v]; \ # 新增:裁剪并拼接视频流 [v] trim=end=2243,setpts=PTS-STARTPTS [v1]; [v] trim=start=2253,setpts=PTS-STARTPTS [v2]; [v1][v2] concat=n=2:v=1:a=0 [final_v]; # 新增:裁剪并拼接音频流 [outa] atrim=end=2243,asetpts=PTS-STARTPTS [a1]; [outa] atrim=start=2253,asetpts=PTS-STARTPTS [a2]; [a1][a2] concat=n=2:v=0:a=1 [final_a]; " -map "[final_v]" -map "[final_a]" -c:v libx264 -shortest "output.mp4"
我给你拆解下新增部分的作用:
- 视频处理:先把合成好的[v]流拆成两段,
trim=end=2243截取到37:23的部分,trim=start=2253截取37:33之后的部分,setpts=PTS-STARTPTS用来重置每一段的时间戳,避免拼接后出现播放跳帧或不同步的问题;最后用concat把两段视频拼起来得到[final_v]。 - 音频处理:和视频逻辑完全一致,用
atrim截取音频的前后两段,asetpts重置时间戳,再用concat拼接得到[final_a]。 - 最后输出时直接映射拼接好的
[final_v]和[final_a]即可。
另外我把原命令末尾的-ss 00:00 -to 9999去掉了,因为-shortest已经会自动取最短流的时长,而且我们的拼接逻辑已经覆盖了时长控制。
备注:内容来源于stack exchange,提问作者PirateApp
相关产品推荐
相关产品推荐

