ffmpeg concat导致DTS乱序错误

And*_*ndy 8 video ffmpeg webm

我正在关注如何使用ffmpeg 连接文件的文档,但在此过程中我看到很多警告,输出视频在第一个块之后停止,但音频继续播放.

这是我用来连接文件的命令:

ffmpeg -f concat -i mylist.txt -c copy output.webm
Run Code Online (Sandbox Code Playgroud)

这是我看到的警告:

[concat @ 0x7fee11822a00] DTS 0 < 2500 out of order
[webm @ 0x7fee11011000] Non-monotonous DTS in output stream 0:0; previous: 2500, current: 0; changing to 2500. This may result in incorrect timestamps in the output file.
Run Code Online (Sandbox Code Playgroud)

视频文件来自外部源.我目前的解决方案是将每个文件重新编码为mp4,然后将它们连接在一起,然后将整个文件重新编码回webm.原因,这需要一些重要的时间,但我找不到另一种解决方案.

sr9*_*yar 21

FFMPEG concatenate 的所有视频都应该有匹配的编码、fps 等,否则你会得到意想不到的结果。我想,如果您的视频来自不同的来源,那么不重新编码就很难过。我不得不查看很多解决方案,有效的解决方案会建议将您的视频转换为相同的中间格式,然后运行您的 concat 命令。

尽管这种方法确实有效,但它并不能解释哪里出了问题。Gyan 的评论回答了这个问题

首先,使用 ffprobe 测试您的输入文件: ffprobe video1.mp4

你会得到这样的输出。

视频1.mp4:

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 1556 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc (default)
Run Code Online (Sandbox Code Playgroud)

视频2.mp4:

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 6454 kb/s, 24 fps, 24 tbr, 90k tbn, 48 tbc (default)
Run Code Online (Sandbox Code Playgroud)

尽管我的 FPS 和其他参数是相同的,但我得到了 58 秒的 3.1 fps 视频,而不是预期的 8 秒 @24fps 视频。这里的重要参数是时基tbn,即12288 tbnvs 90k tbn。Concatenate 不会重新编码输入视频,仅使用第一个输入视频的时基来弄乱所有后续视频。

更改第一个文件的时基:

ffmpeg -i video1.mp4 -video_track_timescale 90000 video1_fixed.mp4
Run Code Online (Sandbox Code Playgroud)

现在 concatenate 产生正确的结果:

( echo file 'video2.mp4' & echo file 'video1_fixed.mp4' ) | ffmpeg -y -protocol_whitelist file,pipe -f concat -safe 0 -i pipe: -c copy output.mp4
Run Code Online (Sandbox Code Playgroud)

  • 这是我在 SE 上看到的第一个答案,它实际上很好地解释了发生的情况,足以让我诊断我的问题 - 结果在我的情况下是不同的音频采样率,但原理相同。 (5认同)
  • 如果“tbc”不匹配怎么办? (3认同)
  • 你太棒了!太感谢了! (2认同)

aer*_*tal 6

您的问题是由-c copycopy参数引起的.正如参数的名称所暗示的那样,它将复制源编码.由于每个文件都有不同的时间戳,可能从零开始,因此会收到很多警告.concat demuxer在输入文件中也需要相同的编解码器,因此请确保它们不是混合的.

解决方案是通过指定要用于输出的编解码器来重新编码,例如.-c:v libvpx-vp9 -c:a libopus.

  • 我仍然有同样的问题。在编码过程中,我看到警告,并且最终文件在第一个块之后停止。这是我正在使用的命令:`ffmpeg -f concat -i mylist.txt -c:v libvpx-vp9 -c:a libopus output.webm` (2认同)