Eu tenho um aplicativo C que produz uma série de imagens continuamente: frame_1.png, frame_2.png, frame_3.png, etc. O aplicativo nunca para, o que significa que quanto mais tempo ele executa, mais imagens ele produz. Enquanto o aplicativo está em execução, eu quero que o FFmpeg converta essas imagens em vídeo on-the-fly. Como resultado, quanto mais tempo o aplicativo e o FFmpeg forem executados, maior será o arquivo de vídeo de saída. O FFmpeg nunca deve terminar e deve sempre esperar por novos quadros. Como posso conseguir isso?
Até agora eu tenho isso: ffmpeg -i "frame_%d.png" output.avi
. Infelizmente, isso não faz realmente o que eu quero. Ele apenas itera sobre os arquivos que existem no sistema de arquivos no momento em que estou executando o comando FFmpeg, gera o vídeo e termina após o processamento da última imagem.
Eu também tentei usar um FIFO da seguinte maneira: (1) execute mkfifo fifo.png
. (2) Execute o aplicativo C. Dentro do aplicativo C eu tenho algo parecido com isso em um loop (pseudo-código): fd = open("fifo.png"); write_new_frame_as_png(fd); close(fd);
. (3) execute ffmpeg -i fifo.png output.avi
. Infelizmente, isso não funciona. O aplicativo C gera um quadro e bloqueia até que eu execute o FFmpeg. Então o FFmpeg apenas lê uma fama do FIFO, gera um arquivo de vídeo de um quadro e termina.
Então, minha pergunta é: como dizer ao FFmpeg para gerar um vídeo em tempo real quando novos quadros chegam?
Obrigado.
PS: Caso você esteja se perguntando por que eu quero fazer o acima: Em última análise, eu quero transmitir vídeo ao vivo usando FFmpeg e FFserver, e eu acho que esta questão abrange o primeiro passo para isso.
Tags ffmpeg