2013-09-26 65 views
1

首先,如果不使用功能decode_path,我可以使用我的代碼播放.wav文件,並且它可以正常使用Jlayer和音軌來播放歌曲。將mp3解碼爲pcm,並在Google Android中使用audiotrack播放

其次,如果我使用功能decode_path它可以解碼mp3到pcm文件,並通過byte[]功能PlayAudioTrack,讓它播放。

問題是,我不知道我的代碼錯在哪裏,我用的是320Kbps,44.1Khz的立體聲型,Layer3的mp3,但是AudioTrack播放噪聲卻沒有音樂〜!!!!

任何人都可以嗎? ???

我的代碼

public void PlayAudioTrack(String filePath) throws IOException{ 
    int intSize = android.media.AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, 
    AudioFormat.ENCODING_PCM_16BIT); 

    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, 
    AudioFormat.ENCODING_PCM_16BIT, intSize, AudioTrack.MODE_STREAM); 

    //Reading the file.. 
    int count = 512 * 1024; // 512 kb 
    //  byte[] byteData = null;   
    //  byteData = new byte[(int)count]; 

    //we can decode correct byte data here 
    byte[] byteData = null; 
    byteData = decode_path(filePath, 0, 20000); 

    File file = null; 
    file = new File(filePath); 
    FileInputStream in = null; 

    try { 
     in = new FileInputStream(file); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    int bytesread = 0, ret = 0; 
    int size = (int) file.length(); 
    at.play(); 
    while (bytesread < size) { 
     Log.e("devon","write byte array with sizes"); 
     ret = in.read(byteData,0, count); 
     if (ret != -1) { 
      Log.e("devon","Write the byte array to the track"); 
      at.write(byteData,0, ret); 
      bytesread += ret; 
     }else break; 
    } 
    at.stop(); 
    at.release(); 
} 

public static byte[] decode_path(String path, int startMs, int maxMs) 
     throws IOException{ 
     ByteArrayOutputStream outStream = new ByteArrayOutputStream(1024); 

     float totalMs = 0; 
     boolean seeking = true; 

     File file = new File(path); 
     InputStream inputStream = new BufferedInputStream(new FileInputStream(file), 8 * 1024); 
     try { 
      Bitstream bitstream = new Bitstream(inputStream); 
      Decoder decoder = new Decoder(); 

      boolean done = false; 
      while (! done) { 
      Header frameHeader = bitstream.readFrame(); 
      if (frameHeader == null) { 
       done = true; 
      } else { 
       totalMs += frameHeader.ms_per_frame(); 

       if (totalMs >= startMs) { 
       seeking = false; 
       } 

       if (! seeking) { 
       SampleBuffer output = (SampleBuffer) decoder.decodeFrame(frameHeader, bitstream); 

       if (output.getSampleFrequency() != 44100 
        || output.getChannelCount() != 2) { 
        throw new IllegalArgumentException("mono or non-44100 MP3 not supported"); 
       } 

       short[] pcm = output.getBuffer(); 
       for (short s : pcm) { 
        outStream.write(s & 0xff); 
        outStream.write((s >> 8) & 0xff); 
       } 
       } 

       if (totalMs >= (startMs + maxMs)) { 
       done = true; 
       } 
      } 
      bitstream.closeFrame(); 
      } 

      return outStream.toByteArray(); 
     } catch (BitstreamException e) { 
      throw new IOException("Bitstream error: " + e); 
     } catch (DecoderException e) { 
      Log.w(TAG, "Decoder error", e); 
      throw new IOException("Decoder error: " + e); 
     } 
     } 
+0

你有使用'AudioTrack'?如果您使用[MediaPlayer](http://developer.android.com/reference/android/media/MediaPlayer.html)類,它將爲您處理解碼。 – Michael

+0

你好,我知道。但我需要一個從MP3獲取PCM,我只是想檢查我的解碼器是否正確。 – Devon

+0

的主要目的是做一個可以得到PCM流的mp3解碼器。 – Devon

回答

-3
public void PlayAudioTrack(String filePath) throws IOException{ 
    int intSize = android.media.AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, 
      AudioFormat.ENCODING_PCM_16BIT); 

    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, 
      AudioFormat.ENCODING_PCM_16BIT, intSize, AudioTrack.MODE_STREAM); 

    //Reading the file.. 
    int count = 512 * 1024; // 512 kb 
    //  byte[] byteData = null; 
    //  byteData = new byte[(int)count]; 

    //we can decode correct byte data here 
    byte[] byteData = null; 
    byteData = decode_path(filePath, 0, 20000); 

    int temp =0; 
    at.play(); 
    while (temp<byteData.length) 
    { 
     at.write(byteData, temp, count); 
     temp+= count; 
    } 
    at.stop(); 
    at.release(); 
} 
+0

你可以加一些簡短的解釋,所以OP不但可以解決問題,還可以理解答案? –

相關問題