РЕДАКТИРОВАТЬ: Внезапно, с теми же сценариями на том же оборудовании, проблема исчезла. Мне по-прежнему любопытно узнать причину, но пока я не смогу воспроизвести ее снова, есть несколько вариантов диагностики. Мои извенения.
Я использую 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 -
(Я сейчас использую только три видео, так как у меня четыре ядра процессора.)