Можно ли узнать продолжительность MP3 до загрузки всего файла?

Это вопрос о формате файлов MP3.

Я искал способ получить продолжительность MP3. Поскольку я использую JLayer SPI для декодирования MP3, я обнаружил, что это возможно, когда источником звука является файл.

AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(source);
Long microseconds = (Long) fileFormat.properties().get("duration");
System.out.println(microseconds);

Однако, когда я беру аналогичный код и тот же MP3 и меняю источник на URL-адрес, JLayer не предоставляет продолжительность:

AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(source.toURI().toURL());
Long microseconds = (Long) fileFormat.properties().get("duration");
System.out.println(microseconds);

Это важное различие, потому что часть музыки, которую я хочу воспроизвести, будет получена из URL-адресов, а не из локальных файлов.

Подозреваю, что это связано с ограничениями формата файла.

Это приводит меня к очень простому вопросу. Можно ли узнать продолжительность MP3 до того, как весь файл будет загружен?


person Philip Couling    schedule 24.02.2015    source источник


Ответы (2)


Ответ - нет. Формат файла mp3 не имеет никакой информации о продолжительности файла. Чтобы вычислить продолжительность, вам нужно разделить длину файла на скорость передачи данных. Это также объясняет поведение вашей библиотеки. В качестве обходного пути, если у вас есть контроль над файлами на сервере, вы сможете встроить продолжительность в тег id3.

person jaket    schedule 24.02.2015
comment
To compute the duration you would need to divide the length of the file by the bit rate. Я предполагаю, что этот метод не работает, когда у вас есть mp3 с переменным битрейтом (как и большинство в наши дни). - person Philip Couling; 25.02.2015
comment
Файлы VBR обычно имеют заголовок, который включает общую длину файла (в кадрах; 1152 выборки на кадр, кроме MPEG2, в этом случае это 576). Ищите заголовки форматов Xing и VBRI (они помещаются во вспомогательные данные первого кадра MPEG...). - person ioctlLR; 26.02.2015

Да, для CBR (постоянный битрейт) вам необходимо загрузить фрагмент размером около 1-2 МБ* (должен быть больше, чем размер id3 ниже)

В заголовке обычно можно найти всю длину файла:

Длина содержимого: 30079584

Следующим шагом будет получение битрейта аудио и размера ID3 из этого фрагмента (с помощью exiftoolссылка)

Например:

...
Битрейт аудио: 272 кбит/с
Размер ID3: 115419
...

А затем просто используйте эту формулу (пример):

(30079584 - 115419) / (272 * 1000 / 8)

~ 881 секунд

где '* 1000 / 8' - преобразование кбит в байт (https://en.wikipedia.org/wiki/Bit_rate)

person IvanM    schedule 13.04.2018
comment
Если я вас правильно понял, вы предлагаете предполагать постоянный битрейт, и вы ничего не можете сделать, чтобы проверить, действительно ли битрейт постоянен. - person Philip Couling; 14.04.2018