AVAudioEngine安排样本准确的参数更改

时间:2016-06-24 19:48:24

标签: ios audio core-audio avaudioplayernode

我正在尝试使用AVAudioPlayerNode实例和其他AUAudioUnit的组合来创建一个应用程序,用于EQ和压缩等。一切都很好连接,使用V3版本的API肯定会使配置更容易连接节点。但是在播放期间,我希望能够自动执行参数更改,例如调音台上的增益,以便更改渐变(例如淡出或淡入。)并确信更改样本准确。
我考虑过在节点(可能是引擎的混音器节点)上安装一个分接头的一个解决方案,调整给定单元的增益,但由于分接头位于一个单元的输出上,这总是为时已晚想要的效果(我认为),不做偏移计算,然后延迟我的源音频播放,以匹配参数变化。我还查看了scheduleParameterBlock上的AUAudioUnit属性,但似乎我需要实现自己的自定义单元来使用它,而不是使用内置单元,即使它在

  

WWDC会话508 :“......所以做日程安排的第一个参数就是样本   时间,如果音频单元有参数值,则参数值可以随时间推移   宣传它是可媲美的。例如,Apple Mixer可以   这个。当然,最后两个参数是函数参数   是要更改的参数的地址和新参数   价值......“

也许这意味着Apple Mixer内部使用它而不是我们可以利用任何可扩展的功能。除了实现自定义音频单元之外,我找不到很多文档或示例,如本演讲附带的Apple示例所示。

我见过的其他潜在解决方案包括使用NSTimerCADisplayLinkdispatchAfter...,但这些解决方案比单元输出上安装的分接块偏移更差,样本准确度更低

我觉得我错过了一些非常明显的东西,因为新的AVAudioEngine API的其他部分非常有意义,旧的AUGraph API允许更多访问样本准确的排序和参数更改。

1 个答案:

答案 0 :(得分:0)

这并不像您希望的那样明显。不幸的是,在我的测试中,scheduleParameterBlock(甚至是底层的AudioUnitScheduleParameters)上的ramp参数根本没有任何作用。对于如此成熟的API来说很奇怪。

最重要的是,您只能在单个缓冲区中设置参数值,而不能在样本级别上设置。在采样时间设置参数值,将在包含缓冲区的末尾自动将当前值从新值增加到新值。似乎没有办法禁用此自动渐变。

较长的渐变必须通过设置跨多个缓冲区的分数值并跟踪渐变的相对进度来分段完成。实际上,对于正常的持续时间衰减,这种时序差异不太可能成为问题,因为样本准确性会过高。

因此,总而言之,样本级参数更改似乎是不可能的,但是缓冲区级参数更改很容易。如果您需要进行非常短的淡入淡出操作(在单个缓冲区内或跨两个缓冲区),则可以通过AURenderCallback来操纵单个样本,从而在样本级别上做到这一点。