AVAudioPlayer的iOS音乐库播放问题

时间:2013-10-08 05:28:22

标签: ios objective-c avaudioplayer itunes

我正在使用多个AVAudioPlayer实例,只需按一下按钮即可播放不同的音乐床(100个按钮--100首不同的歌曲)。我将url存储在xml文件中的资源(例如ipod-library://item/item.m4a?id = -6327897134951324787),当我需要播放歌曲时,我用这个url初始化一个AVAudioPlayer。

现在问题:如果我在播放器中加载所有100首歌曲,退出Xcode中的应用程序(在这种情况下类似于崩溃 - 意外退出)并再次执行,下次我开始该应用程序,iPod库的网址将不再有效,因此我无法播放歌曲。音乐库存在一个问题,即我没有正确关闭与其资源的连接。

问题在于我无法阻止用户从后台丢弃应用程序,因此会终止与音乐库的所有连接。这个问题非常复杂。有趣的是,每当发生这种情况时,那些在我的应用程序中被“杀死”的文件也无法在iPod库中播放,因此出现了严重错误。

1 个答案:

答案 0 :(得分:0)

我有类似的问题。但是我使用了MPMusicPlayerController

我需要保存音乐库中选定的音乐信息以便稍后播放,但我不能。

我将音乐数据存储在NSUserDefaults

这是我的代码

- (void) mediaPicker: (MPMediaPickerController *) mediaPicker didPickMediaItems: (MPMediaItemCollection *) mediaItemCollection
{
if (mediaItemCollection) {

    [appDel.musicPlayer setQueueWithItemCollection: mediaItemCollection];
    if ([mediaItemCollection count] >0) {
        [appDel.musicPlayer play];
    }
    NSArray* items = [mediaItemCollection items];
    NSMutableArray* listToSave = [[NSMutableArray alloc] initWithCapacity:0];
    for (MPMediaItem *mpItem in items) {
        NSNumber *persistentId = [mpItem valueForProperty:MPMediaItemPropertyPersistentID];
        [listToSave addObject:persistentId];
    }

    int songId = [[[NSUserDefaults standardUserDefaults] objectForKey:@"lastID"] intValue];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:listToSave];
    if (editting) {
        [[NSUserDefaults standardUserDefaults] setObject:data forKey:[NSString stringWithFormat:@"song%@",edittingSong.sqlId]];
    }
    else
    {
        [[NSUserDefaults standardUserDefaults] setObject:data forKey:[NSString stringWithFormat:@"song%d",songId+1]];
    }
    [[NSUserDefaults standardUserDefaults] synchronize];
    [self updateMusicInfo];
}

[self dismissModalViewControllerAnimated: YES];
}

您可以使用任何您想要的密钥。

读取数据并在播放器中设置队列。

NSMutableArray *theList = [[NSMutableArray alloc] initWithCapacity:0];
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:[NSString stringWithFormat:@"song%@",edittingSong.sqlId]];

NSArray *decodedData = [NSKeyedUnarchiver unarchiveObjectWithData:data];
[theList addObjectsFromArray:decodedData];
NSMutableArray *allTheSongs = [[NSMutableArray alloc] initWithCapacity:0];
for (int i = 0; i < [theList count]; i++) {
    MPMediaQuery *songQuery = [MPMediaQuery songsQuery];
    [songQuery addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:[theList objectAtIndex:i] forProperty:MPMediaItemPropertyPersistentID]];
     NSArray *songs = [songQuery items];
     [allTheSongs addObjectsFromArray: songs];
 }

  f ([allTheSongs count] >0) {
     MPMediaItemCollection *currentQueue = [[MPMediaItemCollection alloc] initWithItems:allTheSongs];
     [appDel.musicPlayer setQueueWithItemCollection:currentQueue];
     [appDel.musicPlayer play];
 }