AVAudioPlayer只调用audioPlayerDidFinishPlaying两次

时间:2011-08-22 01:05:28

标签: iphone objective-c avaudioplayer

我正在尝试使用AVAudioPlayer创建一种音频播放列表。所以我使用了以下代码:

·H

<AVAudioPlayerDelegate>
{
    AVAudioPlayer *audioPlayer;
}

@property (nonatomic, retain) AVAudioPlayer *audioPlayer;

的.m

@synthesize audioPlayer;

 - (void)viewDidLoad 
{
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    audioPlayer.numberOfLoops = 0;
    audioPlayer.delegate = self;
    [audioPlayer play];
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
if (flag)
    {
        [player release];

        currentSong = currentSong + 1;
        NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:[songs objectAtIndex:currentSong] ofType:@"mp3"]];

        artist.text = [artists objectAtIndex:currentSong];
        song.text = [songs objectAtIndex:currentSong];

        audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

        audioPlayer.delegate = self;
        audioPlayer.numberOfLoops = 0;

        [audioPlayer initWithContentsOfURL:url error:nil];
        [audioPlayer play];
    }
}

这适用于两首歌曲,但在此之后没有任何音频。知道为什么会这样吗?

谢谢, 丹尼斯

2 个答案:

答案 0 :(得分:1)

在这一行中你正在创建一个音频播放器:

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];

然后你在这一行再次启动它(不需要复制,可能还有一个保留):

 [audioPlayer initWithContentsOfURL:url error:nil];

然后下一次循环出现,即使你使用行

释放它
[player release];

...存在问题,因为它仍在内存中,占用硬件编解码器或浪费资源。尝试删除第二行initWithContents…,因为这是不必要的。

答案 1 :(得分:0)

1.只需保持阵列 2.一旦你创建了audioPlayer的实例 - 添加到数组并调用play并释放audioPlayer的实例(因为它会在你添加到数组后保留)。
3.在audioPlayerDidFinishPlaying中从该数组中删除audioPlayer。

因此,您可以一次播放多个文件