У меня есть набор файлов MP3 что я хотел бы удалить последние 4 секунды. Я знаю, что если я знаю длительность каждого файла, я могу:
ffmpeg -t ${1} -i inputfilename -acodec copy -vcodec copy outputfilename
Где $ 1
- это продолжительность файла минус 4 секунды.
Мне бы очень хотелось чего-нибудь, что бы просто отбивало последние 4 секунды, независимо от длины файла. «Стоп за 4 секунды до EOF».
Примечание: я изо всех сил пытался понять эту командную строку, если есть более простая версия, мне нравится ее видеть.
Вы можете использовать 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
Иногда при работе с аудиофайлами, а не аудио плюс видео, более тонким приложением, чем 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, если вам нужно более сложное использование...
Адаптировано из Вырезать видео с помощью 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
Он использует один и тот же вход дважды в обходной манере для обрезки без необходимости знать продолжительность и без перекодирования.
-shorst
использует самую короткую входную длительность для определения длительности выходных данных. Это приводит к отсечению последних 4 секунд от первого ввода, чтобы соответствовать продолжительности усеченного второго ввода. -shortest
, они направляются в другой ffmpeg для удаления второго ввода.