3

iPodのプレイリストから曲を再生しようとしています。プレイリストにも動画が含まれている可能性がある限り、その中の曲だけを再生したいと思います。

    MPMusicPlayerController *mp = [MPMusicPlayerController applicationMusicPlayer];

    MPMediaQuery *query = [MPMediaQuery songsQuery];

    query.groupingType = MPMediaGroupingPlaylist;

    NSArray *playlists = [query collections];

    BOOL found = NO;

    for(MPMediaPlaylist *playlist in playlists)
    {
        NSString *name = [playlist valueForProperty:MPMediaPlaylistPropertyName];
        if([name caseInsensitiveCompare:@"MyPlaylist"] == NSOrderedSame && [playlist count] > 0)
        {
            MPMediaItemCollection *collection = [MPMediaItemCollection collectionWithItems:playlist.items];
            [mp setQueueWithItemCollection:collection];
            found = YES;
            NSLog(@"items count %d", [playlist count]);
            for (MPMediaItem *item in [collection items]){
                NSLog(@"%@", [item valueForKey:MPMediaItemPropertyMediaType]);
            }
            break;
        }
    }

1曲2ビデオのプレイリストをロードすると、出力は次のようになります。

アイテム数3256256 1クエリが曲を取得することを目的としていて、メディアアイテムのメディアタイプがMPMediaTypeMovie(
256または1 << 8)である場合、なぜビデオも取得するのかわかりません。



なにか提案を?

4

1 に答える 1

12

考えられる回避策の1つは、述語を使用してカスタムクエリを作成することです。MPMediaQuery itemsこれは、アレイではなくアレイを使用して実装できますcollectionscollections配列はsの配列ですMPMediaItemCollectionitems配列はsの配列であるためMPMediaItem、クエリを。でフィルタリングできますMPMediaItemPropertyMediaTypeMPMediaItemPropertyMediaTypeにのみ適用され、には適用されMPMediaItemませんMPMediaItemCollection

再生リストのタイトルとメディアタイプに基づいた一連の述語を使用してクエリを初期化します。これにより、再生リストが選択され、クエリからすべての動画が除外されます。

NSString *playlistName = @"MyPlaylist";
MPMediaPropertyPredicate *playlistPredicate = [MPMediaPropertyPredicate predicateWithValue:playlistName
                                                                               forProperty:MPMediaPlaylistPropertyName];

NSNumber *mediaTypeNumber = [NSNumber numberWithInteger:MPMediaTypeMusic]; // == 1
MPMediaPropertyPredicate *mediaTypePredicate = [MPMediaPropertyPredicate predicateWithValue:mediaTypeNumber
                                                                                forProperty:MPMediaItemPropertyMediaType];

NSSet *predicateSet = [NSSet setWithObjects:playlistPredicate, mediaTypePredicate, nil];
MPMediaQuery *mediaTypeQuery = [[MPMediaQuery alloc] initWithFilterPredicates:predicateSet];
[mediaTypeQuery setGroupingType:MPMediaGroupingPlaylist];

MPMediaPropertyPredicate配列から配列を返す場合、これらはフィルタリングされませんMPMediaQuery collections。ログステートメントに1以外のメディアアイテムタイプが表示されるはずです。

NSArray *playlistCollections = [mediaTypeQuery collections];

[playlistCollections enumerateObjectsUsingBlock:^(MPMediaPlaylist *playlist, NSUInteger idx, BOOL *stop) {
    NSLog (@"Playlist title: %@", [playlist valueForProperty:MPMediaPlaylistPropertyName]);
    NSArray *songs = [playlist items];
    [songs enumerateObjectsUsingBlock:^(MPMediaItem *song, NSUInteger idx, BOOL *stop) {
        NSString *songTitle = [song valueForProperty:MPMediaItemPropertyTitle];
        NSInteger mediaValue = [[song valueForProperty:MPMediaItemPropertyMediaType] integerValue];
        if (mediaValue != 1) 
            NSLog(@"title: %@ - media type value: %d", songTitle, mediaValue);
    }]; // Should return other media types here.
}];  

MPMediaPropertyPredicate配列を次の場所から返す場合、sはフィルタリングされますMPMediaQuery items

NSArray *playlistItems = [mediaTypeQuery items];

[playlistItems enumerateObjectsUsingBlock:^(MPMediaItem *song, NSUInteger idx, BOOL *stop) {
    NSString *songTitle = [song valueForProperty: MPMediaItemPropertyTitle];
    NSInteger mediaValue = [[song valueForProperty:MPMediaItemPropertyMediaType] integerValue];
    if (mediaValue != 1) 
        NSLog(@"title: %@ - media type value: %d", songTitle, mediaValue);
}]; // Should return nothing here.

songsQuery:でmediaTypePredicateのみを使用して、ライブラリ全体にメディアタイプフィルターを適用することもできます。

MPMediaQuery *query = [MPMediaQuery songsQuery];
[query setGroupingType:MPMediaGroupingPlaylist];
[mediaTypeQuery addFilterPredicate:mediaTypePredicate];
NSArray *playlists = [query items];
于 2012-07-06T18:39:27.440 に答える