2014-02-15 53 views
2

我工作的這是使用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球員最好的辦法?

回答

1

你試過定時解碼和audioTrack.write功能,看看是什麼阻礙了你的異步任務是什麼?我不認爲audioTrack.write會是問題。

我對JLayer的經驗是,它對於實時解碼可能太慢,特別是在使用CD質量音頻(立體聲,44.1kHz採樣率)時尤其如此。

如果你能提高你的基地SDK,媒體編解碼器可能是一個很好的路要走:http://developer.android.com/reference/android/media/MediaCodec.html

您還可以查看使用openSL ES實現您的音頻。這篇文章涉及的一些Android的音頻節目的挑戰和解決方案:Android audio programming nightmare - soundpool, audiotrack arrghh?

+0

我同意SpinalTapFan11。嘗試計時您的JLayer解碼方法。目前我正在與JLayer和AudioTrack合作,有兩件事情對我來說工作順利。 1)保持您的解碼調用接近AudioTrack最小緩衝區大小。 2)雙緩衝的解碼後的音頻(保持第二解碼緩衝器準備寫,你寫後交換他們/重複)。如果你在寫代碼的時候把你的解碼器放在同一個異步循環中,你的代碼會變得更加棘手,但是你可以保留幾倍的最小緩衝區大小,爲下次寫入做好準備。 – timmyl