2016-03-26 266 views
0

我使用以下定義創建AudioTrack。audioTrack.stop不會停止播放音頻

audioTrack = new AudioTrack(
          AudioManager.STREAM_MUSIC, 
          44100, 
          AudioFormat.CHANNEL_OUT_MONO, 
          AudioFormat.ENCODING_PCM_16BIT, 
          buffer.length * 2, 
          AudioTrack.MODE_STATIC); 

audioTrack.write(buffer, 0, buffer.length); 
        audioTrack.setPositionNotificationPeriod(500); 
        audioTrack.setNotificationMarkerPosition(buffer.length); 
        progressListener = new PlaybackProgress(buffer.length); 
        audioTrack.setPlaybackPositionUpdateListener(progressListener); 

當audioTrack結束時,會調用以下內容來停止音頻並重置頭部位置。

private void resetAudioPlayback() { 
     ViewGroup.LayoutParams params = playbackView.getLayoutParams(); 
     params.width = 0; 
     playbackView.setLayoutParams(params); 
     audioTrack.stop(); 
     audioTrack.reloadStaticData(); 
     playImage.animate().alpha(100).setDuration(500).start(); 
    } 

上面的代碼在Android 5.1中工作得很好。但是我遇到了4.4.4的問題。 audioTrack.stop()被調用,但音頻不會停止,因爲reloadStaticData將音頻倒回到起始位置,它將重放音頻。但使用5.1時,它會正確停止,並將緩衝區重置回播放開始,並且按下播放按鈕時,從開始播放。

有人可以幫我我怎麼可以這個問題與Android 4.4.4?

回答

0

我不完全確定這是否能解決您的問題,但請考慮使用pause()而不是stop()。通過文檔,MODE_STREAM的stop()實際上將繼續播放寫入的最後一個緩衝區的其餘部分。您正在使用MODE_STATIC,但它可能值得嘗試。另外(可能不相關),考慮write()返回的是寫入的字節數,所以你不應該依賴每次填充整個AudioTrack緩衝區的單個寫操作。 write()應該像OutputStream寫入一樣對待,因爲它可能不會寫入它給出的緩衝區的全部內容,所以最好編寫一個循環並檢查每次調用write()時已寫入了多少內容,然後繼續從緩衝區陣列中的新索引寫入,直到所有寫入的總和等於緩衝區的長度。

+0

實際上,我已經嘗試過了,audioTrack.pause和flush,事情是我們調用reloadStaticData來回放曲目併爲下一次播放做好準備。在這裏,如果我調用暫停和刷新,reloadStaticData不倒帶音頻。 – User