0

我有一个 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 上执行此操作?

4

1 回答 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 回答