2013-10-08 188 views
0

我正在使用多個AVAudioPlayer實例按下按鈕(100個按鈕 - 100首不同的歌曲)播放不同的音樂牀。我將URL存儲到xml文件中的資源中(例如,ipod-library://item/item.m4a?id=6327897134951324787),並在需要播放歌曲時使用此URL初始化AVAudioPlayer。iOS音樂庫播放問題與AVAudioPlayer

現在的問題是:如果我在播放器中加載了所有100首歌曲,請退出Xcode的應用程序(在這種情況下,類似於崩潰 - 意外退出),然後再執行幾次,下次啓動應用程序,iPod庫url將不再有效,因此我無法播放這些歌曲,音樂庫有一個問題,因爲我沒有正確關閉與資源的連接。問題是,我無法阻止用戶從後臺丟棄應用程序,從而導致與音樂庫的所有連接中斷。這個問題非常複雜,有趣的是,每當發生這種情況時,那些在我的應用程序中「殺死」的文件也不會在iPod庫中播放,所以出現了一些嚴重錯誤。

有沒有人有任何想法?我非常感謝你們的幫助!

回答

0

我有類似的問題。但我用MPMusicPlayerController

我需要保存選定的音樂信息從音樂庫以後播放,但我couldnt。

我存儲在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]; 
} 
+0

非常感謝您對這個解決方案,但我不能用別的比AVAudioPlayer,我不希望將數據存儲在我的結束,只是引用它,僅此而已,複製的數據是不是一種選擇,因爲我的應用程序可能會映射整個音樂庫。 –