2012-02-06 2 views
1

Мой вопрос прост. Как получить данные PCM из mp3-файла?получить pcm данные из mp3-файла в android

Теперь я нашел только способ получить байты PCM из песни, загрузил и воспроизвел mp3 MediaPlayer и попытался прослушать изменение волн на Visualizer.OnDataCaptureListener. Этот метод интерфейса передает параметр byte[] bytes. Я попытался сохранить все эти байты в один байтовый массив, а затем передал этот массив методу AudioTrack.write и воспроизвел его методом AudioTrack.play. Что-то вроде этого:

mVisualizer.setDataCaptureListener(new Visualizer.OnDataCaptureListener() { 
       public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, 
         int samplingRate) { 
         // allBytes += bytes 
       } 
     public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) { 
       } 
, Visualizer.getMaxCaptureRate()/2, true, false); 
    } 

, а затем

AudioTrack tr = new AudioTrack(AudioManager.STREAM_MUSIC, 22050, 
           AudioFormat.CHANNEL_OUT_STEREO, 
           AudioFormat.ENCODING_PCM_16BIT, 
           allBytes.length, AudioTrack.MODE_STREAM); 
tr.play(); 
tr.write(barr, 0, allBytes.length); 

Но, к сожалению, я не получил ожидаемых результатов. Звук играет, но в звуке много шума, качество настолько плохое, что вы не можете определить, что там поет.

Но это было своего рода «метод взлома» для получения данных ИКМ. Можете ли вы сказать, есть ли нормальный метод получения данных PCM из моего mp3?

+1

Вы можете поделиться решением проблемы, которую обнаружили для этой проблемы. – Karthik

ответ

3

Я использую родную библиотеку mpg123 для декодирования своего MP3. Он был декодирован в данные PCM в шортах, а не в байтах. Я уверен, что вы можете сделать конверсии. Декодер очень быстрый, так как он использует NDK.

http://www.badlogicgames.com/wordpress/?p=446

Кроме того,

Я не уверен, насколько большой ваши файлы, но я бы поток байтов минуте AudioTrack вместо того, чтобы поместить всю песню в одном большом массиве.

+0

да, я бы потоковал его, я использовал байтовую переменную только для теста. И я уже нашел решение, я положил свой ответ. Спасибо за повтор! – pleerock

+2

@pleerock: Не могли бы вы поделиться своим решением? Я несколько недель пытаюсь получить поток PCM из приложений Android без успеха ... –

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