0

我正在尝试使用 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。

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

4

2 回答 2

4

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

于 2009-12-19T04:53:52.403 回答
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];
}

希望这可以帮助。

于 2009-12-19T07:11:36.147 回答