Estou usando o FFMPEG para obter feeds ao vivo de várias webcams. Quando os feeds são independentes (em outras palavras, cada entrada de v4l2
executando seu próprio pipeline dentro do filter_complex
para sua própria saída xv
), tudo funciona muito bem: há cerca de meio segundo de atraso, o que eu posso viver com e todos os vídeos funcionam sem problemas.
Eu preferiria ter esses vídeos juntos, tanto para assistir ao vivo quanto para a cópia que ele salva no disco. Mas quando eu tento isso, com uma série de overlay
s ou com hstack
+ vstack
, o vídeo começa a gaguejar: um feed será executado suavemente por alguns segundos enquanto os outros estão parados, depois outro será executado por alguns segundos enquanto o primeiro congela, e assim por diante. O vídeo ainda está chegando em tempo quase real, por isso não é terrível para fins de segurança, mas dificulta muito o movimento a seguir.
Existe alguma coisa que eu possa fazer para consertar isso, ou pelo menos reduzir a gagueira? Eu ficaria bem com uma taxa de quadros menor, contanto que fosse consistente.
Script que funciona:
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 -
Script que não:
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 -
(Estou usando apenas três vídeos agora, já que tenho quatro núcleos de CPU.)
Tags video ffmpeg webcam compositing latency