我試圖在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問題?
它說:「由於OpenSL ES是一個原生的C API,非Dalvik的應用程序線程,其調用OpenSL ES沒有的Dalvik相關開銷(如垃圾收集)暫停,但除此之外,使用OpenSL ES沒有額外的性能優勢,特別是使用OpenSL ES不會導致較低的音頻延遲,較高的調度優先級等問題通常提供。「 – ammcom
Java VM(在現代Android版本中稱爲ART)開銷可能很大。爲了實現低延遲,您可能需要以250 Hz的頻率可靠地調用音頻回調,因此您的回調將只有不到4ms的時間預算,因此每微秒計數一次,並且您不希望這些花費在JNI上或GC。 –