3

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

WWDC session 508 : " ...所以第一个参数做 schedule 是一个采样时间,如果音频单元已经宣传它是可以斜坡的,参数值可以随着时间斜坡。例如,Apple Mixer 这样做。最后一个两个参数,当然是函数参数,分别是要改变的参数的地址和新的参数值...."

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

我见过的其他潜在解决方案包括使用NSTimer,CADisplayLink或者dispatchAfter...,与从单元输出上安装的抽头块偏移相比,这些解决方案感觉更糟,样本精度也更低。

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

4

1 回答 1

0

这并不像您希望的那样明显。scheduleParameterBlock不幸的是,在我的测试中, (甚至是底层)的 ramp 参数AudioUnitScheduleParameters根本没有做任何事情。对于这样一个成熟的 API 来说非常奇怪。

底线是您只能在单个缓冲区内设置参数值,而不是在样本级别。在采样时间设置参数值,将在包含缓冲区结束时自动从当前值斜坡上升到新值。似乎没有办法禁用这种自动斜坡。

更长的淡入淡出必须通过在多个缓冲区中设置小数值并跟踪淡入淡出的相对进度来分段完成。实际上,对于正常的持续时间衰减,这种时间差异不太可能成为问题,因为样本准确度会过大。

所以总结一下,样本级别的参数更改似乎是不可能的,但是缓冲区级别的参数更改很容易。如果您需要进行非常短的淡入淡出(在单个缓冲区内或跨几个缓冲区),则可以通过在样本级别通过AURenderCallback.

于 2020-12-10T19:33:46.190 回答