audioPlayerDidFinishPlaying如何知道哪个文件已完成?

时间:2011-03-17 17:49:28

标签: iphone objective-c ios avaudioplayer

我正在使用AVAudioPlayer播放15个音频文件。音频文件需要以5个为一组播放,每组有3个文件。集合中的三个文件不会更改。播放集的顺序可能会发生变化。

我尝试使用isPlaying的while循环:

while ([backgroundSound isPlaying]) {
    NSLog(@"First while loop");
}
backgroundSoundPath = [[NSBundle mainBundle] pathForResource:@"Set0File1" ofType:@"mp3"]; // *Music filename* 
backgroundSound =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:backgroundSoundPath] error:nil];
[backgroundSound prepareToPlay];
[backgroundSound play];
while ([backgroundSound isPlaying]) {
    NSLog(@"Second while loop");
}
backgroundSoundPath = [[NSBundle mainBundle] pathForResource:@"Set0File2" ofType:@"mp3"]; // *Music filename* 
backgroundSound =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:backgroundSoundPath] error:nil];
[backgroundSound prepareToPlay];
[backgroundSound play];
while ([backgroundSound isPlaying]) {
    NSLog(@"Third while loop");
} 

我现在意识到副作用是错误的,因为整个用户界面在正在播放的文件期间被锁定。

我知道我应该使用:

  • (void)audioPlayerDidFinishPlaying :( AVAudioPlayer *)播放器成功:(BOOL)标志

但我不知道audioPlayerDidFinishPlaying应该如何准确知道哪个文件已经播放完毕。

我认为它可能就像 - (void)animationDidStop,您可以使用valueForKeyPath来确定哪个文件已播放完毕。

是否必须手动跟踪?

任何有关我指向正确方向的建议都将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:8)

当AVAudioPlayer调用audioPlayerDidFinishPlaying方法时,它会将自身作为参数提供。所以你要做的就是检查URL,找出刚刚播放完毕的文件。

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
     if ([player.url isEqual:url1])
     {
         // file which is in url1 stopped playing
     }
     else if ([player.url isEqual:url2])
     {
         // file which is in url2 stopped playing
     }
}