Wie viele Threads verwendet ffmpeg standardmäßig?


46

Ich sehe, dass es eine -threads <count>Befehlszeilenoption in ffmpeg gibt. Was ist der Standardwert dieser Option?

Antworten:


24

Dies hängt vom verwendeten Codec, der ffmpeg-Version und der Anzahl der CPU-Kerne ab. Manchmal ist es einfach ein Thread pro Kern. Manchmal ist es komplexer wie:

Bei libx264 sind dies Cores x 1.5 für Frame-Threads und Cores x 1 für Slice-Threads.


Vielen Dank. Haben Sie einen Verweis auf die Standardeinstellungen einiger von ffmpeg unterstützten Standard-Codecs?
Edward Dale

6
Verlasse dich nicht darauf. Mein ffmpeg 0.7.8 unter Linux verwendet standardmäßig 1 Thread, egal was passiert.
Barafu Albino

Welcher Wert kann verwendet werden, um das bessere Ergebnis zu erzielen? PS Ich benutze FFMpeg im Android-Framework.
Killer

23

Ab 2014 wird eine optimale Anzahl verwendet.

Sie können dies auf einem Multi-Core-Computer überprüfen, indem Sie die CPU-Auslastung (Linux : top, Windows: Task-Manager) mit verschiedenen Optionen für ffmpeg untersuchen:

  • -threads 0 (optimal);

  • -threads 1 (Single-Threaded);

  • -threads 2 (2 Threads für zB einen Intel Core 2 Duo);

  • none (Standardeinstellung, auch optimal).

2015 edit: Auf einer 12-Kern-CPU haben einige ffmpeg-Befehle Linux topmit höchstens 200% CPU (nur 2 Kerne), unabhängig von der Anzahl der Kerne -threads. Die Standardeinstellung ist also möglicherweise immer noch optimal im Sinne von "so gut wie diese ffmpeg-Binärdatei sein kann", jedoch nicht optimal im Sinne von "Meine leere CPU voll ausnutzen".


1
Beachten Sie, dass dies nur für die Codierung zutrifft, nicht für die allgemeine Verarbeitung. Wenn es nicht tatsächlich Ausgaberahmen erzeugt, wird es nicht parallelisiert. Wenn Sie z. B. ab 02:00 Uhr abschalten, wird die Parallelität erst ab 02:00 Uhr hergestellt. Bis 02:00 Uhr muss jedoch noch alles seriell verarbeitet werden.
Mehrdad

6

In 2015 unter Ubuntu 14.04 mit ffmpeg 0.8.10-6 wurde 1 Kern auf einem 4-Kern-System verwendet. htopzeigte dies; Es wurde nur ein Kern verwendet, und ich habe eine Konvertierungsrate von 16 fps für ein FullHD-Video erhalten.

Wenn -threads 4ich alle meine CPU-Kerne zu 100% ausnutze, erhalte ich eine Konvertierungsrate von 47 fps.

Ich habe den folgenden Befehl verwendet:

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

6

Einige dieser Antworten sind ein bisschen alt, und ich möchte nur hinzufügen, dass bei meiner ffmpeg 4.1Codierung mit libx264alle 6 Kerne / 12 Threads meines Ryzen 5 2600X-Systems ohne -threadArgumente ausgereizt wurden .


Ich habe das 1800X und beobachte nicht ganz 20% Auslastung über seine 16 Threads verteilt, aber ich verwende auch ein paar optionale Argumente: Das -vcodec libx264 -profile:v high444 -refs 14 -preset ultrafast -crf 18 -tune fastdecodesind also ein paar Variablen, die zu isolieren sind. Das Hinzufügen -threads 12hatte keine Wirkung.
Elaskanator

3

Ich habe mit der Konvertierung in eine CentOS 6.5 VM gespielt (Ryzen 1700 8c / 16t - vm hat 12 von 16 Kernen zugewiesen). Experimente mit 480p-Filmen ergaben folgende Ergebnisse:

Thread-Option / Conversion-Rate (fps @ 60 secs)

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

Der interessante Teil war das Laden der CPU ( htopum es zu beobachten).
Verwenden Sie keine -threadsOption, die im Bereich von 130 fps mit einer auf alle Kerne verteilten Last bei niedriger Last aufgewickelt wurde.
Die Verwendung von 1 Thread hat genau das bewirkt und einen Kern zu 100% geladen. Die Verwendung von etwas anderem führte zu einer anderen Spread-Load-Situation.

Wie Sie sehen, ist auch die Rendite rückläufig, sodass Sie die Option -threads für Ihren bestimmten Computer anpassen müssen. Speziell für mein Setup ergab die Verwendung von -threads 6 (auf einem 12-Core-Computer) die besten FPS beim Konvertieren des Videos (von h264 zu x264 mit einer anderen Bitrate, um eine Konvertierung zu erzwingen) und die Rückgaben verringerten sich tatsächlich, je mehr Threads ich hineingeworfen habe es.

Es könnte auch ein Speicherproblem gewesen sein - der VM wurde nur 1 GB zugewiesen. Ich kann das optimieren und sehen, ob sich etwas ändert. Trotzdem zeigt sich, dass die Verwendung dieser -threadsOption die Leistung steigern kann. Führen Sie daher einige Tests auf Ihrem bestimmten Computer auf verschiedenen Ebenen durch, um den Sweet Spot für Ihre Setups zu finden.


Könnten Sie bitte hinzufügen, was Sie unter "Konvertieren" verstehen? Idealerweise das genaue Kommando.
Ondra Žižka

4.1.3 auf Ubuntu 18.04 und sehr ähnliches Ergebnis. Standard war "niedrige Last auf allen Kernen".
Roel Van de Paar

Ich vermute, der Grund, warum Sie bei 6 Threads auf der "12-Core" -Maschine (CPU nicht angegeben, abweichend von der ersten Liste) optimal waren, ist, dass 6 möglicherweise die tatsächliche Anzahl der Kerne und 12 die Anzahl der Threads waren.
Roel Van de Paar

1

Vorausgesetzt, Sie haben Threading aktiviert, wurden 1,5-mal so viele Kerne zugewiesen.


1,5 x Anzahl der Kerne für Rahmengewinde. 1 x Anzahl der Kerne für Slice-Threads. Dies ist spezifisch für (lib) x264. Ich bin nicht sicher, wie die Zuordnung für andere Encoder ist.
Logan

@LordNeckbeard So wechseln Sie zwischen Frame-Threading und Slice-Threading !?
Dr.jacky

1
@ Mr.Hyde Wahrscheinlich mit -x264-params sliced-threads=1. Oder über die Verwendung von -tune zerolatency.
Logan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.