FFmpeg中trim与concat组合使用异常:仅生成第一段剪辑内容的问题求助
FFmpeg中trim与concat组合使用异常:仅生成第一段剪辑内容的问题求助
大家好,我目前在Windows 11上使用media-autobuild_suite,安装才一周,明天打算更新它。
我现在有个需求:处理一个私人视频文件,要剪出两段内容合并成一个新视频;同时重新编码视频流(参数为-c:v libx265 -crf xx -preset veryslow)和音频流(参数为-c:a libfdk_aac -b:a xxxk);另外还要清除输出视频的所有元数据,用到的参数是-map_metadata -1 -metadata title="" -map_chapters -1 -fflags +bitexact -flags:v +bitexact -flags:a +bitexact。我希望用一次FFmpeg命令完成所有操作,所以决定用trim和concat滤镜来实现。
为了复现问题,我用了一个公开测试视频做实验,参考相关方案做了五个测试案例,但结果都一样(除了元数据部分):输出视频只有第一段剪辑(0到16.820秒),时长只有16.820秒,第二段完全没被处理进去。如果需要的话,我可以提供每个案例的命令行输出日志。
我的测试案例
Case 1(两个源文件,包含元数据编辑,完整时间戳格式,比如00.000:16.820)
ffmpeg -i source/BigBuckBunny.mp4 -i source/BigBuckBunny.mp4 -map_metadata -1 -metadata title="" -map_chapters -1 -fflags +bitexact -flags:v +bitexact -flags:a +bitexact -filter_complex "[0:v]trim=00.000:16.820,setpts=PTS-STARTPTS[v0]; [0:a]atrim=00.000:16.820,asetpts=PTS-STARTPTS[a0]; [1:v]trim=153.000:348.840,setpts=PTS-STARTPTS[v1]; [1:a]atrim=153.000:348.840,asetpts=PTS-STARTPTS[a1]; [v0][a0][v1][a1]concat=n=2:v=1:a=1[v][a]" -map "[v]" -c:v libx265 -crf 22 -preset veryslow -map "[a]" -c:a libfdk_aac -b:a 128k result/"BigBuckBunny".mkv
Case 2(单个源文件,包含元数据编辑,短时间戳格式,比如0:16.820)
ffmpeg -i source/BigBuckBunny.mp4 -map_metadata -1 -metadata title="" -map_chapters -1 -fflags +bitexact -flags:v +bitexact -flags:a +bitexact -filter_complex "[0:v]trim=0:16.820,setpts=PTS-STARTPTS[v0]; [0:a]atrim=0:16.820,asetpts=PTS-STARTPTS[a0]; [0:v]trim=153:348.840,setpts=PTS-STARTPTS[v1]; [0:a]atrim=153:348.840,asetpts=PTS-STARTPTS[a1]; [v0][a0][v1][a1]concat=n=2:v=1:a=1[v][a]" -map "[v]" -c:v libx265 -crf 22 -preset veryslow -map "[a]" -c:a libfdk_aac -b:a 128k result/"BigBuckBunny".mkv
Case 3(两个源文件,包含元数据编辑,短时间戳格式,同Case 2)
ffmpeg -i source/BigBuckBunny.mp4 -i source/BigBuckBunny.mp4 -map_metadata -1 -metadata title="" -map_chapters -1 -fflags +bitexact -flags:v +bitexact -flags:a +bitexact -filter_complex "[0:v]trim=0:16.820,setpts=PTS-STARTPTS[v0]; [0:a]atrim=0:16.820,asetpts=PTS-STARTPTS[a0]; [1:v]trim=153:348.840,setpts=PTS-STARTPTS[v1]; [1:a]atrim=153:348.840,asetpts=PTS-STARTPTS[a1]; [v0][a0][v1][a1]concat=n=2:v=1:a=1[v][a]" -map "[v]" -c:v libx265 -crf 22 -preset veryslow -map "[a]" -c:a libfdk_aac -b:a 128k result/"BigBuckBunny".mkv
Case 4(两个源文件,无元数据编辑,短时间戳格式,同Case 2)
ffmpeg -i source/BigBuckBunny.mp4 -i source/BigBuckBunny.mp4 -filter_complex "[0:v]trim=0:16.820,setpts=PTS-STARTPTS[v0]; [0:a]atrim=0:16.820,asetpts=PTS-STARTPTS[a0]; [1:v]trim=153:348.840,setpts=PTS-STARTPTS[v1]; [1:a]atrim=153:348.840,asetpts=PTS-STARTPTS[a1]; [v0][a0][v1][a1]concat=n=2:v=1:a=1[v][a]" -map "[v]" -c:v libx265 -crf 22 -preset veryslow -map "[a]" -c:a libfdk_aac -b:a 128k result/"BigBuckBunny".mkv
Case 5(单个源文件,无元数据编辑,短时间戳格式,同Case 2)
ffmpeg -i source/BigBuckBunny.mp4 -filter_complex "[0:v]trim=0:16.820,setpts=PTS-STARTPTS[v0]; [0:a]atrim=0:16.820,asetpts=PTS-STARTPTS[a0]; [1:v]trim=153:348.840,setpts=PTS-STARTPTS[v1]; [1:a]atrim=153:348.840,asetpts=PTS-STARTPTS[a1]; [v0][a0][v1][a1]concat=n=2:v=1:a=1[v][a]" -map "[v]" -c:v libx265 -crf 22 -preset veryslow -map "[a]" -c:a libfdk_aac -b:a 128k result/"BigBuckBunny".mkv
所有案例的结果都一致(元数据相关的差异除外):输出视频的时长只有16.820秒,也就是只有第一段剪辑(0到16.820秒)被处理了,第二段完全没出现在最终视频里。
想请教各位,我哪里做错了?提前感谢大家的帮助!
备注:内容来源于stack exchange,提问作者Su-47
相关产品推荐
相关产品推荐

