【问题标题】:AudioKit AKMetronome callback timing seems imprecise or quantizedAudioKit AKMetronome 回调时间似乎不精确或量化
【发布时间】:2020-07-24 16:24:06
【问题描述】:

我是 AudioKit 和一般数字音频的新手,所以我确定我一定缺少一些东西。

我试图通过获取每个回调的时间戳来从 AKMetronome 获取精确的时间。不过,时间似乎以某种方式被量化了,我不知道它是什么。

示例:如果我的节拍器设置为 120,则每个回调应该恰好相隔 0.5 秒。但是,如果我计算从一个滴答声到下一个滴答声的差异,我会得到:

0.49145491666786256

0.49166241666534916

0.5104563333334227

0.4917322500004957

0.5104953749978449

0.49178879166720435

0.5103940000008151

0.4916401666669117

它始终是 2 个值之一,误差很小。我希望能够计算下一个滴答声何时到来,这样我就可以提前几帧触发动画,但这很困难。我是否忽略了什么?

编辑:自从我最初发布这个问题以来,我想出了一个解决方案,但我不确定它是唯一还是最好的解决方案。

我使用AKSettings.BufferLength.veryShort 将缓冲区设置为最小大小

使用最小的缓冲区,时间戳总是在一两毫秒内开启。我仍然不确定我是否做对了,或者这是否是AKCallback 的预期行为。即使缓冲区更长,回调似乎也应该准时。

【问题讨论】:

    标签: swift audio audiokit metronome


    【解决方案1】:

    您是否使用Timer 来计算时差?从我的角度来看,根据我的发现,这个问题与 Timer 有关,这在 ios 中并不精确,请参阅线程 (Accuracy of NSTimer)。

    或者,您可以查看 AVAudioTime (https://audiokit.io/docs/Extensions/AVAudioTime.html)

    【讨论】:

    • 这不是使用 Timer,而是使用 AKMetronome,它是 AudioKit 的一部分:audiokit.io。我实际上忘记了这个问题,并从那时起想出了一个解决方案,所以我将编辑我的问题。
    • @JiminyKirket 我指的是timestamp 。我有同样的问题,你可能会发现这个关于 AVaudioTime 和延迟补偿(github.com/AudioKit/AudioKit/blob/master/Examples/iOS/…)很有趣。希望您也能分享您的发现,谢谢
    • 啊,我明白了。我没有意识到该链接与 AudioKit 有关。我一定会调查的。我只是通过在AKMetronome.callback 中获取systemUptime 并将其与基于BPM 的预期节拍长度进行比较来获取时间戳...使最小的缓冲区大小基本上解决了问题,但是您的链接看起来可能有更好的回答,所以提前谢谢。
    • 我只是在这里为以后的读者添加评论,所以systemUptimeProcessInfo.processInfo (developer.apple.com/documentation/foundation/processinfo) 的属性,准确测量时间很困难,并且有很多讨论但是AudioKit的作者在这里使用它(github.com/AudioKit/SamplerDemo/blob/master/iOS/SamplerDemo/…),所以我认为跟随原作者是一个很好的做法。
    猜你喜欢
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2012-12-29
    • 2019-10-18
    相关资源
    最近更新 更多