FFMPEG 马赛克卡顿

FFMPEG 马赛克卡顿

编辑:突然间,在相同的硬件上使用相同的脚本,问题就消失了。我仍然对原因感到好奇,但在我可以再次重现之前,几乎没有诊断选项。抱歉。

我使用 FFMPEG 获取来自多个网络摄像头的实时视频。当视频源独立时(换句话说,每个v4l2输入都通过其内部的管道传输filter_complex到其自己的xv输出),一切都运行良好:大约有半秒的延迟,我可以忍受,所有视频都运行顺畅。

我希望将这些视频拼接在一起,既可以观看实时视频,也可以将其保存到磁盘中。但是当我尝试这样做时,无论是使用一系列overlays 还是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 核心,因此我现在只使用三个视频。)

相关内容