Сколько потоков использует ffmpeg по умолчанию?

47

Я вижу, что -threads <count>в ffmpeg есть опция командной строки. Какое значение по умолчанию для этой опции?

Эдвард Дейл
источник

Ответы:

24

это зависит от используемого кодека, версии ffmpeg и количества ядер вашего процессора. Иногда это просто один поток на ядро. Иногда это сложнее, как:

В libx264 это ядра x 1,5 для потоков кадра и ядра x 1 для потоков срезов.

mOlind
источник
Спасибо. У вас есть ссылка на значения по умолчанию для некоторых стандартных кодеков, поддерживаемых ffmpeg?
Эдвард Дейл
6
Не надейся на это. Мой ffmpeg 0.7.8 в Linux использует 1 поток по умолчанию, несмотря ни на что.
Барафу Альбино
Какое значение можно использовать, чтобы получить лучший результат? PS Я использую FFMpeg в Android Framework.
Убийца
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заставило все мои ядра процессора перейти на 100%, и я получил коэффициент конверсии 47 кадров в секунду.

Я использовал следующую команду:

$ ffmpeg -i foo.mp4 -y -target pal-dvd -aspect 16:9 dvd-out.mpg
cweiske
источник
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 показали следующее:

Параметр потока / Коэффициент конверсии (кадров в секунду при 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 с другим битрейтом, чтобы вызвать преобразование), и возврат фактически уменьшился, чем больше потоков я перебросил Это.

Это могло быть и проблема с памятью - для виртуальной машины было выделено всего 1 ГБ. Я могу настроить это и посмотреть, изменит ли это что-нибудь. Тем не менее - это показывает, что использование этой -threadsопции может повысить производительность, поэтому проведите несколько тестов на вашей конкретной машине на разных уровнях, чтобы найти подходящее место для ваших настроек.

Билл Рукард
источник
Не могли бы вы добавить, что вы подразумеваете под «преобразованием»? В идеале точная команда.
Ондра Жижка
4.1.3 на Ubuntu 18.04 и очень похожий результат. По умолчанию было «низкая нагрузка на все ядра».
Роэль Ван де Паар
Я предполагаю, что причина, по которой вы добились оптимального результата при 6 потоках на машине с 12 ядрами (процессор не указан, отличается от первого в списке), состоит в том, что 6 может быть реальным количеством ядер, а 12 - числом потоков?
Роэл Ван де Паар
1

Предполагая, что вы включили многопоточность, он назначил 1,5-кратное количество ядер.

rogerdpack
источник
1,5 х количество ядер для каркасных нитей. 1 х количество ядер для нарезки резьбы. Это специально для (lib) x264. Я не уверен, что распределение для других кодеров.
Llogan
@LordNeckbeard Как переключаться между потоками кадров и потоков слайсов !?
Dr.jacky
1
@ Mr.Hyde Наверное, с -x264-params sliced-threads=1. Или с помощью -tune zerolatency.
Llogan