Estou transcodificando imagens em tempo real de uma câmera de segurança de MJPEG para MPEG2, usando ffmpeg
.
Infelizmente, a máquina que faz a transcodificação não consegue acompanhar (100% do uso da CPU), mas é "boa o suficiente" e não me importo com o ocasional quadro descartado. Mas por algum motivo,
ffmpeg
não está perdendo quadros, então o uso da memória continua aumentando à medida que o processo fica atrás dos quadros recebidos, e então a máquina fica sem memória e o vídeo começa a ficar muito corrompido.
Existe alguma maneira de informar ffmpeg
para descartar quadros de maneira mais agressiva? Os problemas acontecem quando o uso da memória atinge 1,9 GB, então eu tentei usar monit
para reiniciar o processo quando a memória ultrapassa 1,5 GB, entretanto ele é reiniciado a cada 10 minutos, o que quebra a duração preferida de 15 minutos de cada arquivo transcodificado .
Este é o comando que estou usando:
ffmpeg -overrun_nonfatal 1 -y -i udp://1.2.3.4
-c mpeg2video -b:v 2M -vf transpose=2
-preset ultrafast -an -r 30
out.mkv
A manpage diz que a opção -r
pode ser usada como uma opção de saída para descartar quadros, mas estou fazendo isso e parece que ele só desce quadros para corresponder à taxa de quadros de saída (30fps aqui) em vez de descartar quadros para capturar com o fluxo de entrada.
A opção -vsync
também parece que faz algo semelhante, tentando corresponder a uma taxa de quadros em vez de minimizar o armazenamento em buffer.
-frame_drop_threshold
parece mais promissor, mas novamente isso parece ser sobre a queda de quadros para acompanhar os timestamps, em vez de tentar acompanhar a codificação em tempo real.
Existe alguma outra opção que eu possa usar para informar ffmpeg
para descartar quadros conforme necessário para evitar o uso de tanta memória? Eu imagino que isso seria nas opções em tempo real / streaming / baixa latência, mas não consigo encontrar nada!