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?
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:
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.
A partir de 2014, utiliza un número óptimo.
Puede verificar esto en una computadora multinúcleo examinando la carga de la CPU (Linux:, top
Windows: 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 top
con 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".
En 2015 en Ubuntu 14.04 con ffmpeg 0.8.10-6, usó 1 núcleo en un sistema de 4 núcleos.
htop
mostró esto; solo se usó un núcleo, y obtuve una tasa de conversión de 16 fps para un video FullHD.
El uso -threads 4
hizo 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
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 ( htop
para verlo).
Al no usar ninguna -threads
opció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 -threads
opció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.
suponiendo que tenga habilitado el subproceso, asignó 1.5x número de núcleos.
-x264-params sliced-threads=1
. O a través del uso de -tune zerolatency
.