РЕДАКЦІЯ: Раптово, з тими ж скриптами на одному апаратному забезпеченні, проблема зникла. Я все ще цікавлюся причиною, але поки я не зможу повторно відтворити його, є кілька варіантів діагностики. Мої вибачення.
Я використовую 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 -
(Зараз я використовую лише три відео, оскільки у мене є чотири ядра процесора.)