Добавьте тишину в конец MP3

12

Кто-нибудь из вас знает способ добавления тишины фиксированной длительности в конец MP3 в Linux? Например, используя MEncoder, FFmpeg и т. Д.?

Это должна быть командная строка, так как она будет скриптоваться и запускаться на нашем сервере.

Я гуглил это, и лучшее, что я мог сделать, это использовать padфункцию в SoX , но это не будет работать с MP3.

Я мог бы преобразовать его в WAV, использовать SoX, затем снова преобразовать его в MP3 и скопировать метаданные (за вычетом продолжительности) из оригинала в новый MP3. Но прежде чем написать сценарий для этого, я подумал, что смогу найти решение с одним ударом.

Макс Уильямс
источник
2
Я думаю, что вы можете сделать что-то подобное с mp3DirectCut (только для Windows, но говорят, что он совместим с Linux под Wine), что позволяет избежать повторного сжатия звуковых данных. Если бы вы перешли на MP3 -> WAV -> MP3, вы бы сжимали уже сжатый MP3 поток данных, теряя при этом много качества.
Прорыв
Спасибо. Можете ли вы запустить программное обеспечение Windows через Wine из командной строки? Я бы предпочел по возможности избегать решений Wine, так как я не хочу устанавливать Wine на наш сервер.
Макс Уильямс
Хм, вы можете избежать винного маршрута, если у вас его еще нет. Само вино - довольно большая загрузка, намного больше чем мегабайт или два для простого инструмента сокращения / объединения MP3. Я уверен, что есть эквивалентное решение для Linux. Если я найду дополнительные инструменты, я обязательно сообщу вам.
Прорыв

Ответы:

9

Это легко сделать с помощью padаргумента SoX и следующего синтаксиса:

sox <oldfile> <newfile> pad <silence at beginning of file> <silence at end of file>

Пример:

sox mp3.mp3 mp3withsilence.mp3 pad 0 1

Это молчание в секундах. (Другие применения возможны с использованием другого синтаксиса, чтобы вставить эти молчания в определенные позиции. Для получения дополнительной информации см. Документацию SoX.)

Фабьен Снауварт
источник
Я должен отметить, что я проверил это нормально с файлами MP3 (с установленными libmad-0.dll и libmp3lame-0.dll соответственно для декодирования и кодирования MP3.) Насколько это возможно, я бы рекомендовал работать с форматом без потерь и конвертировать только в MP3 только в конце.
Fabien Snauwaert
это действительно круто - спасибо, Фабьен!
Макс Уильямс
Это без потерь?
Geremia
Обновление: я прочитал на man-странице sox, что он конвертируется во внутренний формат, а затем перекодирует…
Geremia
MP3 - это формат с потерями. Кодирование и перекодирование в формат с потерями будет постепенно ухудшать качество звука (независимо от того, слышите вы это или нет). Поэтому лучше всего работать с форматами без потерь и кодировать в формат с потерями только один раз, в конце. Список аудиокодеков с потерями: en.wikipedia.org/wiki/Lossy_compression#Audio и список аудиокодеков без потерь en.wikipedia.org/wiki/Lossless_compression#Audio
Фабьен Снауверт,
15

С помощью ffmpeg вы можете использовать фильтр aevalsrc для генерации молчания, а затем во второй команде использовать протокол concat, чтобы объединить их без потерь:

ffmpeg -filter_complex aevalsrc=0 -t 10 10SecSilence.mp3
ffmpeg -i "concat:input.mp3|10SecSilence.mp3" -c copy output.mp3

Вы можете контролировать длительность молчания, изменяя -t 10любое время в секундах, которое вы предпочитаете. Конечно, вам нужно только генерировать тишину один раз, затем вы можете сохранить файл и использовать его для заполнения каждого файла, который вы хотите. Возможно, вы также захотите посмотреть дематер concat - он немного более ресурсоемкий, но вам может оказаться проще перейти в скрипт оболочки.

Если вы хотите сделать это с помощью одной команды, вы можете использовать фильтр concat - для этого вам потребуется перекодировать аудио (так как с фильтрами несовместимы -codec copy), поэтому, возможно, вам подойдет вариант, описанный выше. Но это может быть полезно для любого, кто работает с необработанным PCM, и хочет до конца добавить тишину перед кодированием аудио:

ffmpeg -i input.mp3 \
-filter_complex 'aevalsrc=0::d=10[silence];[0:a][silence]concat=n=2:v=0:a=1[out]' \
-map [out] -c:a libmp3lame -q:a 2 output.mp3

Контролируйте длительность молчания, изменяя d=10на любое время (в секундах), которое вы хотите. Если вы используете этот метод, вы можете найти это руководство по кодированию MP3 FFmpeg полезным.

evilsoup
источник
спасибо @evilsoup. Я только что попробовал это и получил следующее - max-thinkpad-linux: ~ $ ffmpeg -filter_complex aevalsrc = 0 -t 4.61 silence.mp3ffmpeg version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers built on Nov 6 2012 16:51:33 with gcc 4.6.3 *** THIS PROGRAM IS DEPRECATED *** This program is only provided for compatibility and will be removed in a future release. Please use avconv instead. Unrecognized option 'filter_complex' Failed to set value 'aevalsrc=0' for option 'filter_complex'
Макс Уильямс
@max Прежде всего, вы на самом деле используете avconv из проекта libav - они являются форком FFmpeg, который Debian и Ubuntu используют вместо основного проекта, и они предоставляют урезанную версию ffmpeg. Попробуйте использовать avconvвместо этого - синтаксис должен быть таким же, просто замените ffmpegна avconv.
evilsoup
Если это не сработает, попробуйте перейти на более новую версию ffmpeg. Поскольку вы работаете в Ubuntu, вы должны иметь возможность использовать этот PPA или для самой последней версии вы можете скомпилировать его из исходного кода .
evilsoup
1
@MaxWilliams Или вы можете скачать статическую сборку , которую вам не нужно сначала компилировать. Просто скачайте, распакуйте, используйте.
Slhck
1
для справки в будущем: если вы сталкиваетесь ошибка как я, попробуйте заменить одиночные кавычки двойные кавычки
Szt