Ile wątków domyślnie używa ffmpeg?

46

Widzę, że -threads <count>w ffmpeg dostępna jest opcja wiersza poleceń. Jaka jest domyślna wartość tej opcji?

Edward Dale
źródło

Odpowiedzi:

24

zależy to od używanego kodeka, wersji ffmpeg i liczby rdzeni procesora. Czasami jest to po prostu jeden wątek na rdzeń. Czasami jest to bardziej złożone, takie jak:

W przypadku libx264 jest to rdzeń x 1,5 dla wątków ramy i rdzeń x 1 dla wątków plastra.

mOlind
źródło
Dzięki. Czy masz odniesienie do ustawień domyślnych niektórych standardowych kodeków obsługiwanych przez ffmpeg?
Edward Dale
6
Nie polegaj na tym. Mój ffmpeg 0.7.8 w systemie Linux domyślnie używa 1 wątku bez względu na wszystko.
Barafu Albino,
Jaką wartość można zastosować, aby uzyskać lepszy wynik? PS Używam FFMpeg w systemie Android.
Killer
23

Od 2014 roku używa optymalnej liczby.

Możesz to sprawdzić na komputerze wielordzeniowym, badając obciążenie procesora (Linux:, topWindows: menedżer zadań) z różnymi opcjami ffmpeg:

  • -threads 0 (optymalne);

  • -threads 1 (jednowątkowy);

  • -threads 2 (2 wątki np. Dla Intel Core 2 Duo);

  • brak (domyślnie, również optymalnie).

Edycja 2015: na 12-rdzeniowym procesorze niektóre polecenia ffmpeg mają Linuksa toppokazującego najwyżej 200% procesora (tylko 2 rdzenie), bez względu na to, jaką liczbę podano -threads. Tak więc wartość domyślna może być nadal optymalna w sensie „tak dobrego, jak ten plik binarny ffmpeg”, ale nie optymalna w znaczeniu „pełnego wykorzystania mojego najlepszego procesora”.

Camille Goudeseune
źródło
1
Zauważ, że dotyczy to tylko kodowania, a nie ogólnego przetwarzania. Jeśli tak naprawdę nie produkuje ramek wyjściowych, nie będzie równoległy. np. jeśli trzęsiesz się od 02:00 r., wówczas dostaniesz paralelizm dopiero od 02:00 r., ale wszystko do 02:00 nadal będzie musiało być przetwarzane szeregowo.
Mehrdad
6

W 2015 r. Na Ubuntu 14.04 z ffmpeg 0.8.10-6 używało 1 rdzenia w systemie 4-rdzeniowym. htoppokazał to; zastosowano tylko jeden rdzeń, a ja uzyskałem współczynnik konwersji 16 fps dla wideo FullHD.

Używając sprawiłem, -threads 4że wszystkie moje rdzenie procesora spadły do ​​100%, a ja uzyskałem współczynnik konwersji 47 fps.

Użyłem następującego polecenia:

$ ffmpeg -i foo.mp4 -y -target pal-dvd -aspect 16:9 dvd-out.mpg
cweiske
źródło
6

Niektóre z tych odpowiedzi są nieco stare i chciałbym dodać, że przy moim ffmpeg 4.1, kodowaniu za pomocą libx264, wszystkie 6 rdzeni / 12 wątków mojego systemu Ryzen 5 2600X zostały zmaksymalizowane bez żadnego -threadargumentu.

Matt M.
źródło
Mam 1800X i obserwuję nie całkiem 20% wykorzystania rozłożone na jego 16 wątków, ale używam również kilku opcjonalnych argumentów: -vcodec libx264 -profile:v high444 -refs 14 -preset ultrafast -crf 18 -tune fastdecodewięc to kilka zmiennych do wyodrębnienia. Dodanie -threads 12nie miało wpływu.
Elaskanator
3

Bawiłem się konwersją w CentOS 6.5 VM (Ryzen 1700 8c / 16t - vm przypisano 12 z 16 rdzeni). Eksperymenty z filmami 480p przyniosły następujące efekty:

Opcja wątku / współczynnik konwersji (fps @ 60 s)

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

Interesującą częścią było ładowanie procesora (używanie go htopdo oglądania).
Bez -threadsużycia opcji zwijanej w zakresie 130 klatek na sekundę z rozkładem obciążenia na wszystkie rdzenie przy niskim obciążeniu.
Za pomocą 1 wątku zrobił to dokładnie, załadował jeden rdzeń na 100%. Używanie czegokolwiek innego skutkowało kolejną sytuacją obciążenia rozkładaniem.

Jak widać, istnieje również punkt malejących zwrotów, dlatego trzeba dostosować opcję -wątków dla konkretnej maszyny. W przypadku mojej konfiguracji użycie -wątków 6 (na maszynie 12-rdzeniowej) przyniosło najlepszy FPS podczas konwersji wideo (z h264 na x264 przy innej szybkości transmisji bitów w celu wymuszenia konwersji) i zwroty faktycznie zmniejszyły się, im więcej wątków wrzuciłem to.

Mógł to być także problem z pamięcią - do maszyny wirtualnej przypisano tylko 1 GB. Mogę to poprawić i sprawdzić, czy to coś zmieni. Mimo to - pokazuje, że użycie tej -threadsopcji może zwiększyć wydajność, dlatego uruchom kilka testów na konkretnej maszynie na różnych poziomach, aby znaleźć swoje ulubione ustawienia.

Bill Rookard
źródło
Czy możesz dodać, co rozumiesz przez „konwersję”? Idealnie dokładne polecenie.
Ondra Žižka
4.1.3 na Ubuntu 18.04 i bardzo podobny wynik. Domyślnie było to „niskie obciążenie wszystkich rdzeni”.
Roel Van de Paar
Sądzę, że powodem, dla którego uzyskałeś optymalizację przy 6 wątkach na maszynie „12 rdzeniowej” (procesora nie podano, różni się od pierwszego wymienionego na liście) jest to, że 6 mogło być rzeczywistą liczbą rdzeni, a 12 liczbą wątków?
Roel Van de Paar
1

zakładając, że masz włączone wątkowanie, przypisano 1,5-krotną liczbę rdzeni.

rogerdpack
źródło
1,5 x liczba rdzeni dla gwintów ramy. 1 x liczba rdzeni do gwintów ciętych. Jest to specyficzne dla (lib) x264. Nie jestem pewien, jaka jest alokacja dla innych koderów.
llogan
@ LordNeckbeard Jak przełączać się między wątkami w ramkach i wątkami w plasterkach !?
Dr.jacky
1
@ Mr.Hyde Prawdopodobnie z -x264-params sliced-threads=1. Lub poprzez użycie -tune zerolatency.
llogan