带音频的定时器精度

时间:2011-07-14 23:21:21

标签: objective-c ios audio timer

我正在尝试非常精确地定时发射声音。

我用这段代码创建了计时器:

    timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0));       
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1ull*500000000, 5000ull);
    dispatch_source_set_event_handler(timer, ^{[myAVAudioPlayer play];});
    dispatch_resume(timer);

myAVAudioPlayer初始化如下:

    NSURL *soundURL = [NSURL fileURLWithPath:[mainBundle pathForResource:@"clock" ofType:@"aiff"]];
    myAVAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error];
    [myAVAudioPlayer prepareToPlay];

我还尝试使用声音的.caf格式和BubbleLevel示例代码中的Apple的SoundEffect类,但性能没有明显差异。

如果发射率低,则声音非常准确。但如果我提高射击速度,声音就会非常不准确。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

调度计时器不是为音频精度准确而设计的。您希望精确控制时间安排的案例是IIRC,这是Apple建议人们仍然直接使用线程而不是调度队列的少数几个领域之一。

更好的是调查Core Audio,除其他外,它旨在处理你想要的:精确控制时间。我不能在那里详细说明,因为我不熟悉API并且它的文档记录很糟糕,但是快速谷歌出现了at least one person doing the same thing,所以你可能很幸运找到了更好的解决方案。