我们为 iPad 构建了一个鼓机应用程序,可以与现场音乐一起演奏(在舞台上或卧室里)。设置非常基本:您按下其中一个按钮,就会播放相应的样本。一切都很顺利,但不幸的是,在您放下手指的那一刻和声音的播放之间似乎有一个小的(尽管很烦人)延迟。我试图测量延迟量(通过耳朵),它似乎是 0.05 - 0.1 秒。
音频播放已使用 AudioToolbox 框架(扩展音频文件服务,音频单元)实现。声音从存储在设备上的文件中流式传输,以防止不同音库之间的加载时间。样本采用原始 wav 格式(线性 PCM,16 位小端有符号整数,2 个通道,44100 Hz),据我所知,这应该是处理速度最快的(与 mp3 等压缩格式相反)。
我测量了按下按钮(UIButton 触摸事件)和将样本的第一帧传送到混音器(通过播放回调)之间的时间。它相当稳定,在 0.02 到 0.03 秒之间。对我来说,这似乎很快,但可能还不够快。
这可能是问题所在,还是可能是其他诸如触摸事件传递延迟之类的问题?
更新:
正如 Till 所建议的,我已经重写了样本的加载。它们现在都预加载到内存中,因此磁盘 IO 不再是问题。最重要的是,我为回声效果做了相当多的 memcpy,我已经禁用了它,稍后将使用链接列表类型的解决方案来修复它。
虽然这减少了延迟,但按钮按下->播放仍然在 0.005 到 0.02 秒之间(但更常见的是 0.02)。这仍然很明显。我认为这可能是由于播放回调的缓冲区大小,目前为 1024 字节。
关于如何做到这一点的任何想法?设置 kAudioUnitProperty_MaximumFramesPerSlice 似乎不起作用。