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 に答える