Скільки ниток за замовчуванням використовує ffmpeg?


47

Я бачу, що -threads <count>в ffmpeg є варіант командного рядка. Яке значення за замовчуванням для цієї опції?

Відповіді:


24

це залежить від використовуваного кодека, версії ffmpeg та вашої кількості процесорних ядер. Іноді це просто одна нитка на ядро. Іноді це складніше:

Для libx264 це сердечники х 1,5 для ниток кадру, а ядра х 1 - для зрізів.


Спасибі. Чи є у вас посилання на параметри за замовчуванням для деяких стандартних кодеків, підтримуваних ffmpeg?
Едвард Дейл

6
Не покладайтеся на це. Мій ffmpeg 0.7.8 для Linux використовує 1 потік за замовчуванням незалежно від того.
Барафу Альбіно

Яке значення можна використати для отримання кращого результату? PS Я використовую FFMpeg в рамках Android.
Вбивця

23

Станом на 2014 рік, він використовує оптимальну кількість.

Ви можете перевірити це на багатоядерному комп'ютері, вивчивши завантаження процесора (Linux:, topWindows: диспетчер завдань) з різними параметрами для ffmpeg:

  • -threads 0 (оптимально);

  • -threads 1 (однониткові);

  • -threads 2 (2 потоки, наприклад, Intel Core 2 Duo);

  • немає (за замовчуванням, також оптимально).

2015 редагуйте: у 12-ядерному процесорі деякі команди ffmpeg мають Linux, що topпоказує не більше 200% процесорного процесу (лише 2 ядра), незалежно від того, яке число вказано -threads. Таким чином, за замовчуванням все ще може бути оптимальним у сенсі "так добре, як це може отримати цей бінарний файл ffmpeg", але не оптимальним в сенсі "повноцінно використовувати мій процесор Leet".


1
Зауважте, що це здається справедливим лише для кодування, а не для загальної обробки. Якщо він фактично не створює вихідні кадри, він не буде паралельним. наприклад, якщо ви знімаєте тремтіння з 02:00, тоді ви отримаєте паралелізм лише з 02:00, але все до 02:00 все одно потрібно буде обробляти серійно.
Мехрдад

6

У 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

6

Деякі з цих відповідей трохи застаріли, і я просто хотів би додати, що з моєї ffmpeg 4.1, кодуючої libx264, всі 6 ядер / 12 потоків моєї системи Ryzen 5 2600X були складені без жодних -threadаргументів.


У мене є 1800X, і я спостерігаю не дуже 20% використання, що поширюється на його 16 потоків, але я також використовую кілька необов'язкових аргументів: -vcodec libx264 -profile:v high444 -refs 14 -preset ultrafast -crf 18 -tune fastdecodeтож виділити кілька змінних. Додавання -threads 12не впливало.
Еласканатор

3

Я грав з перетворенням у 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опції може підвищити продуктивність, тому запускайте кілька тестів на вашій конкретній машині на різних рівнях, щоб знайти ваші налаштування приємним місцем.


Не могли б ви додати, що ви маєте на увазі під перетворенням? В ідеалі - точна команда.
Ондра Жижка

4.1.3 на Ubuntu 18.04 та дуже схожий результат. За замовчуванням було "низьке навантаження на всі ядра".
Роель Ван де Паар

Я здогадуюсь, що причина, чому ви отримали оптимальне значення для 6 потоків на машині "12 core" (процесор не вказаний, відмінний від першого перерахованого), полягає в тому, що 6 може бути реальною кількістю ядер, а 12 - числом потоків?
Роель Ван де Паар

1

якщо припустити, що ви ввімкнули різьблення, вона призначила 1,5х кількість ядер.


1,5 х кількість ядер для ниток кадру. 1 х кількість ядер для зрізів ниток. Це специфічно для (lib) x264. Я не впевнений, що виділення для інших кодерів.
логіан

@LordNeckbeard Як перемикатися між нитками кадру та нарізкою фрагментів !?
Dr.jacky

1
@ Mr.Hyde Напевно, с -x264-params sliced-threads=1. Або за допомогою використання -tune zerolatency.
llogan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.