Добавьте тишину в конец MP3
Кто-нибудь из вас знает способ добавления тишины фиксированной длительности в конец MP3 в Linux? Например, используя MEncoder, FFmpeg и т. Д.?
Это должна быть командная строка, так как она будет написана и запущена на нашем сервере.
Я гуглил это, и лучшее, что я мог сделать, это использовать pad
функция в SoX, но это не будет работать с MP3.
Я мог бы преобразовать его в WAV, использовать SoX, затем снова преобразовать его в MP3 и скопировать метаданные (за вычетом продолжительности) из оригинала в новый MP3. Но прежде чем написать сценарий для этого, я подумал, что смогу найти решение с одним ударом.
2 ответа
Вы можете сделать это легко с SoX pad
аргумент и следующий синтаксис:
sox <oldfile> <newfile> pad <silence at beginning of file> <silence at end of file>
Пример:
sox mp3.mp3 mp3withsilence.mp3 pad 0 1
Это молчание в считанные секунды. (Другие применения возможны с использованием другого синтаксиса, чтобы вставить эти молчания в определенные позиции. Для получения дополнительной информации см. Документацию SoX.)
С помощью 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
в любое время в секундах, которые вы предпочитаете. Конечно, вам нужно только генерировать тишину один раз, затем вы можете сохранить файл и использовать его для заполнения каждого файла, который вы хотите. You may also want to look up the concat demuxer - it's slightly more processor-intensive, but you may find it easier to drop into a shell script.
If you want to do it in a single command, you can use the concat filter - this will require you to re-encode your audio (since filtergraphs are incompatible with -codec copy
), so the option above will probably be best for you. But this may be useful for anyone working with raw PCM, looking to add silence to the end before encoding the audio:
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
Control the length of the silence by changing d=10
to whatever time (in seconds) you want. If you use this method, you may find this FFmpeg MP3 encoding guide useful.