0

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

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

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

4

1 回答 1

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];
 }
于 2013-10-08T12:06:35.297 回答