我正在尝试使用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。
有人对这里发生的事情有任何想法吗?
答案 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];
}
希望这有帮助。