如何正确使用FFmpeg的trim和concat?

如何正确使用FFmpeg的trim和concat?

我正在使用媒体自动构建套件(在 Windows 11 上)。我的安装已经一周了。明天我会再次更新它。

我有一个私人视频文件。我希望将其剪切出两个部分,然后将这两个部分合并为一个结果视频文件。我还希望使用 重新编码视频流-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,所以我决定使用trimconcat,见这里

为了演示我到目前为止所做的工作,我使用了一个公共测试视频这里

对于我的情况,我改编了解决方案这里。我做了多个测试用例:

情况 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

情况 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

案例 3(两个源文件,包括元数据编辑和短时间戳,参见案例 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

案例 4(两个源文件,没有元数据编辑和短时间戳,参见案例 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

情况 5(只有一个源文件,没有元数据编辑和短时间戳,参见情况 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 秒的第一部分。如果需要的话,我可以为每种情况提供来自命令行的输出。

我究竟做错了什么?

提前感谢您的帮助和努力!

相关内容