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