¿Dile a ffmpeg que elimine fotogramas para reducir el uso de memoria?

¿Dile a ffmpeg que elimine fotogramas para reducir el uso de memoria?

Estoy transcodificando imágenes en tiempo real de una cámara de seguridad de MJPEG a MPEG2, usando ffmpeg.

Desafortunadamente, la máquina que realiza la transcodificación no puede mantener el ritmo (100% de uso de la CPU), sin embargo, es "suficientemente buena" y no me importa la caída ocasional de fotogramas. Pero por alguna razón ffmpegno se pierde ningún cuadro, por lo que el uso de la memoria sigue aumentando a medida que el proceso se retrasa con respecto a los cuadros entrantes, y luego la máquina se queda sin memoria y el video comienza a corromperse gravemente.

¿Hay alguna forma de saber ffmpegsi se deben eliminar fotogramas de forma más agresiva? Los problemas ocurren cuando el uso de la memoria alcanza los 1,9 GB, así que intenté monitreiniciar el proceso cuando la memoria supera los 1,5 GB, sin embargo, luego se reinicia cada 10 minutos, lo que rompe la duración preferida de 15 minutos de cada archivo transcodificado.

Este es el comando que estoy 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

La página de manual dice que la -ropción se puede usar como una opción de salida para eliminar fotogramas, sin embargo, estoy haciendo esto y parece que solo elimina fotogramas para igualar la velocidad de fotogramas de salida (30 fps aquí) en lugar de eliminar fotogramas para ponerse al día con el flujo de entrada.

La -vsyncopción también parece hacer algo similar, intentando igualar una velocidad de fotogramas en lugar de minimizar el almacenamiento en búfer.

-frame_drop_thresholdParece más prometedor, pero nuevamente, parece que se trata de eliminar fotogramas para mantenerse al día con las marcas de tiempo en lugar de tratar de mantenerse al día con la codificación en tiempo real.

¿Existe alguna otra opción que pueda usar que me indique ffmpegeliminar fotogramas según sea necesario para evitar consumir tanta memoria? Me imagino que esto estaría en las opciones de tiempo real/transmisión/baja latencia, ¡pero parece que no puedo encontrar nada!

Respuesta1

Descubrí que esto es un problema para mi entorno al capturar desde la cámara y transmitir en FULL HD y, aunque la red encuentra algunos cuellos de botella, ffmpeg rtbufsize se llena bastante rápido y ffmpeg comienza a perder fotogramas. Esta parece la solución a su problema.

La biblioteca libavformat proporciona algunas opciones globales genéricas, que se pueden configurar en todos los muxers y demuxersock:

rtbufsizeentero (entrada)

    Establezca la memoria máxima utilizada para almacenar en búfer fotogramas en tiempo real.

Fuente:Documentación de formatos FFmpeg

Suponiendo que desea un búfer limitado de 150 MB, intente esto:

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

Eso significa que, mientras la máquina no puede seguir el ritmo, comienza a llenar la RAM con datos entrantes, llenando así el búfer, que cuando alcanza el límite comenzará a perder cuadros en gran medida.

información relacionada