2012-02-06 2 views
1

내 질문은 간단합니다. mp3 파일에서 PCM 데이터를 얻으려면 어떻게해야합니까?안드로이드의 mp3 파일에서 pcm 데이터를 얻으십시오

이제 노래에서 PCM 바이트를 얻는 방법을 찾았습니다. MediaPlayer에 의해 mp3 파일을로드하고 재생했으며, 변경된 파일을 Visualizer.OnDataCaptureListener (으)로 시도했습니다. 이 인터페이스의 메서드는 byte[] bytes 매개 변수를 전달합니다. 이 모든 바이트를 1 바이트 배열에 저장하려고 시도한 다음이 배열을 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에서 PCM 데이터를 가져 오는 일반적인 방법이 있다면 말할 수 있습니까?

+1

이 문제와 관련된 해결책을 공유 할 수 있습니까? – Karthik

답변

3

MP3를 디코딩 할 때 mpg123 기본 라이브러리를 사용하고 있습니다. PCM 데이터를 바이트가 아닌 단편으로 디코딩합니다. 나는 당신이 전환을 할 수 있다고 확신합니다. 디코더는 NDK를 사용하기 때문에 매우 빠릅니다. 또한

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

,

나는 파일이 얼마나 큰 확실하지 오전하지만 대신에 하나 개의 큰 배열에 전체 노래를 넣어의 AudioTrack에 바이트를 스트리밍 할 것입니다.

+0

예, 스트리밍 할 것이고, 테스트 용으로 바이트 변수를 사용했습니다. 그리고 나는 이미 해결책을 찾았고, 나는 대답을했다. 재생 해줘서 고마워! – pleerock

+2

@pleerock : 솔루션을 공유 하시겠습니까? 나는 안드로이드 애플 리케이션에서 성공없이 PCM 스트림을 얻기 위해 몇 주 동안 노력 해왔다 ... –

관련 문제