我正在关注如何使用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)
您的问题是由-c copycopy参数引起的.正如参数的名称所暗示的那样,它将复制源编码.由于每个文件都有不同的时间戳,可能从零开始,因此会收到很多警告.concat demuxer在输入文件中也需要相同的编解码器,因此请确保它们不是混合的.
解决方案是通过指定要用于输出的编解码器来重新编码,例如.-c:v libvpx-vp9 -c:a libopus.
| 归档时间: |
|
| 查看次数: |
9731 次 |
| 最近记录: |