Como posso impedir que o ffmpeg pare quando atinge o final de um pipe nomeado?

0

Estou usando um programa que grava continuamente dados de vídeo MPEG-TS em um arquivo enquanto ele está em execução. Estou esperando que ele seja executado continuamente por muitos dias.

Eu quero usar o ffmpeg para transcodificar esses dados de vídeo ao vivo. Para que o arquivo .mts não cresça continuamente até que eu fique sem espaço no disco rígido, estou tentando fazer com que o primeiro programa grave em um pipe nomeado e que ffmpeg leia esse pipe.

Eu tentei fazer ffmpeg -i /tmp/test.mts -c:v libx264 test.mp4 , mas parece que o ffmpeg é encerrado quando chega ao final do canal, em vez de esperar por novos dados. Por exemplo, se eu iniciar o programa, esperar 30 segundos e depois executar o ffmpeg, só terei ~ 50 segundos de saída de vídeo. (30 segundos + o tempo que o ffmpeg leva para recuperar)

Eu consegui trabalhar com ffmpeg -i pipe:0 -c:v libx264 test.mp4 < /tmp/test.mts , mas isso me parece meio hacky, usando stdin para fazer isso. Existe uma maneira que eu possa fornecer diretamente o pipe nomeado como uma entrada para o ffmpeg e ter que esperar por novos dados, uma vez que ele atinja o final dos dados atuais?

Obrigado!

    
por Joshua Walsh 22.11.2018 / 06:06

1 resposta

2

Simplesmente abra o fifo para escrever (e mantê-lo aberto) de outro lugar também. Exemplo:

Em uma janela:

mkfifo /tmp/test.mts
exec 7<>/tmp/test.mts
ffmpeg -i /tmp/test.mts out.mp4

Em outra janela:

cat ... >/tmp/test.mts
cat ... >/tmp/test.mts

A ideia é que um leitor não receba um EOF de um pipe até que todos os processos que o abriram tenham sido fechados:

$ mkfifo /tmp/fifo
$ cat /tmp/fifo &
[1] 26437
$ exec 7>/tmp/fifo
$ echo yes >/tmp/fifo
yes
$ echo yes >/tmp/fifo
yes
$ echo yes >/tmp/fifo
yes
$ exec 7>&-
$
[1]+  Done                    cat /tmp/fifo

Sem o exec 7>/tmp/fifo que mantém um identificador aberto para o fim de gravação de /tmp/fifo , o cat teria terminado após o primeiro echo .

    
por 22.11.2018 / 09:06

Tags