iPhone上AVAudioPlayer的奇怪行为

时间:2009-12-19 04:45:11

标签: iphone audio avaudioplayer

我正在尝试使用AVAudioPlayer播放声音。应该很简单,但我看到一些奇怪的结果。

代码:

NSString *path = [[NSBundle mainBundle] pathForResource:@"pop" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];
AVAudioPlayer *sound = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[sound play];
[sound release];

我所看到的是,正常使用该应用程序时声音无法播放。

如果我使用调试器单步执行代码,它只播放 ,在执行任何其他方式时它不会播放...

我没有在我的应用程序中创建任何新线程或运行循环,所以这应该都在主线程上运行,至少[NSThread isMainThread]返回true。

有人对这里发生的事情有任何想法吗?

2 个答案:

答案 0 :(得分:4)

AVAudioPlayer的play方法是异步的,所以你开始播放声音然后立即释放它!这就是为什么当你在调试器中单步执行它时它会工作的原因 - 你在杀死它之前给它时间玩。您要做的是实现AVAudioPlayerDelegate的 - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag方法,并在声音播放完后释放音频播放器。

答案 1 :(得分:0)

papajohn是对的,你应该这样做

拥有像

这样的音频播放器的班级变量
AVAudioPlayer *classLevelPlayer;

合成这个对象。以及对玩家方法的调用

-(void)playTheSong{

if(classLevelPlayer!=nil){
[classLevelPlayer stop];
[self setClassLevelPlayer:nil];
}

NSString *path = [[NSBundle mainBundle] pathForResource:@"pop" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];

AVAudioPlayer *sound = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

if(sound){
[self setClassLevelPlayer:sound];
[classLevelPlayer play];
}
[sound release];
}

并在

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
 [self setClassLevelPlayer:nil];
}

希望这有帮助。