我有一个 30 秒的音频文件,我想在播放期间在 12 个不同的点获得回调,这样我就可以开始一些动画了。例如,在 1.3、3.2、4.8、9.8、12.3、15.5、18.1、20.4、22.5、24.5、27 和 29 秒。我将如何在 iOS 上执行此操作?
user568866
问问题
110 次
1 回答
0
在 iOS/Objective-C 中有很多很多方法可以做到这一点。我假设您不希望来自实际音频播放器的回调来保证音频已播放。您用于播放音频的机制可能会在音频实际开始播放时进行回调(以帮助您更好地同步内容)。
一个很常见的就是
[self performSelector:@selector(myMethod:) withObject:someArgumentOrNil afterDelay:3.2];
或者您可以查找NSTimer
以了解如何使用它,
或新的中央调度版本
double delayInSeconds = 3.2;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
NSLog(@"later");
});
如果您使用较新的操作系统和多核设备,GCD 是一个不错的选择。
如果您使用的是动画包(例如 cocos2d),它们通常也有计时挂钩。
为扩展问题添加:
如果所有动画都不同,那么这就是您必须做的工作量。如果它们都相同(或某些相同),您可以让 NSTimer 每 0.1(例如)秒调用一次,然后测试经过的实际时间量,当您达到下一个阈值时触发操作. (不能保证按时运行 - 如果您的应用程序占用大量 CPU,它可能会运行迟到。)
if (currentTime >= thresholdTime) {
[self doAnim];
thresholdTime = nextOneInLine;
}
是的,如果它变得更复杂,您可能想要构建一些类来处理它。按时间顺序构建一个数组,并将其视为一个队列。
于 2012-06-14T15:07:49.177 回答