Android:声音API(确定性,低延迟)

Pav*_*l P 35 android android-ndk

我正在审查各种Android声音API,我想知道我应该使用哪一种.我的目标是获得低延迟音频,或者至少是关于播放延迟的确定性行为.

我们遇到了很多问题,似乎Android声音API是废话,所以我正在探索各种可能性.

我们遇到的问题是sound_out.write(sound_samples);扬声器播放的声音和实际声音之间存在明显的延迟.通常它大约是300毫秒.问题是在所有设备上它都是不同的; 有些人没有这个问题,但大多数人都瘫痪了(但是,CS呼叫的延迟为零).这种荒谬的延迟最大的问题是,在某些设备上,这种延迟似乎是一些随机值(即它并不总是300毫秒).

我正在阅读有关OpenSL ES的内容,我想知道是否有人有过这方面的经验,或者它是相同的东西,但包装在不同的包中?

我更喜欢本机访问,但我不介意Java层间接,只要我能获得确定性行为:延迟必须是常量(对于给定的设备),或者我想要访问当前回放位置而不是猜测误差范围为±300 ms ......

编辑:
1.5年后,我尝试了多个Android手机,看看如何为实时语音通信获得最佳延迟.使用专业工具我测量了波浪路径的延迟.最佳结果超过100毫秒,大多数手机都在180毫秒范围内.有人有想法吗?

Ian*_*wis 27

SoundPool是大多数设备上延迟最低的接口,因为池存储在音频过程中.所有其他音频路径都需要进程间通信.如果SoundPool不能满足您的需求,OpenSL是最佳选择.

为何选择OpenSL?AudioTrack和OpenSL具有类似的延迟,但有一个重要的区别:AudioTrack缓冲区回调在Dalvik中提供服务,而OpenSL回调在本机线程中提供服务.Dalvik的当前实现无法以极低的延迟为回调提供服务,因为在音频回调期间无法暂停垃圾收集.这意味着AudioTrack缓冲区的最小大小必须大于OpenSL缓冲区的最小大小,以维持无故障播放.

在大多数Android版本中,AudioTrack和OpenSL之间的差异完全没有区别.但是对于Jellybean,Android现在有一个低延迟的音频路径.实际延迟仍取决于设备,但可能比以前低得多.例如,http://code.google.com/p/music-synthesizer-for-android/在Galaxy Nexus上使用384帧缓冲区,总输出延迟低于30毫秒.这要求音频线程大约每8ms一次服务缓冲区,这在之前的Android版本中是不可行的.在Dalvik线程中它仍然不可行.

这个解释假设有两件事:首先,您要从OpenSL请求最小的缓冲区,并在缓冲区回调中而不是缓冲区队列中进行处理.其次,您的设备支持低延迟路径.在大多数现有设备上,您不会发现AudioTrack和OpenSL ES之间存在太大差异.但是在支持Jellybean +和低延迟音频的设备上,OpenSL ES将为您提供最低延迟的路径.