Как изменить настройки ffmpeg -threads

14

Работа на трубке сайта. Я запускаю видео через ffmpeg на выделенном сервере Linux для преобразования в mp4 .

Спецификации сервера:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Stepping:              3
CPU MHz:               3491.749
BogoMIPS:              6983.49
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7

Проблема во время тестирования заключается в том, что даже при выполнении 4-5 раз сервер загружается в среднем до 36. Это всего лишь один человек. Я представляю, когда он откроется, многие люди будут загружать сразу.

Кажется, ffmpeg пытается использовать все ресурсы, доступные для конвертации.

Я слышал, что есть настройки нитей, которые вы можете изменить, но я не могу их найти. У меня сервер на 8 процессоров. Он используется только для конверсий, поэтому я слышал, что лучшая настройка будет между 2 и 4. Я могу проверить это.

Но как мне изменить этот параметр? Все, что я вижу в Интернете, обсуждает этот параметр, но не шаги по его изменению.


источник

Ответы:

17

Опциональный флаг, который вы хотите, действительно прост, -threadsи вы бы использовали его так (только для одного потока):

ffmpeg -i somefile.wmv -c:a libfdk_aac -c:v libx264  -threads 1 transcoded.mp4

Однако есть немало тонкостей, которые увеличат нагрузку на сервер и время операций, таких как изменение масштаба, применение фильтров и окончательное качество кадров / частота кадров - не говоря уже о том, что некоторые архитектуры виртуальных машин фактически читают и записывают все дважды (один раз изначально) и один раз виртуально !!!)

Вот несколько советов, чтобы ускорить вашу работу:

  1. использовать очередь, чтобы за один раз транскодировался только один элемент
  2. запрашивать файлы меньшего размера у ваших пользователей
  3. использовать всю мощность вашей машины:
    • чтение и запись с виртуального диска
    • переход на голое железо для задач перекодирования
    • использование -threads 0

Что бы вы ни делали, держите своих пользователей в курсе процесса транскодирования, потому что это просто занимает время. (IJTT)

[отредактированная команда, чтобы отразить комментарий LordNeckbeard]

denjello
источник
10
Вариант размещения имеет значение. С -threadsперед входом вы подаете эту опцию входа (Декодер). Обобщенное использование есть ffmpeg [global options] [input options] -i input [output options] output.
Llogan
Так где бы вы предложили разместить его? Я думал, что вначале он применяется во всем мире?
denjello
3
Как опция вывода, так что она становится опцией кодирования. См. Документацию FFmpeg, чтобы узнать, какие опции помечены как (global).
Llogan
имеет ли значение, если вы положили -threadsаргумент до или после -iаргумента? Кроме того, как я должен определить, сколько потоков я должен использовать? Я в основном просто делаю-c copy
Чови
3

Это может быть немного старым, но это звучит как идеальная задача для контейнера, как докер.

  • Пусть ffmpeg работает с full horsepower(как назвал это denjello)
  • но пусть он работает внутри докера

Теперь вы можете ограничить объем ресурсов, которые может потреблять один экземпляр ffmpeg, даже не используя параметры командной строки ffmpeg. И не только процессор, но и память и IO.

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

См. Https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources.

На github уже есть предопределенное изображение ffmpeg: https://github.com/jrottenberg/ffmpeg

docker run jrottenberg/ffmpeg \
        -i http://url/to/media.mp4 \
        -stats \
        $ffmpeg_options  - > out.mp4

Вероятно, одно преобразование будет выполняться медленнее из-за накладных расходов, но если вы одновременно запускаете несколько экземпляров, это может быть огромным преимуществом. Все это очень хорошо масштабируется, не говоря уже об улучшенной безопасности, потому что каждая задача изолирована от базовой ОС.

Юрген Стейнблок
источник
Разве это не немного экстремально запускать его в докере? Есть буквально много других более эффективных способов использования ограничения процессора на Linux scoutapm.com/blog/...
yurtesen
Почему? Предположим, что у вас уже установлен докер, запуск контейнера с --rmфлагом для выполнения задачи и удаление контейнера после выхода - совершенно обычная вещь, которую администраторы могут и должны сделать в 2019 году. Особенно для таких вещей, как конвертация документов. Преобразование не удается? Попробуйте другую версию конвертера без обновления / понижения вашей локальной цепочки инструментов? Вы не доверяете документу, потому что он был загружен из Интернета? Изолируйте задачу в контейнере. Ffmpeg не является исключением. cvedetails.com/vulnerability-list/vendor_id-3611/Ffmpeg.html
Юрген Стейнблок
Это звучит как маркетинговый разговор. Докер не идеален, как вы сказали -> techbeacon.com/security/… В Linux обычный пользователь также имеет ограниченный доступ и безопасность системы. Необходимость понижения версии программы встречается очень редко и может быть осуществлена ​​через репозиторий. Многие изображения докеров сделаны случайными людьми. Возможно, изображение докера конвертера документов было скомпрометировано и отправлено копия всех ваших документов на удаленный сервер. Итак, использование docker-изображений увеличивает вероятность такой уязвимости. Что тогда?
юртесен
Perhaps the document converter docker image was compromised and sent copy of all your documents to a remote server. So, using docker images increase possibility such vulnerability. What then?Оформите репозиторий, изучите докер-файл и используйте его docker build -t myimageдля создания локального образа. Или создайте свой собственный докер-файл, это не ракетостроение github.com/alfg/docker-ffmpeg/blob/master/Dockerfile
Юрген Стейнблок