Как получить аудиоданные из MP3?

Я работаю над приложением, которое должно обрабатывать аудиофайлы. При использовании mp3-файлов я не уверен, как обрабатывать данные (данные, которые меня интересуют аудио байт, которые представляют то, что мы слышим).

Если я использую wav-файл, я знаю, что у меня есть заголовок 44 байта, а затем данные. Когда дело доходит до mp3, я читал, что они состоят из кадров, каждый кадр содержит заголовок и аудиоданные. Можно ли получить все аудиоданные из mp3-файла?

Я использую java (я добавил MP3SPI, Jlayer и Tritonus), и я могу получить байты из файла, но я не уверен в том, что представляют собой эти байты или как с ними обращаться.

3 ответов


С документация для MP3SPI:

File file = new File(filename);
AudioInputStream in= AudioSystem.getAudioInputStream(file);
AudioInputStream din = null;
AudioFormat baseFormat = in.getFormat();
AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
                                            baseFormat.getSampleRate(),
                                            16,
                                            baseFormat.getChannels(),
                                            baseFormat.getChannels() * 2,
                                            baseFormat.getSampleRate(),
                                            false);
din = AudioSystem.getAudioInputStream(decodedFormat, in);

затем вы просто читаете данные из din - это будут "сырые" данные согласно decodedFormat. (См. документы на AudioFormat для получения дополнительной информации.)

(обратите внимание, что этот пример кода не закрывает поток или что - то подобное-используйте соответствующие блоки try/finally как обычно.)


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


Как упоминалось в других ответах, вам нужен декодер для декодирования MP3 в обычные звуковые образцы.

одним из популярных вариантов было бы JavaLayer (LGPL).