我正在使用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");
}
我现在意识到副作用是错误的,因为整个用户界面在正在播放的文件期间被锁定。
我知道我应该使用:
但我不知道audioPlayerDidFinishPlaying应该如何准确知道哪个文件已经播放完毕。
我认为它可能就像 - (void)animationDidStop,您可以使用valueForKeyPath来确定哪个文件已播放完毕。
是否必须手动跟踪?
任何有关我指向正确方向的建议都将不胜感激。
谢谢。
答案 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
}
}