要获得高精度的时序,您必须跳下一两个编程级别并使用诸如Core Audio Unit框架之类的东西,它提供样本精确的时序(在 44100kHz 时,样本应该每 0.02 毫秒左右发生一次)。
这种方法的缺点是为了获得这样的计时性能,Core Audio Unit 编程避开了 Objective-C 的 C/C++ 方法,在我看来,这比 Objective-C 更难编码。除此之外,Core Audio Units 的工作方式也很令人困惑,尤其是如果您没有音频 DSP 方面的背景。
留在 Objective-C 中,你可能知道 NSTimers 在这里不是一个选项。为什么不检查AVFoundation 框架?它可用于精确的媒体排序,并具有一些创造性的侧面思考,以及AVURLAssetAVURLAssetPreferPreciseDurationAndTimingKey
的选项 ,您可能无需使用 Core Audio Units 即可实现您想要的。
只是为了填写更多 about AVFoundation
,您可以将 的实例AVAsset
放入AVMutableComposition
(通过AVMutableCompositionTrack
对象),然后使用AVPlayerItem
带有AVPlayer
实例的对象来控制结果。AVPlayerItem 通知AVPlayerItemDidPlayToEndTimeNotification
(docs)可用于确定单个资产何时完成,而 AVPlayer 方法addBoundaryTimeObserverForTimes:queue:usingBlock:
可以addPeriodicTimeObserverForInterval:queue:usingBlock:
在任意时间提供通知。
对于 iOS,如果您的应用程序将播放音频,您还可以让这一切在后台线程上运行,这意味着您可以在应用程序处于后台时保持时间(尽管警告,如果它不播放音频,Apple 可能会不接受您的应用使用此后台模式)。查看UIBackgroundModes 文档了解更多信息。