Получить длину MP3 в Linux / FreeBSD


27

У меня есть куча mp3-файлов различной длины. Я хочу сократить его до 50% -60% длины. Говорит от 1 минуты до 30 секунд. Это должно быть тривиально, используя ffmpeg. Но я не знаю, как определить его исходную длину в качестве основы для обработки с использованием ffmpeg.

У кого-нибудь есть идея?

Ответы:


31

С ffmpeg я не знаю, как получить длину в виде переменной, которую вы можете использовать в скрипте. Но mp3info делает.

mp3info -p "%S" sample.mp3   // total time in seconds

да, нет способа получить информацию о длине в ffmpeg. Я уже говорил, я использую ffmpeg только после того, как получу длину. Во всяком случае, спасибо за головы UP.
Ariefbayu

4
Стоит отметить, что это обеспечивает только длину в виде целого числа. Так что может быть недостаточно точным для некоторых случаев использования.
Росс

Лучший ответ, так как он работает даже со средним или переменным битрейтом MP3!
KrisWebDev

1
Добавить \nдля печати новую строку также. > mp3info -p "%S\n" sample.mp3 // общее время в секундах
nexayq

22

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

3
$ ffmpeg -i foo.mp3 2> & 1 | awk '/ Duration / {print substr ($ 2,0, length ($ 2) -1)}' Только для части времени
Крейг Татарин

Чтобы суммировать длину набора файлов MP3, вы можете использовать что-то вроде TOTLENGTH=0; for f in *.mp3; do LENGTH=$(mplayer -ao null -identify -frames 0 "$f" 2>&1 | awk -F= '/ID_LENGTH/ {print $2}' | awk -F. '{print $1}'); TOTLENGTH=$(($TOTLENGTH + $LENGTH)); done; echo $TOTLENGTHпечати общей длины аудио во всех файлах в секундах. Возможно, это можно сделать более эффективно, но, поскольку я написал его как разовый, это было достаточно для моих нужд. (Второй вызов awk удаляет десятичные дроби, поэтому результат не на 100% точен, но, опять же, достаточно хорош для моих нужд.)
CVn

Остерегайтесь флага ffmpeg -analyzeduration. В основном, числа, которые он сообщает, являются оценками после определенного момента для экономии ресурсов процессора.
mlissner

Используя MP3 со средним битрейтом, ffmpeg сообщает о неправильной длительности вместе с этим предупреждением Estimating duration from bitrate, this may be inaccurate. Я думаю, что этот ответ действителен только с постоянным битрейтом MP3.
KrisWebDev

9

Интересно, что приложение 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 (приблизительно)

3

Просто еще один способ получить продолжительность, используя 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

2

Используемые решения ffmpegкажутся мне немного хрупкими, поскольку они анализируют выходные данные, которые не совсем предназначены для интерфейса. Тем не менее, они, вероятно, будут продолжать работать в течение нескольких лет независимо.

ffmpegпоставляется с инструментом ffprobeдля получения информации об аудиофайлах (множество форматов, в том числе mp3), и может выдавать машиночитаемый вывод. Следующая команда получает длительность песни.

ffprobe -show_streams -print_format json song.mp3 -v fatal | jq '.streams[0].duration'

2
Вы можете просто сделатьffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
Гьян

1

Я лично использую Mplayer для извлечения информации, в основном потому, что у меня она уже установлена, и я не могу без необходимости устанавливать новое программное обеспечение. Преимущество этого заключается в том, что он не ограничивается, в частности, mp3-файлами, и должен работать с любым медиа-файлом, который может обрабатывать Mplayer. Следующая строка будет возвращать длину трека в секундах.

mplayer -identify -ao null -vo null -frames 0 Filename.mp3 | grep ^ID_LENGTH= | cut -d = -f 2

1

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

ffmpeg -i <infile> 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//

0

У меня была та же проблема, и я обнаружил, что команда mplayer (goldPseudo) работает хорошо, но впоследствии я обнаружил, что если вы откроете альбом в RhythmBox, вы увидите, что в его строке состояния указано количество дорожек, общее время воспроизведения и размер диска.


-1

Вот мое простое использование выше.

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

Спасибо выше людей! Я использую ваши идеи и знания Спасибо за чтение, Хорошего дня! ;)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.