我工作的這是使用JLayer庫解碼MP3文件(我需要訪問音頻樣本)和AudioTrack對象來發揮它的Android應用程序。我有這樣的東西:使用AudioTrack與JLayer解碼器
int timeMarker = 0;
int timeStep = 5000;
while (!isCancelled()) {
outSignalBuffer = decode(fileToPlay.getPath(), timeMarker, timeStep, bufferSize);
audioTrack.write(outSignalBuffer, 0, outSignalBuffer.length);
//publishProgress(outSignalBuffer);
timeMarker += timeStep;
}
此代碼被放置在我的自定義播放器創建AsyncTask。一般來說,我的解碼和寫入方法工作正常,因爲我聽到了聲音文件。問題是,我的聲音每5秒鐘就會頻繁地跳動(timeStep = 5000毫秒)。當我看到audioTrack.write(...)塊我的異步任務,所以在短暫的停頓,每次之後的步驟是通過等待從解碼方法導致引起的。
你有任何建議什麼是正確傳送outSignalBuffer寫的解碼方法來獲得流暢audioTrack球員最好的辦法?
我同意SpinalTapFan11。嘗試計時您的JLayer解碼方法。目前我正在與JLayer和AudioTrack合作,有兩件事情對我來說工作順利。 1)保持您的解碼調用接近AudioTrack最小緩衝區大小。 2)雙緩衝的解碼後的音頻(保持第二解碼緩衝器準備寫,你寫後交換他們/重複)。如果你在寫代碼的時候把你的解碼器放在同一個異步循環中,你的代碼會變得更加棘手,但是你可以保留幾倍的最小緩衝區大小,爲下次寫入做好準備。 – timmyl