一次播放多个声音?

时间:2011-03-23 23:26:44

标签: iphone objective-c avaudioplayer

我在一个视图中有6个声音。

但是我想要它,以便我可以一次播放多个,所以你点击声音1(声音1正在播放)然后声音2播放。声音1仍然在播放。

但是此刻我按声音1(声音1次播放),按声音2(声音2播放,但声音1停止)

以下是音频部分的代码。

- (IBAction)oneSound:(id)sender; {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"wav"];
    if (theAudio) [theAudio release];
    theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];   
    volumeTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(updateVolume) userInfo:nil repeats:YES];
}

- (IBAction)twoSound:(id)sender; {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"2" ofType:@"wav"];
    if (theAudio) [theAudio release];
    theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    theAudio.delegate = self;
    [theAudio play];   
    volumeTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(updateVolume) userInfo:nil repeats:YES];
}

3 个答案:

答案 0 :(得分:4)

缺少一些重要的代码,但看起来好像theAudio是用于管理声音播放的全局代码。由于您在播放声音时将其销毁,因此当前播放的任何内容都将停止以准备下一个声音。

有几种方法可以解决这个问题,其中一种方法是每个声音都有自己独特的AVAudioPlayer实例。

答案 1 :(得分:2)

不要因为它存在而释放播放器。完成播放后发布

您应该在app delegate或app delegate的属性中实现此功能,以便在弹出视图时委托引用仍然有效。

你不应该为每个声音都这样做。每个语音都会使用不同的文件名或URL初始化播放器。你可以通过确保在完成比赛后释放来获得这一点。另一件需要注意的事情是,如果球员由于中断而未能完成比赛,则会释放球员。

#pragma mark -
#pragma mark Audio methods

-(void)playNote:(NSInteger)noteNumber {

    NSString *soundFilePath =
    [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%i", noteNumber ]
                                    ofType: @"caf"];

    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];

    AVAudioPlayer *playerToPrepare = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL
                                                                            error:nil];

    [fileURL release];

    [playerToPrepare prepareToPlay];
    [playerToPrepare setDelegate: self];

    [playerToPrepare play];

}

#pragma mark -
#pragma mark AVAudioPlayer delegate methods

- (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) playerThatFinished
                        successfully: (BOOL) completed {
    if (completed) {
        [playerThatFinished release];
    }
}

答案 2 :(得分:1)

您可以声明并使用:

AVAudioPlayer *theAudio1;    // for file 1.wav
AVAudioPlayer *theAudio2;    // for file 2.wav
...
AVAudioPlayer *theAudio6;    // etc.

而不是只释放和重用一个AVAudioPlayer。