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

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

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

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

Ответы

Ответ 1

В документации для 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. (Дополнительную информацию см. В docs для AudioFormat.)

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

Ответ 2

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

Ответ 3

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

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