Quanti thread usa ffmpeg per impostazione predefinita?


47

Vedo che c'è -threads <count>un'opzione della riga di comando in ffmpeg. Qual è il valore predefinito di questa opzione?

Risposte:


24

dipende dal codec utilizzato, dalla versione di ffmpeg e dal numero di core della CPU. A volte è semplicemente un thread per core. A volte è più complesso come:

Con libx264 è core x 1,5 per i thread di frame e core x 1 per i thread di sezioni.


Grazie. Hai un riferimento ai valori predefiniti per alcuni codec standard supportati da ffmpeg?
Edward Dale,

6
Non fare affidamento su di esso. Il mio ffmpeg 0.7.8 su Linux usa 1 thread di default, non importa quale.
Barafu Albino,

Quale valore può essere utilizzato per ottenere il risultato migliore? PS Sto usando FFMpeg nel framework Android.
Assassino

23

A partire dal 2014, utilizza un numero ottimale.

Puoi verificarlo su un computer multi-core esaminando il carico della CPU (Linux:, topWindows: task manager) con diverse opzioni per ffmpeg:

  • -threads 0 (ottimale);

  • -threads 1 (Single-threaded);

  • -threads 2 (2 thread per esempio un Intel Core 2 Duo);

  • nessuno (impostazione predefinita, anche ottimale).

Modifica 2015: su una CPU a 12 core, alcuni comandi di ffmpeg hanno Linux che topmostra al massimo il 200% di CPU (solo 2 core), indipendentemente dal numero a cui viene assegnato -threads. Quindi il valore predefinito può essere comunque ottimale nel senso di "buono come può ottenere questo binario ffmpeg", ma non ottimale nel senso di "sfruttare appieno la mia CPU leet".


1
Si noti che questo sembra essere vero solo per la codifica, non per l'elaborazione generale. Se in realtà non sta producendo frame di output, non sarà parallelizzato. ad es. se si esegue il de-shaking dalle 02:00 in poi, si otterrà il parallelismo solo dalle 02:00 in poi, ma sarà comunque necessario elaborare in serie tutto fino alle 02:00.
Mehrdad,

6

Nel 2015 su Ubuntu 14.04 con ffmpeg 0.8.10-6, ha usato 1 core su un sistema a 4 core. htopha mostrato questo; è stato utilizzato solo un core e ho ottenuto un tasso di conversione di 16 fps per un video FullHD.

Utilizzando -threads 4fatto tutti i miei core della CPU vanno al 100% e ho ottenuto un tasso di conversione di 47 fps.

Ho usato il seguente comando:

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

6

Alcune di queste risposte sono un po 'vecchie e vorrei solo aggiungere che con il mio ffmpeg 4.1, codificando con libx264, tutti i 6 core / 12 thread del mio sistema Ryzen 5 2600X sono stati massimizzati senza alcun -threadargomento.


Ho 1800X e sto osservando un utilizzo non del 20% distribuito tra i suoi 16 thread, ma sto usando anche alcuni argomenti opzionali: -vcodec libx264 -profile:v high444 -refs 14 -preset ultrafast -crf 18 -tune fastdecodequindi sono alcune variabili da isolare. L'aggiunta -threads 12non ha avuto alcun effetto.
Elaskanator,

3

Stavo giocando con la conversione in una VM CentOS 6.5 (Ryzen 1700 8c / 16t - vm assegnato 12 di 16 core). Gli esperimenti con i film a 480p hanno compensato quanto segue:

Opzione discussione / Tasso di conversione (fps a 60 secondi)

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

La parte interessante è stata il caricamento della CPU (usando htopper guardarlo).
L'utilizzo di nessuna -threadsopzione è terminato alla gamma di 130 fps con carico distribuito su tutti i core a basso carico.
Usando 1 thread ha fatto esattamente questo, ha caricato un core al 100%. L'uso di qualcos'altro ha comportato un'altra situazione di carico diffuso.

Come puoi vedere, c'è anche un punto di rendimenti decrescenti, quindi dovresti regolare l'opzione -threads per la tua macchina particolare. Per la mia configurazione in particolare, l'uso di -threads 6 (su una macchina a 12 core) ha prodotto i migliori FPS durante la conversione del video (da h264 a x264 a un bitrate diverso per forzare una conversione) e restituisce effettivamente diminuito più thread ho lanciato in esso.

Potrebbe anche essere stato un problema di memoria: aveva solo 1 GB assegnato alla VM. Potrei modificarlo e vedere se questo cambia qualcosa. Tuttavia, mostra che l'utilizzo -threadsdell'opzione può aumentare le prestazioni, quindi esegui alcuni test sulla tua macchina specifica a diversi livelli per trovare il punto debole delle tue configurazioni.


Potresti aggiungere cosa intendi per "conversione"? Idealmente, il comando esatto.
Ondra Žižka,

4.1.3 su Ubuntu 18.04 e risultati molto simili. L'impostazione predefinita era "carico basso su tutti i core".
Roel Van de Paar il

Immagino che il motivo per cui sei riuscito a ottenere 6 thread ottimali sulla macchina "12 core" (CPU non specificata, diversa dalla prima elencata) è che 6 potrebbe essere stato il numero reale di core e 12 il numero di thread?
Roel Van de Paar il

1

supponendo che il threading sia abilitato, ha assegnato un numero 1,5x di core.


1,5 x numero di core per i thread della cornice. 1 x numero di core per i thread di sezioni. Questo è specifico per (lib) x264. Non sono sicuro di quale sia l'allocazione per altri codificatori.
Llogan,

@LordNeckbeard Come passare da thread frame a thread thread !?
Dr.jacky,

1
@ Mr.Hyde Probabilmente con -x264-params sliced-threads=1. O tramite l'utilizzo di -tune zerolatency.
Llogan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.