AVAudioPlayer不会重复播放

时间:2011-06-18 21:51:57

标签: objective-c ios cocoa-touch audio avaudioplayer

我有一个相对简单的应用,使用AVAudioPlayer播放声音,如下所示:

NSURL *file3 = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/ball_bounce.aiff", [[NSBundle mainBundle] resourcePath]]];
player3 = [[AVAudioPlayer alloc] initWithContentsOfURL:file3 error:nil];
[player3 prepareToPlay];

后来被叫去玩,就像这样:

[player3 play];

但这种声音在多个地方(与弹跳球碰撞)被多次调用。有时,球会以足够快的速度击中两个东西,当第二次碰撞时,第一次弹跳的声音仍在播放。第二次弹跳然后不会发出声音。每次碰撞时如何让它发出声音,即使它涉及的声音是否与已经播放的声音重叠?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

解决此问题的一种方法是创建AVAudioPlayer的新实例(如果前一个实例已在播放):

if([player3 isPlaying]) {
   AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[player3 url]];
   [newPlayer setDelegate:self];
   [newPlayer play];
}

然后,在委托方法audioPlayerDidFinishPlaying:successfully:中,您应该向播放器发送-release消息:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
   if(player != player3) {
      [player release];
   }
}

这就是它必须的方式,因为你需要为每个并发声音播放一个新的源缓冲区。 :(

答案 1 :(得分:0)

这是一个老话题,但也许有人可以从这个答案中受益。重复创建AVAudioPlayer可能会给应用带来负担,并可能造成滞后。在这种情况下,您可以使用SystemSound。

NSString *pathToMySound = [[NSBundle mainBundle] pathForResource:@"yourMusic" ofType:@"mp3"];
SystemSoundID soundID;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)([NSURL fileURLWithPath: pathToMySound]), &soundID);
AudioServicesPlaySystemSound(soundID);

此解决方案的缺点是,您无法调整音量。