一个声音结束后,可以播放另一个声音...但是在这个代码中,声音是混合的...我该如何解决它?
-(IBAction) ... {
for ( ...) {
if (compare(Output, N1)) {
songPath = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"wav"];
}
if (compare(Output, N2)) {
songPath = [[NSBundle mainBundle] pathForResource:@"b" ofType:@"wav"];
}
audioPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: songPath] error:NULL];
[audioPlayer setDelegate:self];
[audioPlayer play];
}
}
-(void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {
NSLog(@"Song FINISHED!!!!!!");
[player release];
}
一旦用户点击按钮,音频播放器就会播放,但似乎如果音频没有完成并且用户再次点击它,则会使用对音频文件的另一个引用创建音频播放器的另一个对象。这使得两个甚至更多音频同时播放。嗯,解决方案很简单。只需检查每次点击按钮时,播放器是否已经在播放,如果是,请停止播放器并释放并使用新的文件 url 引用创建新实例。为此,您应该合成 audioPlayer 并将其用作,
-(IBAction) ... {
for ( ...) {
if (compare(Output, N1)) {
songPath = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"wav"];
}
if (compare(Output, N2)) {
songPath = [[NSBundle mainBundle] pathForResource:@"b" ofType:@"wav"];
}
if(self.audioPlayer){
self.audioPlayer.delegate=nil;
self.audioPlayer=nil;
}
self.audioPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL:
[NSURL fileURLWithPath: songPath] error:NULL];
[self.audioPlayer setDelegate:self];
[self.audioPlayer play];
}
}
-(void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag {
NSLog(@"Song FINISHED!!!!!!");
[self.audioPlayer setDelegate:nil];
self.audioPlayer=nil;
}
你的代码不是很好理解,但我想我明白你的目标是什么。
要实现它,假设您有一个 NSArray *itemsToPlay
.在一开始(即当用户点击你的按钮时),它充满了你所有的声音。
用户点击按钮后,将调用IBAction
。在那里,您可以从itemsToPlay
中选择第一个声音(并将其从此容器中删除)并告诉audioPlayer
播放。
玩家玩完后,调用audioPlayerDidFinishPlaying:successfully:
。在那里,您再次从itemsToPlay
中挑选第一项,并用它重新初始化您的audioPlayer
。再次,说audioPlayer
玩。
当itemsToPlay
为空时,此循环将结束。