Я бачу, що -threads <count>
в ffmpeg є варіант командного рядка. Яке значення за замовчуванням для цієї опції?
Я бачу, що -threads <count>
в ffmpeg є варіант командного рядка. Яке значення за замовчуванням для цієї опції?
Відповіді:
це залежить від використовуваного кодека, версії ffmpeg та вашої кількості процесорних ядер. Іноді це просто одна нитка на ядро. Іноді це складніше:
Для libx264 це сердечники х 1,5 для ниток кадру, а ядра х 1 - для зрізів.
Станом на 2014 рік, він використовує оптимальну кількість.
Ви можете перевірити це на багатоядерному комп'ютері, вивчивши завантаження процесора (Linux:, top
Windows: диспетчер завдань) з різними параметрами для ffmpeg:
-threads 0
(оптимально);
-threads 1
(однониткові);
-threads 2
(2 потоки, наприклад, Intel Core 2 Duo);
немає (за замовчуванням, також оптимально).
2015 редагуйте: у 12-ядерному процесорі деякі команди ffmpeg мають Linux, що top
показує не більше 200% процесорного процесу (лише 2 ядра), незалежно від того, яке число вказано -threads
. Таким чином, за замовчуванням все ще може бути оптимальним у сенсі "так добре, як це може отримати цей бінарний файл ffmpeg", але не оптимальним в сенсі "повноцінно використовувати мій процесор Leet".
У 2015 році на Ubuntu 14.04 з ffmpeg 0.8.10-6 він використовував 1 ядро в 4-ядерній системі.
htop
показав це; було використано лише одне ядро, і я отримав швидкість конверсії 16 кадрів в секунду для відео FullHD.
Використовуючи -threads 4
змушені всі мої CPU ядра на 100%, і я отримав коефіцієнт конверсії в 47 кадрів в секунду.
Я використав таку команду:
$ ffmpeg -i foo.mp4 -y -target pal-dvd -aspect 16:9 dvd-out.mpg
Деякі з цих відповідей трохи застаріли, і я просто хотів би додати, що з моєї ffmpeg 4.1
, кодуючої libx264
, всі 6 ядер / 12 потоків моєї системи Ryzen 5 2600X були складені без жодних -thread
аргументів.
-vcodec libx264 -profile:v high444 -refs 14 -preset ultrafast -crf 18 -tune fastdecode
тож виділити кілька змінних. Додавання -threads 12
не впливало.
Я грав з перетворенням у CentOS 6.5 VM (Ryzen 1700 8c / 16t - vm призначено 12 з 16 ядер). Експерименти із фільмами 480p містять наступне:
Опція потоку / Швидкість конверсії (fps @ 60 сек)
(none/default)/130fps
-threads 1/70fps
-threads 2/120fps
-threads 4/185fps
-threads 6/228fps
-threads 8/204fps
-threads 10/181fps
Цікавою частиною було завантаження процесора (використовувалось htop
для перегляду).
Не використовуючи жодної -threads
опції, накручується в діапазоні 130 кадрів в секунду, навантаження розподіляється по всіх ядрах при низькому рівні навантаження.
Використовуючи 1 потік, зробив саме це, завантажив одне ядро на 100%. Використання будь-чого іншого призвело до іншої ситуації з навантаженням.
Як бачите, також існує точка зменшення віддачі, тому вам доведеться налаштувати параметр -threads для вашої конкретної машини. Спеціально для мого налаштування використання -threads 6 (на 12-ядерній машині) призвело до найкращого FPS при перетворенні відео (з h264 в x264 при іншому бітрейті для примусового перетворення) і повернення фактично зменшило більше тем, які я накидав на це.
Це теж могло бути проблемою з пам'яттю - в VM було призначено лише 1 Гб. Я можу це змінити і побачити, чи це щось змінить. І все-таки - це показує, що використання цієї -threads
опції може підвищити продуктивність, тому запускайте кілька тестів на вашій конкретній машині на різних рівнях, щоб знайти ваші налаштування приємним місцем.
якщо припустити, що ви ввімкнули різьблення, вона призначила 1,5х кількість ядер.
-x264-params sliced-threads=1
. Або за допомогою використання -tune zerolatency
.