Iphone 在iOS中多次播放声音的正确方式

Iphone 在iOS中多次播放声音的正确方式,iphone,objective-c,ios,Iphone,Objective C,Ios,我需要实现连续3次播放一些.aiff声音。声音长度是0.1毫秒,两次播放之间的间隔也应该是0.1毫秒。所以我决定使用NSTimer。这是我的解决方案: -(void)playSound{ timerCounter = 0; timerForSound = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self

我需要实现连续3次播放一些.aiff声音。声音长度是0.1毫秒,两次播放之间的间隔也应该是0.1毫秒。所以我决定使用NSTimer。这是我的解决方案:

-(void)playSound{
    timerCounter = 0;
    timerForSound = [NSTimer scheduledTimerWithTimeInterval:0.2
                                                     target:self 
                                                   selector:@selector(playSoundThreeTimes)
                                                   userInfo:nil
                                                    repeats:YES];
}

-(void)playSoundThreeTimes{
    // play alert sound
    AudioServicesPlaySystemSound(beepSound);
    timerCounter++;
    if(timerCounter == 3){ // sound played 3 times
        [timerForSound invalidate];
        timerCounter = 0;
    }
}
问题是声音有时会滞后,即使我将间隔设置为0.25(0.2是因为声音长度+间隔=0.2)

有人能提出更好的方法吗?或者说问题可能是由什么引起的

阿特姆

编辑:将此添加到异步线程也不起作用:

dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [self playSound];
    });

我可能错了,但是音频应该在它自己的线程上,但是我不确定如何在ObjC中处理它(我用c++编程音频)

NSTimer并不总是准确的,因为(我认为)它是一个消息线程。在高间隔(1秒以上)时,它不会明显,但在如此短的速度下,它可能会滞后。

两个原因: 1.NSTimer并非100%准确。 2.您正在主线程上触发事件,UI的其余部分就在主线程上

就像亚当说的,你可以把它放在自己的线程上。或者使用像CADisplayLink之类的东西来代替NSTimer

编辑:如果你是对的,罪魁祸首是AudioSystemServices。。。我不知道它是否能工作,但你能尝试创建3个不同的beepSound引用,然后调用beepSound1、beepSound2、beepSound3吗?因为我想它可能正在等待前一个声音停止。如果它不起作用,我想你可能需要使用音频队列或OpenAL…

试试这个:

-(void)playMyAudio {

    //play audio method
    if (loop<3) {   
        [self performSelector:@selector(playAudio) withObject:nil afterDelay:0.1];
        loop++;
    }
    else {
       loop = 0
    }
}
-(无效)播放我的音频{
//播放音频方法

如果(loopIt与timer的情况基本相同,也是滞后的,这也是错误的,因为playAudio将在同一时间调用3次,因为for循环中没有延迟。在自己的线程上播放声音的想法是正确的,但我不能在异步thr上使用
NSTimer
performSelector:afterDelay:
ead,因为两者都使用消息或smth。我知道。您可以对计时器执行类似于选择器(播放声音)
的操作,并且在
playSound
中,您只有一行
[自执行选择器背景:@selector(播放声音背景)]
,播放它的人,但我不知道它是否有帮助。下面是一个关于如何在另一个线程上使用runloop的NSTimer的有用问题:顺便说一句,CADisplayLink也不可能,因为它不允许控制调用methodsMaybe的频率。从这个角度来看……我不知道它是否有效,但你能吗尝试创建3个不同的beepSound引用,然后调用beepSound1、beepSound2、beepSound3?因为我认为它可能正在等待上一个声音停止。如果它不起作用,我认为可能您需要使用音频队列或OpenAL,也许……抱歉,我无法提供更多帮助。