Как удалить последний 4 секунды файла MP3?

У меня есть набор файлов MP3 что я хотел бы удалить последние 4 секунды. Я знаю, что если я знаю длительность каждого файла, я могу:

ffmpeg -t ${1} -i inputfilename -acodec copy -vcodec copy outputfilename

Где $ 1 - это продолжительность файла минус 4 секунды.

Мне бы очень хотелось чего-нибудь, что бы просто отбивало последние 4 секунды, независимо от длины файла. «Стоп за 4 секунды до EOF».

Примечание: я изо всех сил пытался понять эту командную строку, если есть более простая версия, мне нравится ее видеть.

10
задан 22 July 2021 в 19:29

3 ответа

Вы можете использовать ffprobe , который должен идти с ffmpeg , чтобы получить продолжительность.

dur=$(($(ffprobe -loglevel error -show_entries format=duration -of default=nk=1:nw=1 inputfilename | xargs printf %.0f)-4))
ffmpeg -t ${dur} -i inputfilename -c copy outputfilename

В первой строке используется ffprobe , чтобы получить продолжительность минус 4 секунды, а затем помещается в переменную с именем dur .

Я также использовал xargs для округления числа, потому что bash принимает только целые числа при выполнении математических операций.

Вы можете использовать bc , если вам нужна большая точность.

dur=$(ffprobe -loglevel error -show_entries format=duration -of default=nk=1:nw=1 inputfilename)
dur=$(bc <<< ${dur}-4)
ffmpeg -t ${dur} -i inputfilename -c copy outputfilename
2
ответ дан 28 July 2021 в 11:16

Иногда при работе с аудиофайлами, а не аудио плюс видео, более тонким приложением, чем FFmpeg, является SoX. Установите полнофункциональный SoX на Ubuntu следующим образом:

sudo apt-get install sox libsox-fmt-all

А чтобы обрезать 4 секунды с конца вашего mp3 файла, необходимо выполнить следующую очень простую команду:

sox input.mp3 output.mp3 trim 0 -4

В этом примере '0' - это начальная позиция в начале файла, а '-4' определяет конечную позицию нужного сегмента: 4 секунды от конца.

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

sox input.mp3 output.mp3 trim 2

В этом примере конечная позиция не требуется. В SoX man pages содержится множество примеров использования команды trim, если вам нужно более сложное использование...

5
ответ дан 28 July 2021 в 11:16

Адаптировано из Вырезать видео с помощью ffmpeg :

ffmpeg -i input.mp3 -ss 4 -i input.mp3 -c copy -map 0:a -map 1:a -shortest -f nut - | ffmpeg -y -f nut -i - -c copy -map 0:0 output.mp3

Он использует один и тот же вход дважды в обходной манере для обрезки без необходимости знать продолжительность и без перекодирования.

  1. Второй вход отсчитывается от начала на 4 секунды.
  2. Параметр -shorst использует самую короткую входную длительность для определения длительности выходных данных. Это приводит к отсечению последних 4 секунд от первого ввода, чтобы соответствовать продолжительности усеченного второго ввода.
  3. Поскольку оба потока необходимы для работы -shortest , они направляются в другой ffmpeg для удаления второго ввода.
5
ответ дан 28 July 2021 в 11:16

Другие вопросы по тегам:

Похожие вопросы: