我有一个视频列表,其中有些视频有重叠,我想将它们连续无损地连接起来。我所说的连续是指将视频拼接在一起,省略重叠部分。例如,假设我们有以下列表vidlist.txt
:
video1.mp4 (25 seconds long)
video2.mp4 (15 seconds long)
并且 的最后 10 秒video1.mp4
与 的前 10 秒相同(重叠)video2.mp4
。因此,连接的视频output.mp4
应该只有 30 秒长,没有重复/重复/重叠部分:0~25s of video1.mp4
+10~15s of video2.mp4
或0~15s of video1.mp4
+ 0~15s of video2.mp4
。
到目前为止我已经尝试过:
我发现这个问答它确实完成了工作,只是它重新编码(因此有损)。在我看来,代码会搜索第一个相同的帧,然后标记第一个相同帧的
inpoint
时间concat
。然后我发现了一个可以无损连接两个视频的命令:
ffmpeg -f concat -safe 0 -i vidlist.txt -c copy output.mp4
所以我尝试inpoint
在 #1 中使用它来分割第二个视频(或第一个视频),然后使用此代码进行连接。它无损地完成了工作,但拼接部分的视频和音频不自然、不同步。我添加了
-segment_time_metadata 1
选项ffmpeg -f concat -segment_time_metadata 1 -safe 0 -i vidlist.txt -c copy output.mp4
,这样似乎解决了视频不同步的问题,但音频仍然不自然。
PS:我只对无损视频感兴趣。音频可以有损/重新采样。
答案1
我将视频编解码器设置为简单-c:v copy
,将音频过滤器设置为-af aselect=concatdec_select,aresample=async=1
。充分表达,
ffmpeg -fflags +genpts+igndts -f concat -safe 0 -segment_time_metadata 1 -i vidlist.txt -c:v copy -af aselect=concatdec_select,aresample=async=1 output.mp4