我正在尝试使用 AVAudioPlayerNode 实例和其他 AUAudioUnits 的组合来创建一个应用程序,用于 EQ 和压缩等。一切都很好地连接起来,使用 API 的 V3 版本当然可以使配置更容易将节点连接在一起。然而,在播放过程中,我希望能够自动化参数更改,例如混音器上的增益,以便更改渐变(例如淡出或淡入。)并且确信更改是样本准确的。
我考虑过的一种解决方案是在一个节点(可能是引擎的混频器节点)上安装一个抽头,并在其中调整给定单元的增益,但由于抽头位于一个单元的输出上,所以总是为时已晚所需的效果(我认为)而不进行偏移计算,然后延迟我的源音频播放以匹配参数更改。我也查看了scheduleParameterBlock
属性,AUAudioUnit
但似乎我需要实现我自己的自定义单元来使用它而不是使用内置单元,即使它在
WWDC session 508 : " ...所以第一个参数做 schedule 是一个采样时间,如果音频单元已经宣传它是可以斜坡的,参数值可以随着时间斜坡。例如,Apple Mixer 这样做。最后一个两个参数,当然是函数参数,分别是要改变的参数的地址和新的参数值...."
也许这意味着 Apple Mixer 在内部使用它,而不是我们可以利用任何可扩展的功能。除了在本次演讲中附加的 Apple 示例中实现自定义音频单元之外,我找不到很多文档或示例。
我见过的其他潜在解决方案包括使用NSTimer
,CADisplayLink
或者dispatchAfter...
,与从单元输出上安装的抽头块偏移相比,这些解决方案感觉更糟,样本精度也更低。
我觉得我错过了一些非常明显的东西,因为新的 AVAudioEngine API 的其他部分很有意义,而旧的 AUGraph API 允许更多地访问样本准确的排序和参数更改。