FFMPEG em mosaico gaguejando

0

EDIT: De repente, com os mesmos scripts no mesmo hardware, o problema se foi. Eu ainda estou curioso sobre a causa, mas até que eu possa reproduzi-lo novamente, há poucas opções para diagnósticos. Minhas desculpas.

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.)

    
por Draconis 05.11.2016 / 17:34

0 respostas