在Cocoa Touch中循环声音文件

时间:2012-09-29 15:30:44

标签: iphone ios cocoa-touch

我试图在视图加载后播放声音,并在整个应用中重复播放音乐,即使从不同视图切换也是如此。加载视图后它会播放,并在切换到不同视图后继续播放,但我无法循环播放。我正在使用声音。让我循环的任何帮助都很棒

-(void)viewDidLoad {

    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef    soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef)@"beat", CFSTR ("mp3"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
}

3 个答案:

答案 0 :(得分:3)

尝试使用AVAudioPlayer代替,解决方案就是这样(使用ARC)。


你需要在你的班级中定义一个变量......

@interface MyClass : AnyParentClass {
    AVAudioPlayer *audioPlayer;
}

// ...

@end

...你可以在你的任何方法中加入以下代码来开始播放......

NSURL *urlForSoundFile = // ... whatever but it must be a valid URL for your sound file
NSError *error;

if (audioPlayer == nil) {
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:urlForSoundFile error:&error];
    if (audioPlayer) {
        [audioPlayer setNumberOfLoops:-1]; // -1 for the forever looping
        [audioPlayer prepareToPlay];
        [audioPlayer play];
    } else {
        NSLog(@"%@", error);
    }
}

...停止播放很容易。

if (audioPlayer) [audioPlayer stop];

答案 1 :(得分:0)

尝试将代码移动到应用程序代理中,并使用重复的NSTimer重复播放操作。

示例代码:

// appDelegate.h
@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
     UInt32 soundID;
}

//appDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef    soundFileURLRef;
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, (CFStringRef)@"beat", CFSTR ("mp3"), NULL);
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);


    [NSTimer scheduledTimerWithTimeInterval:lenghtOfSound target:self selector:@selector(tick:) userInfo:nil repeats:YES];
    return YES;
}

-(void)tick:(NSTimer *)timer
{
   AudioServicesPlaySystemSound(soundID);
}

答案 2 :(得分:0)

使用AudioServicesAddSystemSoundCompletion函数注册回调,如AudioServicesPlaySystemSound函数说明所述。计时器的问题是你可能无法在前一个声音结束时准确启动它。