Здесь две подзадачи:
Первая проблема заключается в том, чтобы ваш интерфейс реагировал во время преобразования. Если преобразование может занять много времени, и у вас нет хорошего способа разбить его на небольшие куски (например, чтобы обрабатывать запросы между ними), то вам действительно нужно будет обрабатывать его асинхронно, действительно.
Так вы, вероятно, захотите создать хотя бы один рабочий поток для параллельной работы с основным потоком.
Вторая проблема - по-видимому, - сделать преобразование быстрым. Поскольку - как вы пишете - это задача, интенсивно использующая процессор, она может получить выгоду от дополнительных рабочих потоков. Это может означать:
2a. несколько потоков, работающих над одной задачей преобразования (в очереди), одновременно
2b. несколько потоков, каждый из которых работает над отдельными задачами преобразования одновременно
2 c. сочетание обоих.
Хорошая новость заключается в том, что вам действительно не придется беспокоиться о большей части этого самостоятельно, потому что a) ffmpeg уже использует многопоточность, где это возможно ( это зависит от используемого кода c! ), предоставляя вам готовое решение для 2a. И б), node-fluent-ffmpeg (или node-ffmpeg) уже предназначен для асинхронного вызова ffmpeg, решая, таким образом, задачу 1.
Единственный оставшийся вопрос - вы хотите убедиться, что запускать только одно задание ffmpeg за раз (в очереди) или запускать преобразования, как только они запрашиваются (2b / 2 c)? Последнее будет легче реализовать. Однако , это может привести к неприятностям, если одновременно выполняется много заданий. По крайней мере, каждое задание преобразования будет буферизовывать некоторые входные и некоторые выходные данные, и это может привести к проблемам с памятью,
. Здесь на экране появляется очередь. Вы захотите поместить задания в простую очередь и запустить их так, чтобы одновременно выполнялось не более n . Оптимальный n не обязательно будет 1, но вряд ли будет больше 4 или около того (опять же, поскольку каждое отдельное преобразование использует параллелизм). Вам придется немного поэкспериментировать с этим, помня, что ответ может отличаться от кода c до кода c.