使用 ffmpeg 和 python 顺利无损连接重叠视频(mp4)?

使用 ffmpeg 和 python 顺利无损连接重叠视频(mp4)?

我有一个视频列表,其中有些视频有重叠,我想将它们连续无损地连接起来。我所说的连续是指将视频拼接在一起,省略重叠部分。例如,假设我们有以下列表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.mp40~15s of video1.mp4+ 0~15s of video2.mp4

到目前为止我已经尝试过:

  1. 我发现这个问答它确实完成了工作,只是它重新编码(因此有损)。在我看来,代码会搜索第一个相同的帧,然后标记第一个相同帧的inpoint时间concat

  2. 然后我发现了一个可以无损连接两个视频的命令:ffmpeg -f concat -safe 0 -i vidlist.txt -c copy output.mp4所以我尝试inpoint在 #1 中使用它来分割第二个视频(或第一个视频),然后使用此代码进行连接。它无损地完成了工作,但拼接部分的视频和音频不自然、不同步。

  3. 我添加了-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

相关内容