我有一个相对简单的应用,使用AVAudioPlayer
播放声音,如下所示:
NSURL *file3 = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/ball_bounce.aiff", [[NSBundle mainBundle] resourcePath]]];
player3 = [[AVAudioPlayer alloc] initWithContentsOfURL:file3 error:nil];
[player3 prepareToPlay];
后来被叫去玩,就像这样:
[player3 play];
但这种声音在多个地方(与弹跳球碰撞)被多次调用。有时,球会以足够快的速度击中两个东西,当第二次碰撞时,第一次弹跳的声音仍在播放。第二次弹跳然后不会发出声音。每次碰撞时如何让它发出声音,即使它涉及的声音是否与已经播放的声音重叠?
非常感谢任何帮助。
答案 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);
此解决方案的缺点是,您无法调整音量。