2009-06-02 2 views
14

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

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

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

ответ

26

От documentation for 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 for AudioFormat для получения дополнительной информации.)

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

+0

Hi Jon, Спасибо за ваш быстрый ответ! В вашем предложении; «decodedFormat» - представление mp3-данных, декодированных в другом формате? если я напишу «din.read()», я получаю байты данных в декодированном формате? Thanks – dedalo

+0

Да. Этот decodedFormat говорит: «Я хочу, чтобы вы расшифровали как подписанные данные PCM». –

+0

Привет. Я следил за вашими советами, и это сработало. Чтобы визуализировать данные, которые я использую: while ((numBytesRead = din.read (audioBytes))! = -1) {} Это считывает байты в 'din' и сохраняет их в массиве audioBytes. Я попытался визуализировать данные, используя: while ((numBytesRead = din.read (audioBytes))! = -1) { System.out.println ("Bytes Decoded value" + audioBytes [0]);} У меня есть вопрос об этих данных: Каждый образец использует 16 бит, это 2 позиции в массиве audioBytes, rigth? Как я могу получить значение каждого образца? Имеет ли декодированный формат (wav) 44 байта заголовка? Большое спасибо за вашу помощь! – dedalo

0

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

0

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

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

Смежные вопросы