我有两个视频需要剪辑,然后合并剪辑后的输出。它们的大小/编解码器都相同,因此我希望这样做,而不需要重新编码太多。但如果我这样做:
ffmpeg -i clip1.mp4 -ss 1.2 -t 2.0 -c copy clip1.trimmed.mp4
ffmpeg -i clip2.mp4 -ss 0.2 -t 2.0 -c copy clip2.trimmed.mp4
ffmpeg -filter_complex '[0:0] [0:1] [1:0] [1:1] concat=n=2:v=1:a=1 [v] [a]'\
-map [v] -map [a] -c:v libx264 merge.mp4
合并后的视频存在音频/视频同步问题。如果我在修剪命令中替换 ,则不会发生这种情况-c copy
。-vcodec libx264
如果不重新编码,时间是否会出现问题?
正确答案来自 Mulvya:
ffmpeg -ss 1.2 -t 2.0 -i clip1.mp4 -ss 0.2 -t 2.0 -i clip2.mp4 \
-filter_complex '[0:v] [0:a] [1:v] [1:a] concat=n=2:v=1:a=1 [v] [a]" \
-map [v] -map [a] -c:v libx264 merge.mp4
如果有帮助的话,我想补充一下,添加剪辑特定过滤器的语法如下:
ffmpeg -ss 1.2 -t 2.0 -i clip1.mp4 -ss 0.2 -t 2.0 -i clip2.mp4 \
-filter_complex '[0:v]scale=1920:960[v0]; [v0] [0:a] [1:v] [1:a] concat=n=2:v=1:a=1 [v] [a]" \
-map [v] -map [a] -c:v libx264 merge.mp4
答案1
由于您最终要重新编码合并的段,因此只需用一个命令即可完成,
ffmpeg -ss 1.2 -t 2.0 -i clip1.mp4 -ss 0.2 -t 2.0 -i clip2.mp4 \
-filter_complex '[0:v] [0:a] [1:v] [1:a] concat=n=2:v=1:a=1 [v] [a]" \
-map [v] -map [a] -c:v libx264 merge.mp4
答案2
无需重新编码即可合并视频是可能的,并在以下问题的答案中进行了描述:另一个问题。
分割视频而不重新编码可能仅适用于无损格式。有损编解码器(如 h264)通常使用一系列关键帧,然后将中间帧编码为当前帧和前一帧之间的差异。(这就是为什么在损坏的视频中会出现奇怪的漂移,为什么在场景变化时会消失。)
理论上,如果剪切点刚好在关键帧之前,你也许可以分割视频。但我不知道这些关键帧在哪里以及如何在那里进行剪切。