2016-10-29 89 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。 –