2

Я использую следующую команду для преобразования формата M4A в mp3

ffmpeg -i audio.m4a -acodec libmp3lame audio.mp3

У меня 32 ядра x86, однако libmp3lame обрабатывает в одном потоке. Я знаю, что libmp3lame не поддерживает многопоточность, поэтому я открыт для других альтернатив, которые могут быть выполнены в Ubuntu CLI.

Если audio.m4a - это видео продолжительностью 2 часа, это обычно занимает> 3 минуты, а скорость составляет от 45x до 50x.

Моя основная цель - за несколько секунд конвертировать несколько видео на YouTube.

Обновление 1:

Поскольку я использую 32-ядерный процессор, при конвертации видео используется только одно ядро. Так что в тех случаях, как использовать несколько ядер, чтобы получить вывод быстрее. Я хочу добиться максимума от процессора. Также, если FFmpeg не является ответом, есть ли другой способ.

3 ответа3

3

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

Например, если вы находитесь в оболочке:

ffmpeg -i input1.mp4 -c:a libmp3lame output1.mp3 &
ffmpeg -i input2.mp4 -c:a libmp3lame output2.mp3 &
…

& Ставит команду на задний план. Команды будут выполняться параллельно, а нагрузка должна быть распределена между ядрами вашего процессора.

3

GNU Parallel звучит точно так же, как вы ищете.

Вот пример того, как вы можете использовать GNU Parallel (при условии, что у вас уже есть каталог со всеми вашими файлами *.m4a именем videos), используя ваши оригинальные команды:

find /path/to/videos -name "*.m4a" | parallel 'ffmpeg -i {} -acodec libmp3lame {.}.mp3'

Две вещи, чтобы объяснить:

1: Вывод команды find (т. Е. Список файлов .m4a для преобразования) будет передан в parallel команду, которая в свою очередь (по умолчанию) выполнит столько заданий, сколько имеется ядер. По сути, он разделяет выходные данные команды find и распределяет их между различными заданиями для работы.

2: Согласно GNU Parallel Tutorial, {} - это то место, куда пойдут ваши аргументы, {.} Подставит ваши аргументы и удалит расширение терминала (в данном случае .m4a), и ваши выходные данные будут иметь исходное имя файла, но с расширение .mp3 .

ПРИМЕЧАНИЕ . В этом примере все ваши преобразованные файлы будут записаны в исходные файлы. Если это проблема, просто передайте каталог для хранения преобразованных файлов в строке аргумента, содержащей команду ffmpeg:

find /path/to/videos -name "*.m4a" | parallel 'ffmpeg -i {} -acodec libmp3lame /path/to/converted/vids/{.}.mp3'
1

В интернете есть многопоточные реализации хромого mp3-кодировщика. Я мог бы отследить один здесь

https://github.com/dheller1/lame_pthreads

Если у вас большой объем памяти, вы можете использовать ffmpeg для преобразования всех файлов m4a в файлы wav, а затем указать lame_pthreads на эту папку.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .