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 ffmpeg
no 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 ffmpeg
si 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é monit
reiniciar 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 -r
opció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 -vsync
opción también parece hacer algo similar, intentando igualar una velocidad de fotogramas en lugar de minimizar el almacenamiento en búfer.
-frame_drop_threshold
Parece 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 ffmpeg
eliminar 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:
rtbufsize
entero (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.