制作一个包含两个视频流的 MP4 文件,每个视频流来自不同的网络摄像头,如下所示:
ffmpeg -f v4l2 -thread_queue_size 32 -video_size 1920x1080 -input_format mjpeg -i /dev/video6 \
-f v4l2 -thread_queue_size 32 -video_size 1920x1080 -input_format mjpeg -i /dev/video0 \
-map 0:v -map 1:v -c:v libx264 -preset superfast test.mp4
在生成的文件中,来自名为 first 的摄像头的流将始终比来自名为 second 的摄像头的流晚约 0.5 秒。因此,在上面的示例中,来自 的流/dev/video6
将晚于 的流/dev/video0
。如果我在命令中交换两个设备,来自 的流/dev/video0
将晚于 。因此,命令行上的位置很重要。
可以通过增加第二个输入来粗略地补偿差异-itsoffset 0.5
。但 0.5 秒只是猜测,甚至可能取决于实际硬件。
有没有办法自动同步这两个流?
更新 1(和部分解决方案): -copyts
导致同步,但现在视频播放器控件不起作用(无法在视频中来回移动)。使用 后-copyts -start_at_zero
,控件恢复,但同步消失了。因此是可能(使用-copyts
),但我需要让播放控件再次工作。我实际上找到了一种方法来做到这一点:使用录制-copyts
。然后再次运行整个过程ffmpeg
,仅使用-start_at_zero
:
ffmpeg -i test.mp4 -start_at_zero -map 0:v -c:v copy test2.mp4
不幸的是,下一个问题是添加声音。我的音频设备报告的开始时间戳完全偏离,与摄像头报告的不匹配。我为此提出了一个单独的问题:FFmpeg:音频开始时间偏离
更新 2:似乎与同时同步捕获多个 RTSP 流。ffserver
那里建议使用一个解决方案,但没有提供任何细节,而且ffserver
不再维护。
更新 3(完整解决方案):请参见FFmpeg:音频开始时间偏离获得完整的解决方案,其中还解释了如何添加音频。