从plist(NSArray)中选择歌曲并使用AVAudioPlayer播放?

时间:2011-04-20 19:09:40

标签: ios audio avaudioplayer

我是一名正在进行编码练习的学生,我很难过!

我的应用程序中有两个AVAudioPlayer实例 - 我可以使用直接路径将歌曲加载到每个播放器中没问题。

我希望能够在每个播放器上播放阵列中的多首歌曲。

这可能吗?如果是这样,我该怎么做呢?

在我的plist中,我将键设置为“One.mp3”作为字符串,将值设置为文件的路径...(正在猜测该部分)。

感谢您的任何见解。

- (void)viewDidLoad {
    [super viewDidLoad];

    //multiple song array

    NSString *soundsPath = [[NSBundle mainBundle] pathForResource:@"soundslist" 
                                                           ofType:@"plist"];

    soundsList = [[NSArray alloc] initWithContentsOfFile:soundsPath];

    NSString* filename = [soundsList objectAtIndex:0];
    NSString *path = [[NSBundle mainBundle] pathForResource:filename 
                                                     ofType:@"mp3"];  

    AVAudioPlayer * newAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] 
                                                                    error:NULL];  
    self.audioPlayer = newAudio; // automatically retain audio and dealloc old file if new file is loaded

    [newAudio release]; // release the audio safely

    audioPlayer.delegate = self; 
    [audioPlayer prepareToPlay];
    [audioPlayer setNumberOfLoops:0];
    [audioPlayer play];
}

1 个答案:

答案 0 :(得分:1)

听起来你想尝试在一个播放器上播放多首歌曲。这不可能如AVAudioPlayer Overview(第4章)中所述。可以使用多个AVAudioPlayers播放多首歌曲。像这样:

NSMutableArray *audioPlayers = [NSMutableArray arrayWithCapacity:[soundsList count]];

for (NSString *soundPath in soundsList) {
    NSError *error = nil;

    AVAudioPlayer *audioPlayer = [AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error];
    [audioPlayers addObject:audioPlayer];

    audioPlayer.delegate = self; 
    [audioPlayer prepareToPlay];
    [audioPlayer setNumberOfLoops:0];
    [audioPlayer play];
}

我建议您对文件路径进行硬编码,而不是使用plist读取它。一旦你开始工作,你就可以尝试用plist读取它。像这样的东西会起作用:

NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"One" withExtension:@"mp3"];
AVAudioPlayer *soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error]

这样,您可以删除一个级别的间接和一个故障点。