FFMPEG 连接的所有视频都应具有匹配的编码、fps 等,否则您将得到意外的结果。
我想,如果您的视频来自不同的来源,那么如果不重新编码就很难通过。我必须查看很多解决方案,有效的解决方案会建议将您的视频转换为相同的中间格式,然后运行您的 concat 命令。
尽管这种方法确实有效,但它并不能解释出了什么问题。Gyan 的评论回答了这个问题 https://stackoverflow.com/questions/31691943/ffmpeg-concat-poduces-dts-out-of-order-errors#comment57572244_34918815.
首先,使用 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)
视频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)
尽管我的 FPS 和其他参数相同,但我得到了 3.1 fps 的 58 秒视频,而不是预期的 8 秒 @24fps 视频。这里重要的参数是时基tbn,即12288 tbn
vs 90k tbn
。
连接不会重新编码输入视频,仅使用第一个输入视频的时基,从而弄乱所有后续视频。
更改第一个文件的时基:
ffmpeg -i video1.mp4 -video_track_timescale 90000 video1_fixed.mp4
现在连接产生正确的结果:
( 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