2011-11-20 70 views
2

我在播放聲音的開始和結束處(從SD卡開始播放wav)獲得點擊。它必須是跟蹤緩衝區,但我不知道解決方案。另外,每當聲音播放時我都會創建一個新的,這是好的還是有更好的方法?有很多聲音播放一遍又一遍。下面是代碼:Android AudioTrack在開始和結束聲音時點擊

public void PlayAudioTrack(final String filePath, final Float f) throws IOException 
    { 

    new Thread(new Runnable() { public void run() { 
      //play sound here 
     int minSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT);   
      AudioTrack track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, 
      AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, 
      minSize, AudioTrack.MODE_STREAM); 

     track.setPlaybackRate((int) (44100*f)); 

    if (filePath==null) 
    return; 

    int count = 512 * 1024; 
    //Read the file.. 
    byte[] byteData = null; 
    File file = null; 
    file = new File(filePath); 

    byteData = new byte[(int)count]; 
    FileInputStream in = null; 
    try { 
    in = new FileInputStream(file); 

    } catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

    int bytesread = 0, ret = 0; 
    int size = (int) file.length(); 

    while (bytesread < size) { 
    try { 
     ret = in.read(byteData,0, count); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    track.play(); 
    if (ret != -1) { 
    // Write the byte array to the track 
    track.write(byteData,0, ret); bytesread += ret; 
    } 
    else break; } 

    try { 
     in.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } track.stop(); track.release(); 
    } 

     }).start(); 
     } 

非常感謝所有幫助

+0

我的音頻體驗不在Android上,但在寫入任何字節之前調用track.play()似乎很奇怪。你不應該先寫字節嗎? – AShelly

+0

不,你需要用play()打開audiotrack然後寫入它,因爲它的mode_streaming。我認爲它可能不會閱讀wav標題的權利或某事。 – user1033558

+0

wtf你認爲你在做ChrisWue嗎?編輯隨機帖子獲得徽章對任何人都不是很有幫助嗎?你至少可以試着回答...... – user1033558

回答

1

我在使用AudioTrack每個軌道的開始有這些相同的點擊。我通過關閉音軌音量,等待半秒鐘,然後恢復正常音量來解決這個問題。我不再有任何點擊。這是代碼的相關位。

at.play(); 
    at.setStereoVolume (0.0f, 0.0f); 

    new Thread (new Runnable(){ 
     public void run() { 
      try{ 
       Thread.sleep(500); 
      } catch (InterruptedException ie) { ; } 
      at.setStereoVolume (1.0f, 1.0f); 
     } 
    }).start(); 

    new Thread (new Runnable(){ 
     public void run() { 
      int i = 0; 
      try{ 
       buffer = new byte[512]; 
       while(((i = is.read(buffer)) != -1) && !paused){ 
        at.write(buffer, 0, i); 
        position += i; 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      if (!paused){ 
       parent.trackEnded(); 
      } 
     } 
    }).start(); 
} 
3

您是否也可能播放PCM波形文件標題?

每個PCM波形文件在文件的開頭都有一個小標題,如果播放該文件,則播放標題字節,這可能會導致點擊開始。

+1

事實上,這些44個字節的WAVE-header聽起來像是一個點擊,如果播放。當AT開始播放這樣的文件時,解決方案是跳過44個字節。 – Stan