使用kAudioUnitSubType_PeakLimiter避免在混合样本时产生裂纹

时间:2018-09-10 06:31:41

标签: ios avaudioengine avkit

我正在写游戏。游戏循环播放一些背景音乐,效果很好。当然,当玩家进行交互时,游戏也会播放声音效果。这些相互作用可以迅速发生,因此特定的声音效果可以播放多次。

在当前的实现中,我使用的是AVAudioEngine图,每次需要播放样本时都创建一个AVAudioPlaybackNode。回放的完成处理程序启动后,我计划稍后再删除该节点。

到目前为止,太好了。音频播放效果很好,不同之处在于,当我或多或少地同时播放多个样本时,我会遇到削波和输出失真的情况。另外,随着越来越多的样本一次播放,输出上会出现莫名其妙的白噪声。样本本身没有 白噪声,它们各自淡出以完全静音,然后结束。

我在输出上添加了一个kAudioUnitSubType_PeakLimiter节点,该节点消除了噪音(为什么?),并减少了削波的发生(假设它是削波的)。

在我看来,每次要播放样本时添加和删除节点是错误的方法-但是我找不到任何方法来确定节点是否确实在播放样本(isPlaying始终返回true )。我确实尝试创建节点池,但是输出声音更大-好像随着连接的节点越来越多,AVAudioMixerNode的行为也有所不同。

所以我的问题是这样:

每当出现声音效果时添加和删除播放节点是一个好主意(我想可能不是),如果没有,推荐的方法是什么?

问一个以上的问题时,肯定可以肯定是差的形式-峰限制器工作得很好,并且始终限制峰而没有可听的削波(就像真正的限制器一样)。

0 个答案:

没有答案