Diz ao ffmpeg para eliminar quadros para reduzir o uso de memória?

3

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!

    
por Malvineous 03.04.2018 / 04:11

1 resposta

2

Eu descobri isso como sendo um problema para o meu ambiente ao capturar a partir de câmera e streaming FULL HD e enquanto a rede atingiu algum gargalo ffmpeg rtbufsize preenche muito rapidamente e ffmpeg começa a cair quadros. Isso soa como a solução para o seu problema.

A biblioteca libavformat fornece algumas opções globais genéricas, que podem ser definidas em todos os muxers e demuxersock:

rtbufsizeinteger (input)

    Set max memory used for buffering real-time frames.

Fonte: Documentação dos formatos do FFmpeg

Supondo que você quer um buffer limitado de 150 MB, tente isto:

ffmpeg -rtbufsize 150M -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

Isso significa que, enquanto a máquina não consegue acompanhar, ela começa a preencher os dados recebidos na memória RAM, preenchendo assim o buffer, que quando atinge o limite, começa a perder os quadros.

    
por 06.08.2018 / 17:34