Додайте тишу в кінці 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

це дуже здорово - дякую Фабієн!
Макс Вільямс

Це без втрат?
Геремія

Оновлення: я прочитав на сторінці sox, що вона перетворюється на внутрішній формат, після чого перекодує…
Geremia

MP3 - це формат втрат. Кодування та повторне кодування до формату втрати поступово погіршить якість звуку (чи ви його чуєте чи ні.) Як таке, найкраще працювати з форматами без втрат і кодувати до формату втрати лише в кінці. Для списку втрачених аудіокодеків: en.wikipedia.org/wiki/Lossy_compression#Audio та для списку аудіокодеків без втрат en.wikipedia.org/wiki/Lossless_compression#Audio
Fabien Snauwaert

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 - це зажадає від вас перекодування звуку (оскільки фільтри не сумісні -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. Я просто спробував це і отримав наступне - max-thinkpad-linux: ~ $ ffmpeg -filter_complex aevalsrc = 0 -t 4.61 тиша.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.
злий

Якщо це не працює, спробуйте оновити до новішої версії ffmpeg. Оскільки ви перебуваєте на Ubuntu, ви повинні мати можливість використовувати цей PPA , або для найновішої версії ви зможете скласти його з джерела .
злий

1
@MaxWilliams Або ви можете завантажити статичну збірку , яку не потрібно спочатку збирати. Просто завантажуйте, витягуйте, використовуйте.
slhck

1
для подальшої довідки: якщо ви зіткнулися з помилкою, як я, спробуйте замінити одинарні котирування подвійними лапками
SZT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.