Cómo minimizar el uso de CPU / memoria por ffmpeg al grabar video

13

Uso FFmpeg para hacer capturas de pantalla de video desde la pantalla Xvfb.

Actualmente lo invoco con:

ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov

Cuando grabo video de aproximadamente 5 sesiones Xvfb, mi uso de CPU es muy alto y hay retrasos debido a eso. Además, el uso de memoria es de aproximadamente 300 MB para cada uno de los procesos de ffmpeg.

¿Qué parámetros para ffmpeg debo usar para minimizar el uso de recursos de la computadora (particularmente CPU y memoria) al hacer la captura de pantalla de video?

Andrei Botalov
fuente

Respuestas:

17

1. Primero haga una salida RGB sin pérdidas

ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
  • La entrada es RGB, por lo que usar el codificador libx264rgb evitará la conversión potencialmente lenta de RGB a YUV que ocurriría si usa libx264 simple.

  • Utiliza el preestablecimiento de codificación x264 más rápido: ultrarrápido.

  • La salida será sin pérdidas porque -crf 0se usa.

2. Luego vuelva a codificarlo

El resultado del primer comando será enorme, y la mayoría de los jugadores tontos no pueden manejar RGB H.264, por lo que puede volver a codificarlo:

ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
  • Puede experimentar con el -crfvalor para controlar la calidad de salida. Un rango subjetivamente sano es 18-28, donde 18 es visualmente sin pérdidas o casi. El valor predeterminado es 23.

  • Utilizar el valor preestablecido más lento que tiene la paciencia para: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow. Por defecto es medium.

  • Agregué -vf format=yuv420ppara garantizar que la salida funciona con reproductores tontos como QuickTime y Windows Media Player. Puede omitir esto si lo está cargando en YouTube o solo lo está reproduciendo en VLC, mpv, MPlayer o cualquier otro reproductor basado en FFmpeg.

Ver también

lema
fuente
Capturo video desde una pantalla no predeterminada (es Xvfb) para que pueda ser cualquier número
Andrei Botalov
@AndreyBotalov ¿Probaste el método sin pérdidas? ¿Funcionó mejor para ti?
llogan
1
Actualmente invoco ffmpegcon el -preset superfastparámetro (no lo he intentado -crf). Toma menos recursos en tal caso y produce videos de un tamaño suficientemente bueno.
Andrei Botalov
@AndreyBotalov -crf 23se usa de forma predeterminada si no declara un valor, pero de todos modos si superfastes suficiente para usted, entonces tal vez el problema esté resuelto.
llogan
1
También puede probar la codificación de hardware a través de h264_nvenc (nvidia) o h264_qsv (CPU Intel moderna). Esto cambiará la carga de la codificación de su CPU al hardware dedicado h264.
Kenn
4

Es mejor concentrarse en usar diferentes opciones de ffmpeg que logren el mismo resultado de una manera que use menos recursos. Dicho esto, hay formas de usar menos recursos si realmente necesita lograr algo específico con ffmpeg y está usando demasiados recursos.

Puede disminuir la prioridad del ffmpegproceso de CPU de:

  • Terminal método: Utilice el nicecomando para cambiar la prioridad del proceso: nice -n 8 ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov. En Linux, el número de prioridad (el niceformato del comando es nice -n <priority> <command>) varía de -20 a 20. Cuanto mayor sea el entero, menor será la prioridad; neutral es 0. Si usa el comando que le di y lo configuró en 8, la CPU le dará al proceso menos tiempo, lo que parece menos "potencia". Si este número es demasiado alto o dos bajos, por supuesto, puede cambiarlo.
  • Método GUI: Esto no se recomienda porque le da menos control sobre el número exacto y no surte efecto tan pronto como comience el proceso. Sin embargo, es más comprensible. Con la ffmpegejecución, abra el Monitor del sistema. Desplácese hacia abajo hasta el proceso nombrado ffmpeg, haga clic con el botón izquierdo para seleccionar, haga clic con el botón derecho y configure la prioridad en "Bajo" o "Muy bajo".

Si también le preocupa el uso de la memoria, sepa que no es posible decirle a un proceso que solo tome tanta memoria y aún se ejecute. El kernel controla automáticamente la asignación de memoria para los procesos. Hay una manera de enjaular procesos, con el timeoutscript , de modo que cuando un proceso y cualquier proceso secundario ocupan demasiada memoria (un límite establecido por usted) se finalizan de forma segura y se muestra una notificación. Sin embargo, si un proceso solo recibe tanta memoria (digamos por el núcleo) y solicita más memoria que no puede tener, se bloqueará.

Algunas cosas útiles que debe saber sobre:

Usando el conocimiento de Cgroups, puede hacer muchas cosas divertidas como controlar el intercambio de un proceso.

Ricardo
fuente
2
Si entiendo correctamente, poner ffmpeg en la cola de menor prioridad hará que produzca videos con retrasos que no son deseados.
Andrei Botalov
1
Hmm ... No veo nada en línea que diga eso ... ¿Tienes una fuente que indique eso? (Si no, debería ser un error).
Richard
2
Si entiendo correctamente, una prioridad más baja significa que ffmpeg tendrá menos tiempo de procesador que el que tiene ahora. Pero el procesador está cargado casi al 100%, así que creo que la repriorización no ayudará
Andrei Botalov
1
Esto está diseñado para limitar el uso de CPU del proceso, por lo que si su CPU está funcionando al 100%, será más fácil manejarla.
Richard
44
Tengo -1 esto, porque no importa cómo cambie la prioridad, solo lo empeorará. Establecer una prioridad más baja reducirá el tiempo de CPU para ffmpeg, lo que dará como resultado más cuadros perdidos o, al aumentar la prioridad, ralentizará aún más otros procesos en el sistema. Ambos resultados no son deseados.
gertvdijk
0

-re (entrada) Leer entrada a velocidad de fotogramas nativa. Se utiliza principalmente para simular un dispositivo de captura o una transmisión de entrada en vivo (por ejemplo, cuando se lee desde un archivo). No debe usarse con dispositivos de captura reales o transmisiones de entrada en vivo (donde puede causar pérdida de paquetes). Por defecto, ffmpeg intenta leer las entradas lo más rápido posible. Esta opción ralentizará la lectura de las entradas a la velocidad de fotogramas nativa de las entradas. Es útil para la salida en tiempo real (por ejemplo, transmisión en vivo).

劉 大為
fuente
"No debe usarse con dispositivos de captura reales" como x11grab.
llogan