Получить длину MP3 в Linux / FreeBSD
У меня есть куча mp3-файлов различной длины. Я хочу сократить его до 50%-60% длины. Говорит от 1 минуты до 30 секунд. Это должно быть тривиально, используя ffmpeg. Но я не знаю, как определить его исходную длину в качестве основы для обработки с использованием ffmpeg.
У кого-нибудь есть идея?
9 ответов
С ffmpeg я не знаю, как получить длину в виде переменной, которую вы можете использовать в скрипте. Но mp3info делает.
mp3info -p "%S" sample.mp3 // total time in seconds
ffmpeg
напечатает все, что он знает о файле, если вы не дадите ему никаких других аргументов. использование grep
вычеркнуть все, кроме "Длительности":
$ ffmpeg -i foo.mp3 2>&1 | grep Duration
Duration: 01:02:20.20, start: 0.000000, bitrate: 128 kb/s
Вы также можете использовать mplayer
, Grep для строки "ID_LENGTH=":
$ mplayer -ao null -identify -frames 0 foo.mp3 2>&1 | grep ID_LENGTH
ID_LENGTH=3740.00
Интересно, что приложение EXIFTool дает продолжительность MP3 в качестве последней строки!
$ exiftool somefile.mp3 Номер версии ExifTool: 7,98 Имя файла: somefile.mp3 Каталог: . Размер файла: 49 МБ Дата и время изменения файла: 2009:09:10 11:04:54+05:30 Тип файла: MP3 MIME Тип: аудио / MPEG Версия MPEG Audio: 2.5 Уровень аудио: 3 Аудио битрейт: 64000 Частота дискретизации: 8000 Режим канала: одноканальный MS Stereo: выключено Интенсивность стерео: выкл Флаг авторского права: Ложь Оригинальные медиа: True Акцент: нет ID3 Размер: 26 Жанр: Блюз Продолжительность: 1:47:46 (приблизительно)
Просто еще один способ получить продолжительность только с помощью ffmpeg
а также grep
:
# ffmpeg -i rara.mp3 2>&1 |grep -oP "[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{2}"
00:03:49.12
Решения, использующие ffmpeg
кажется мне немного хрупким, так как они анализируют вывод, который не совсем разработан как интерфейс. Тем не менее, они, вероятно, будут продолжать работать в течение нескольких лет независимо.
ffmpeg
поставляется с инструментом ffprobe
чтобы получить информацию об аудиофайлах (множество форматов, включая mp3), а также может выводить информацию на компьютере. Следующая команда получает длительность песни.
ffprobe -show_streams -print_format json song.mp3 -v fatal | jq '.streams[0].duration'
Вы можете использовать ffmpeg, чтобы получить длительность файла. Просто используйте:
ffmpeg -i <infile> 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//
Я лично использую Mplayer для извлечения информации, в основном потому, что у меня она уже установлена, и я не могу без необходимости устанавливать новое программное обеспечение. Преимущество этого заключается в том, что он не ограничивается, в частности, mp3-файлами, и должен работать с любым медиа-файлом, который может обрабатывать Mplayer. Следующая строка будет возвращать длину трека в секундах.
mplayer -identify -ao null -vo null -frames 0 Filename.mp3 | grep ^ID_LENGTH= | cut -d = -f 2
У меня была та же проблема, и я обнаружил, что команда mplayer (goldPseudo) работает хорошо, но впоследствии я обнаружил, что если вы откроете альбом в RhythmBox, вы увидите, что в его строке состояния указано количество дорожек, общее время воспроизведения и размер диска.
Вот мое простое использование выше.
mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'
10:47:15
Я отправляю это значение в переменную mp3_full_length
mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
read -r mp3_full_length <<< `ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'`
# I can use this variable for my own purpose!
echo $mp3_full_length
10:47:15
Спасибо выше людей! Я использую ваши идеи и знания Спасибо за чтение, Хорошего дня!;)