ffmpeg filter_complex concat 永远不会完成

sea*_*olf 8 ffmpeg

我正在尝试将mp4文件连接成一个文件。concat由于与此问题无关的原因,我试图直接使用过滤器(因此-i list.txt不是有效的解决方案)。所有有问题的视频文件的长度都在 4 到 20 分钟之间。

我正在执行的操作:

% ffmpeg -i f01.mp4 -i f02.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" output.mp4
Run Code Online (Sandbox Code Playgroud)

这是我从FFmpeg Filters Documentation: concat and Concatenate Videos Together Using FFMPEG等参考资料中对这个命令形式的理解.

发生什么了:

ffmpeg提供大量输出,因为它检查每个流的元数据,然后开始处理。在短暂的持续时间(几秒到一分钟左右,似乎与第一个视频的持续时间成正比)后,我开始看到这样的消息:

More than 1000 frames duplicated
More than 10000 frames duplicated     512kB time=00:00:00.12 bitrate=32771.0kbits/s dup=33365 drop=0 speed=0.00449x
More than 100000 frames duplicated   1280kB time=00:00:00.17 bitrate=61442.1kbits/s dup=66730 drop=0 speed=0.00272x
Run Code Online (Sandbox Code Playgroud)

...然后这个过程永远不会完成。如果我让我的计算机运行 24 小时,ffmpeg仍在使用最大可用 CPU (200-300%)。输出文件的长度为 48 个字节。

注意:每个输入只有几分钟,因此单独重新编码每个输入只需要几分钟。

注意:如果我将命令更改f01.mp4为用于源 0 和源 1,该命令将在 5 分钟内按预期完成:

More than 1000 frames duplicated
More than 10000 frames duplicated     512kB time=00:00:00.12 bitrate=32771.0kbits/s dup=33365 drop=0 speed=0.00449x
More than 100000 frames duplicated   1280kB time=00:00:00.17 bitrate=61442.1kbits/s dup=66730 drop=0 speed=0.00272x
Run Code Online (Sandbox Code Playgroud)

完整输出:

这是运行的完整输出,以防万一:

% # example that works:
% # note, however, that this just repeats the same source twice
% ffmpeg -i f01.mp4 -i f01.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" output.mp4
Run Code Online (Sandbox Code Playgroud)

Gya*_*yan 15

正如日志中的警告所说,Frame rate very high for a muxer not efficiently supporting it.发生这种情况是因为 concat 取消了流帧速率,当tbr所有视频流的 不匹配时就会发生这种情况。ffmpeg 然后将使用 time_base 作为有效帧速率,然后复制帧以匹配该帧速率。在这种情况下,它是 90000,因此这有效地增加了资源使用并减慢了进程。

添加-vsync 2以避免帧重复。

ffmpeg -i f01.mp4 -i f02.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" -vsync 2 -map "[v]" -map "[a]" output.mp4

  • MP4 默认为恒定帧速率模式,可能需要复制。“vsync 2”不会影响视频质量。 (4认同)
  • “-vsync 2”是否会以某种方式降低输出质量?我的意思是,如果没有它就可以工作,为什么 ffmpeg 仍然尝试进行此帧复制? (2认同)