¿Cuántos hilos usa ffmpeg por defecto?


44

Veo que hay una -threads <count>opción de línea de comando en ffmpeg. ¿Cuál es el valor predeterminado de esta opción?

Respuestas:


24

depende del códec utilizado, la versión de ffmpeg y el número de núcleos de su CPU. A veces es simplemente un hilo por núcleo. A veces es más complejo como:

Con libx264 es núcleos x 1.5 para hilos de trama y núcleos x 1 para hilos de corte.


Gracias. ¿Tiene alguna referencia a los valores predeterminados para algunos códecs estándar compatibles con ffmpeg?
Edward Dale

66
No confíes en eso. Mi ffmpeg 0.7.8 en Linux usa 1 hilo por defecto sin importar qué.
Barafu Albino

¿Qué valor se puede usar para obtener el mejor resultado? PD: Estoy usando FFMpeg en el marco de Android.
Asesino

21

A partir de 2014, utiliza un número óptimo.

Puede verificar esto en una computadora multinúcleo examinando la carga de la CPU (Linux:, topWindows: administrador de tareas) con diferentes opciones para ffmpeg:

  • -threads 0 (óptimo);

  • -threads 1 (de un solo hilo);

  • -threads 2 (2 hilos para, por ejemplo, un Intel Core 2 Duo);

  • ninguno (el predeterminado, también óptimo).

Edición 2015: en una CPU de 12 núcleos, algunos comandos de ffmpeg tienen Linux topcon un máximo de 200% de CPU (solo 2 núcleos), sin importar el número asignado -threads. Por lo tanto, el valor predeterminado aún puede ser óptimo en el sentido de "tan bueno como este binario ffmpeg puede ser", pero no óptimo en el sentido de "explotar completamente mi CPU leet".


1
Tenga en cuenta que esto solo parece ser cierto para la codificación, no para el procesamiento general. Si en realidad no está produciendo cuadros de salida, entonces no se paralelizará. por ejemplo, si está sacudiendo a partir de las 02:00 en adelante, solo obtendrá paralelismo a partir de las 02:00 en adelante, pero todo hasta las 02:00 deberá procesarse en serie.
Mehrdad

5

En 2015 en Ubuntu 14.04 con ffmpeg 0.8.10-6, usó 1 núcleo en un sistema de 4 núcleos. htopmostró esto; solo se usó un núcleo, y obtuve una tasa de conversión de 16 fps para un video FullHD.

El uso -threads 4hizo que todos mis núcleos de CPU fueran al 100% y obtuve una tasa de conversión de 47 fps.

Usé el siguiente comando:

$ ffmpeg -i foo.mp4 -y -target pal-dvd -aspect 16:9 dvd-out.mpg

5

Algunas de estas respuestas son un poco antiguas, y me gustaría agregar eso con mi ffmpeg 4.1, codificando con libx264, los 6 núcleos / 12 hilos de mi sistema Ryzen 5 2600X se maximizaron sin ningún -threadargumento.


3

Estaba jugando con la conversión en una VM CentOS 6.5 (Ryzen 1700 8c / 16t - vm asignado 12 de 16 núcleos). Los experimentos con películas de 480p obtuvieron lo siguiente:

Opción de subproceso / tasa de conversión (fps a 60 segundos)

(none/default)/130fps
-threads 1/70fps
-threads 2/120fps
-threads 4/185fps
-threads 6/228fps
-threads 8/204fps
-threads 10/181fps

La parte interesante fue la carga de la CPU ( htoppara verlo).
Al no usar ninguna -threadsopción, terminó en el rango de 130 fps con la carga distribuida en todos los núcleos a un nivel de carga baja.
Usando 1 hilo hizo exactamente eso, cargó un núcleo al 100%. Usar cualquier otra cosa resultó en otra situación de carga extendida.

Como puede ver, también hay un punto de rendimientos decrecientes, por lo que tendría que ajustar la opción de hilos para su máquina en particular. Para mi configuración específicamente, el uso de los subprocesos 6 (en una máquina de 12 núcleos) resultó en el mejor FPS al convertir el video (de h264 a x264 a una tasa de bits diferente para forzar una conversión) y los retornos en realidad disminuyeron a medida que subí más hilos eso.

También podría haber sido un problema de memoria: solo tenía 1 GB asignado a la VM. Puedo modificar eso y ver si eso cambia algo. Aún así, muestra que el uso de la -threadsopción puede aumentar el rendimiento, por lo que debe realizar algunas pruebas en su máquina en particular a diferentes niveles para encontrar el punto óptimo de su configuración.


¿Podría por favor agregar qué quiere decir con "convertir"? Idealmente, el comando exacto.
Ondra Žižka

4.1.3 en Ubuntu 18.04 y resultado muy similar. El valor predeterminado era "carga baja en todos los núcleos".
Roel Van de Paar

Supongo que la razón por la que obtuviste 6 hilos en la máquina "12 núcleos" (CPU no especificada, diferente de la primera lista) es que 6 pueden haber sido el número real de núcleos y 12 el número de hilos.
Roel Van de Paar

1

suponiendo que tenga habilitado el subproceso, asignó 1.5x número de núcleos.


1.5 x número de núcleos para hilos de trama. 1 x número de núcleos para hilos de corte. Esto es específico para (lib) x264. No estoy seguro de cuál es la asignación para otros codificadores.
llogan

@LordNeckbeard ¿Cómo cambiar entre el enhebrado del marco y el enhebrado de corte?
Dr.jacky

1
@ Mr.Hyde Probablemente con -x264-params sliced-threads=1. O a través del uso de -tune zerolatency.
llogan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.