我有一个应用程序,其中有一组大约 50 个声音,长度范围从大约 300 毫秒到大约 4 秒。需要在精确的时间播放各种声音组合(一次最多可以触发 10 个)。有些声音需要以短至 100 毫秒的间隔重复。
我已经将其实现为 AVAudioPlayers 的二维数组,所有这些都在应用程序启动时加载了声音。每个声音有几个播放器,以适应快速重复的声音。特定声音的播放器在严格轮换中重复使用。当安排了新的声音时,该声音的最旧播放器将停止并且其当前时间设置为 0,因此声音将从头开始重复,下次使用 player.play(atTime:) 进行安排。有一个线程可以在播放新声音之前大约 300 毫秒安排新的声音集。
这一切都很好,直到某个点因设备而异。最终,随着声音播放得更快,和/或安排了更多同时的声音,一些声音将拒绝播放。
我正在考虑使用混合器节点切换到 AVAudioEngine 和 AVAudioPlayerNodes。有谁知道这种方法是否可以处理更多的同时声音?我的猜测是,这两种方法都转化为一组相当相似的 CoreAudio 函数,但我实际上并没有编写代码来测试这个假设——在我这样做之前,我希望其他人可能在我之前探索过这个问题。我之前对CoreAudio很深入,我希望能够使用这些方便的高级功能来代替!
另外,有没有人知道当声音开始时触发关闭的方法?记录的功能允许回调关闭,但我能够在声音开始时触发事件的唯一方法是为 DispatchQueue 创建一个高质量的服务队列。不幸的是,根据系统负载,排队事件的执行时间可能与预定时间相差最多约 50 毫秒,这并不像我希望的那样精确。