我试图在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。 –