2016-10-29 119 views
0

我試圖在Android中使用AudioTrack類播放原始聲音數據,我使用的是write方法,但我注意到寫入方法返回與實際聲音播放之間存在延遲,使其簡單讓我們用AudioRecord類爲以下psedu代碼:Android AudioTrack延遲播放

//init AudioTrack 
//init AudioRecord 
while(true){ 
    byte [] buffer = new byte[1000]; 
    int read = audioRecord(buffer,0,1000); 
    audioTrack.write(buffer,0,read); 
} 

我期望得到的延遲是read/sample rate秒但實際的聲音之後扮演和額外的約0.5秒,我真正需要的音頻以最小延遲播放,所以任何人都有解釋發生了什麼,是否有任何可用的解決方案,或者我應該接受這一點,因爲它是一個公頃rdware問題?

回答

1

我假設你的目標是想出一些交互式音頻解決方案(也就是響應某些用戶操作而播放聲音),因爲在這種情況下,低延遲確實很重要。

在Android上,要實現最低的延遲,您需要使用Open SL ES API,該API可通過NDK提供給原生(C++)代碼。可以實現低延遲的唯一Java端機制是SoundPool類,但是它對可以播放的聲音類型有限制。

欲瞭解更多信息,請參閱the page on high-performance audio,也看看這個蘇答案:Low-latency audio playback on Android

+0

它說:「由於OpenSL ES是一個原生的C API,非Dalvik的應用程序線程,其調用OpenSL ES沒有的Dalvik相關開銷(如垃圾收集)暫停,但除此之外,使用OpenSL ES沒有額外的性能優勢,特別是使用OpenSL ES不會導致較低的音頻延遲,較高的調度優先級等問題通常提供。「 – ammcom

+0

Java VM(在現代Android版本中稱爲ART)開銷可能很大。爲了實現低延遲,您可能需要以250 Hz的頻率可靠地調用音頻回調,因此您的回調將只有不到4ms的時間預算,因此每微秒計數一次,並且您不希望這些花費在JNI上或GC。 –