使用AudioServices播放声音循环或Stoping播放

时间:2013-07-12 17:02:39

标签: iphone objective-c audio

我创建了这个方法,可以在XCode iPhone应用程序中轻松播放声音。

void playSound(NSString* myString) {
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    NSString *string = myString;
    CFURLRef soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (__bridge CFStringRef) string, CFSTR ("wav"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
}

这个问题是,我不知道如何停止声音或让声音在循环播放直到它停止。我该怎么做呢?我可以让方法返回声音,然后将其放入变量中以便以后修改吗?

4 个答案:

答案 0 :(得分:1)

恐怕我不知道怎么阻止它,但试着这个循环:

soundFile = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"AudioName" ofType:@"wav"]];
sound = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFile error:nil];
sound.numberOfLoops = -1; //infinite
[sound play];

答案 1 :(得分:1)

来自文档:“界面不提供电平,定位,循环或定时控制,并且不支持同时播放......”。

http://developer.apple.com/library/ios/#documentation/AudioToolbox/Reference/SystemSoundServicesReference/Reference/reference

因此,对于声音播放,最好使用AVFoundation类。

答案 2 :(得分:0)

系统声音服务通常用于播放短音/警报/等等,并且应该避免暂停/停止。如果确实需要,您可以尝试AudioServicesDisposeSystemSoundID(systemSoundID)来停止声音。 至于循环,您可以使用AudioServicesPlaySystemSoundWithCompletion创建递归函数来循环声音。

示例(swift 3):

func playSystemSound(systemSoundID: SystemSoundID, count: Int){
    AudioServicesPlaySystemSoundWithCompletion(systemSoundID) {
        if count > 0 {
            self.playSystemSound(systemSoundID: systemSoundID, count: count - 1)
        }
    }
}

因此,在您的示例中,您只需将AudioServicesPlaySystemSound(soundID);替换为playSystemSound(systemSoundID: soundID, count: numOfPlays)

即可

答案 3 :(得分:0)

如果您要根据bool变量决定播放声音,

private func playSound() {
        if isStarted {
            AudioServicesPlaySystemSoundWithCompletion(kSystemSoundID_Vibrate, {
                if self.isStarted {
                    self.playSound()
                }
            })
        }
    }