2016-12-06 1 views
1

Число фактических потоков, используемых FFmpeg, не совпадает с числом, которое я передаю, используя аргумент -threads.FFmpeg использует больше потоков, чем я ожидаю при использовании -threads

Я проверил тесты на моем MacBook Air, который имеет 4 ядра, и VM, у меня есть 2 ядра. Количество используемых потоков согласовано на обеих машинах.

Использование одного потока возвращает то, что я ожидаю: используется 1 поток.

$ ffmpeg -threads 1 -i clip.mp4 -threads 1 -acodec libfdk_aac -vcodec libx264 -b:v 200k -vf scale=200:-2 -y clip-200.mp4 

$ cat /proc/$(pgrep ffmpeg)/status | grep Threads 
Threads:  1 

Если я устанавливаю -threads вариант на входе, это увеличение числа нитей, используемых для 3. Это несколько имеет смысл для меня, так как вход будет использовать 2 нити и выход будет использовать одну нить.

$ ffmpeg -threads 2 -i clip.mp4 -threads 1 -acodec libfdk_aac -vcodec libx264 -b:v 200k -vf scale=200:-2 -y clip-200.mp4 

$ cat /proc/$(pgrep ffmpeg)/status | grep Threads 
Threads:  3 

Здесь я начинаю путаться. Если вместо этого я оставил вход -threads в 1 и установил вывод -threads в 2, он использует 8 потоков (не 3, как я ожидал).

$ ffmpeg -threads 1 -i clip.mp4 -threads 2 -acodec libfdk_aac -vcodec libx264 -b:v 200k -vf scale=200:-2 -y clip-200.mp4 

cat /proc/$(pgrep ffmpeg)/status | grep Threads 
Threads:  8 

Если добавить второй выход с -threads 1, это не увеличивает количество используемых потоков.

$ ffmpeg -threads 1 -i clip.mp4 -threads 2 -acodec libfdk_aac -vcodec libx264 -b:v 200k -vf scale=200:-2 -y clip-200.mp4 \ 
           -threads 1 -acodec libfdk_aac -vcodec libx264 -b:v 250k -vf scale=250:-2 -y clip-250.mp4 

cat /proc/$(pgrep ffmpeg)/status | grep Threads 
Threads:  8 

Однако, если второй выход также определяет два потока, количество нити переходит на 15.

$ ffmpeg -threads 1 -i clip.mp4 -threads 2 -acodec libfdk_aac -vcodec libx264 -b:v 200k -vf scale=200:-2 -y clip-200.mp4 \ 
           -threads 2 -acodec libfdk_aac -vcodec libx264 -b:v 250k -vf scale=250:-2 -y clip-250.mp4 

cat /proc/$(pgrep ffmpeg)/status | grep Threads 
Threads:  15 

Каждый инкрементный шишка за -threads 2 будет использовать дополнительные 3 темы (например, threads 2 использует 8, threads 3 использует 11, threads 4 использует 14.

Так что, похоже, как в любое время вы используете -threads 2 формула что-то вроде:

1 + [ (1 + (3 * output_n_threads)) + ... ] 

В конечном счете, мой вопрос заключается в том, почему количество фактических потоков, используемых дико отличается от опций, которые я указываю.

Спасибо.

ответ

5

Короткий ответ - эти варианты не совсем то, что вы думаете.

Длинный ответ следующим образом:

FFmpeg всегда имеет одну основную нить, которая делает большую часть обработки. В случае нескольких входов есть также потоки ввода для демультиплексирования (1 поток на вход); для одномоментного демультиплексирования выполняется на основном потоке.

Установка «нитей N» (где N> 1) на входе позволяет многопоточное декодирование, которое может порождать N дополнительных потоков для каждого декодера, который его поддерживает. В вашем случае видеодекодер поддерживает его, а аудиодекодер не так, это 3 потока - 1 основной поток + 2 потока для декодирования видео.

Аналогично, установка вывода «thread N» позволяет многопоточную фильтрацию и кодирование, которые могут порождать N дополнительных потоков для каждого фильтра (я думаю, что в старых версиях ffmpeg это было «до N потоков на каждый фильтр») и каждый кодировщик, который поддерживает его.Существует также одно важное предостережение - это касается только кодеров, которые осуществляют управление потоками через ffmpeg; libx264 этого не делает - он пересылает запрашиваемый поток потока в библиотеку x264, которая выполняет собственное управление потоками. x264 затем может создавать до 2 * N потоков (точное число зависит от многих параметров кодирования). Итак, для «потоков 2» с одним выходом вы получите 1 основной поток + 2 потока для масштабирования + по крайней мере 2 потока для libx264. Это все еще не соответствует num_outputs * (1 + num_threads) поведению, которое вы видите, и мне было бы интересно узнать, откуда возникают дополнительные потоки, но, надеюсь, мой ответ объясняет, почему опция «threads 2» не увеличивает количество потоков на 2.

 Смежные вопросы

  • Нет связанных вопросов^_^