1

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

-(void)viewDidLoad {

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

3 回答 3

3

尝试AVAudioPlayer改用,解决方案将是这样的(使用 using 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];
于 2012-09-30T17:21:06.677 回答
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);
}
于 2012-09-29T16:57:54.643 回答
0

按照 AudioServicesPlaySystemSound 函数描述的建议,使用 AudioServicesAddSystemSoundCompletion 函数注册回调。计时器的问题是您可能不会在前一个声音结束时准确地启动它。

于 2012-09-29T17:10:16.700 回答