AVAudioEngine 调度样本准确的参数变化
Posted
技术标签:
【中文标题】AVAudioEngine 调度样本准确的参数变化【英文标题】:AVAudioEngine schedule sample accurate parameter changes 【发布时间】:2016-06-24 19:48:24 【问题描述】:我正在尝试使用 AVAudioPlayerNode 实例和其他用于 EQ 和压缩等的 AUAudioUnits 的组合来创建一个应用程序。一切都很好地连接起来,使用 API 的 V3 版本当然可以更轻松地将节点连接在一起的配置。但是,在播放过程中,我希望能够自动更改混音器上的增益等参数,以便使更改呈斜坡状(例如淡出或淡入),并确信这些更改是准确的样本。
我考虑过的一种解决方案是在一个节点(可能是引擎的混频器节点)上安装一个抽头,并在其中调整给定单元的增益,但由于抽头位于一个单元的输出上,所以总是为时已晚所需的效果(我认为)而不进行偏移计算,然后延迟我的源音频播放以匹配参数更改。我还查看了AUAudioUnit
上的scheduleParameterBlock
属性,但似乎我需要实现我自己的自定义单元来使用它而不是使用内置单元,即使它在
WWDC session 508: " ...所以做 schedule 的第一个参数是一个示例 时间,如果音频单元有 宣传它是可倾斜的。例如,Apple Mixer 这。而最后两个参数,当然是函数参数 是要更改的参数的地址和新参数 价值……”
也许这意味着 Apple Mixer 在内部使用它,而不是我们可以利用任何可升级的功能。除了在本次演讲中附加的 Apple 示例中实现自定义音频单元之外,我找不到很多文档或示例。
我见过的其他潜在解决方案包括使用NSTimer
、CADisplayLink
或dispatchAfter...
,但这些解决方案感觉更糟,而且与从单元输出上安装的抽头块偏移相比,这些解决方案的样本精度更低。
我觉得我错过了一些非常明显的东西,因为新的 AVAudioEngine API 的其他部分很有意义,而旧的 AUGraph API 允许更多地访问样本准确的排序和参数更改。
【问题讨论】:
即使您使用 AU 渲染回调,您也可以应用精度超过(即比)inNumberFrames
的控制数据作为近似值(插值)或 inNumberFrames/sampleRate
延迟, AFAIK。但是,您可以以编程方式设置非常短的缓冲区,短至 14 帧。
提示:你可以看看这个research in ios timing。
我看到这是一个多月了,你找到解决办法了吗?
【参考方案1】:
这并不像您希望的那样明显。不幸的是,在我的测试中,scheduleParameterBlock
(甚至是底层的AudioUnitScheduleParameters
)上的斜坡参数根本没有任何作用。这么成熟的 API 实在是太奇怪了。
底线是您只能在单个缓冲区内设置参数值,而不是在样本级别。在采样时间设置参数值,将在包含缓冲区结束时自动从当前值斜坡上升到新值。似乎没有办法禁用这种自动斜坡。
必须通过在多个缓冲区中设置小数值并跟踪淡入淡出的相对进度来分段完成更长的淡入淡出。实际上,对于正常的持续时间衰减,这种时间差异不太可能成为问题,因为样本准确度会过大。
所以总结一下,样本级别的参数更改似乎是不可能的,但是缓冲区级别的参数更改很容易。如果您需要进行非常短的淡入淡出(在单个缓冲区内或跨几个缓冲区),则可以通过 AURenderCallback
操作单个样本在样本级别完成。
【讨论】:
以上是关于AVAudioEngine 调度样本准确的参数变化的主要内容,如果未能解决你的问题,请参考以下文章