gpt4 book ai didi

iphone - 如何在iPhone上精确播放声音?

转载 作者:行者123 更新时间:2023-12-03 16:17:15 29 4
gpt4 key购买 nike

我正在努力在 iPhone 上创建一个简单的节拍器。该应用程序现在所做的就是运行一个计时器,每隔 1/1000th 秒进入计时器的函数。然后它检查当前时间与启动应用程序的时间(我使用的是 CACurrentMediaTime() 函数)。

CFTimeInterval currentTime = CACurrentMediaTime();
if (self.beatingStartTime == 0) {
self.beatingStartTime = currentTime;
}
if ( (currentTime - self.beatingStartTime) >= self.timeIntevalBetweenTicks * self.internalTimerCounter ) {
self.internalTimerCounter ++;
// ...
}

如果有一个播放音频的好时机,使用 OpenAL 播放音频的代码就会被触发。

基本上就是这样。我检查了在模拟器以及 2 台设备(iPad 和越狱的 iPhone 3GS)上运行时播放的声音,发现有问题 - 当我录制声音并查看 Reaper 中的波形时,出现了问题。软件中,有些声音播放得有点太晚了,有些声音播放得太早了(即使我可以理解“太晚”的部分,我真的不明白它如何能够比它应该播放的更早播放 - 因为应用程序会检查每次的秒数,它基本上不能早于指定时间 - 但根据我的记录,它确实是这样)。

同时,有一些节拍器应用程序在计时方面以“坚如磐石”而闻名,所以我想有一种方法。我只是想知道我错过了什么......

<小时/>

编辑:将计时器调用从 1/1000 秒更改为(例如 1/100 秒)没有帮助。

编辑2:当我从计时器切换到线程时(并且我让线程休眠指定的时间),我仍然遇到奇怪的行为。节奏在移动,虽然我可以理解有点滞后并且播放某些声音太晚,但问题是其中一些确实播放太早 - 这意味着 2 个节拍之间的时间距离小于应该通过。

差异约为 3%,相当于大约 10-15 毫秒,这对我来说相当大了。有人知道为什么声音可以提前播放吗?我在 iPhone 模拟器和 iPad 实际设备上都进行了尝试,我唯一的猜测是计时器有问题 - CACurrentMediaTime() 返回的秒数超出了应有的秒数。有可能吗?

最佳答案

尝试使用 NSSound,并将其作为实例变量加载,除非您的节拍器未运行,否则不要释放它。在循环中将文件加载到内存中可能会导致延迟。另一件需要考虑的事情是节拍器可能不需要每 1/1000 秒轮询一次。如果您不那么频繁地执行此操作,则 CPU 饱和的可能性就会降低,并且可能会获得更一致的结果。

最后,看看苹果的演示是如何工作的:http://developer.apple.com/library/ios/#samplecode/Metronome/Introduction/Intro.html

可能会让您更好地了解如何完成您想要做的事情:)

关于iphone - 如何在iPhone上精确播放声音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4681965/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com