在avaudioplayer播放下一首歌的问题

时间:2010-12-31 12:47:45

标签: objective-c avaudioplayer

我的委托方法看起来像这样。在播放第一首歌之后,它将进入此方法并播放第二首歌曲,但是当第二首歌曲完成播放时,它将停止播放。它没有进入委托方法。我需要连续播放所有歌曲。我不确定,为什么。有人可以帮助我。

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)p successfully:(BOOL)flag
{
 if (flag == NO)
  NSLog(@"Playback finished unsuccessfully");
 else
 {
  //[player stop];
  index++;
  NSLog(@"%d",index);
  path=[[NSBundle mainBundle] pathForResource:[songlist objectAtIndex:index] ofType:@"mp3"];
  [player initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
  [songlabel2 setTitle:[songlist objectAtIndex:index]];

  [endtime setText:[NSString stringWithFormat:@"%.2f",[player duration]/100]];
  [player play];
         }
}

1 个答案:

答案 0 :(得分:1)

由于你没有定义一个名为player的局部变量,我假设player是用来播放第​​一首歌的实例变量,你用<创建它/ p>

player = [[AVAudioPlayer alloc] initWithContentsOfURL:firstSongURL error:&error];

或类似的东西,你已经设置了委托。在audioPlayerDidFinishPlaying: successfully:方法中,您有

[player initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];

表示您再次向同一个实例发送-initWithContentsOfURL:error:不要在给定对象上调用两次初始化程序。结果是不可预测的,并且存在内存泄漏的可能性。您应该释放以前的AVAudioPlayer实例,例如

[player release];

然后再次使用+alloc-initWithContentsOfURL:error:创建一个新实例,就像您对第一首歌所做的那样,并设置相应的委托:

player = [[AVAudioPlayer alloc] initWithContentsOfURL:secondSongURL error:&error];
player.delegate = self;
[player play];