编辑:突然间,在相同的硬件上使用相同的脚本,问题就消失了。我仍然对原因感到好奇,但在我可以再次重现之前,几乎没有诊断选项。抱歉。
我使用 FFMPEG 获取来自多个网络摄像头的实时视频。当视频源独立时(换句话说,每个v4l2
输入都通过其内部的管道传输filter_complex
到其自己的xv
输出),一切都运行良好:大约有半秒的延迟,我可以忍受,所有视频都运行顺畅。
我希望将这些视频拼接在一起,既可以观看实时视频,也可以将其保存到磁盘中。但是当我尝试这样做时,无论是使用一系列overlay
s 还是hstack
+ vstack
,视频都会开始卡顿:一个视频源会流畅播放几秒钟,而其他视频源则静止不动,然后另一个视频源会播放几秒钟,而第一个视频源会冻结,依此类推。视频仍然以准实时方式播放,因此对于安全目的来说这并不可怕,但它会使跟踪运动变得非常困难。
我能做些什么来解决这个问题,或者至少减少卡顿?只要帧速率一致,较低的帧速率也没问题。
有效的脚本:
ffmpeg \
-f lavfi -thread_queue_size 1024 -i color=s=${size}:c=000000 \
-f v4l2 -thread_queue_size 1024 -video_size $size -i $video_ne \
-f v4l2 -thread_queue_size 1024 -video_size $size -i $video_sw \
-f v4l2 -thread_queue_size 1024 -video_size $size -i $video_se \
-f alsa -thread_queue_size 1024 -i $audio1 \
-f alsa -thread_queue_size 1024 -i $audio2 \
-filter_complex "
[0:v] fifo, setpts=PTS-STARTPTS [v0];
[1:v] fifo, setpts=PTS-STARTPTS [v1];
[2:v] fifo, setpts=PTS-STARTPTS [v2];
[3:v] fifo, setpts=PTS-STARTPTS [v3]" \
-map "[v0]" -f xv - \
-map "[v1]" -f xv - \
-map "[v2]" -f xv - \
-map "[v3]" -f xv -
不存在的脚本:
ffmpeg \
-f lavfi -thread_queue_size 1024 -i color=s=${size}:c=000000 \
-f v4l2 -thread_queue_size 1024 -video_size $size -i $video_ne \
-f v4l2 -thread_queue_size 1024 -video_size $size -i $video_sw \
-f v4l2 -thread_queue_size 1024 -video_size $size -i $video_se \
-f alsa -thread_queue_size 1024 -i $audio1 \
-f alsa -thread_queue_size 1024 -i $audio2 \
-filter_complex "
[0:v] fifo, setpts=PTS-STARTPTS [v0];
[1:v] fifo, setpts=PTS-STARTPTS [v1];
[2:v] fifo, setpts=PTS-STARTPTS [v2];
[3:v] fifo, setpts=PTS-STARTPTS [v3];
[v0][v1] hstack [tmp1];
[v2][v3] hstack [tmp2];
[tmp1][tmp2] vstack [vout]"
-map "[vout]" -f sdl2 -
(由于我有四个 CPU 核心,因此我现在只使用三个视频。)