【问题标题】:How to play songs (only songs) from a playlist on iOS?如何在 iOS 上播放列表中的歌曲(仅限歌曲)?
【发布时间】:2012-07-04 17:51:23
【问题描述】:

我正在尝试播放 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 个视频的播放列表后,输出为:

项目数 3
256
256
1
如果查询旨在检索歌曲,并且媒体项目的媒体类型为 MPMediaTypeMovie(256 或 1

有什么建议吗?

【问题讨论】:

    标签: ios5 mpmediaitem mpmediaquery mpmediaitemcollection


    【解决方案1】:

    一种可能的解决方法是使用谓词创建自定义查询。这可以通过使用MPMediaQuery items 数组而不是collections 数组来实现。 collections 数组是 MPMediaItemCollections 的数组。 items 数组是MPMediaItems 的数组,因此您可以通过MPMediaItemPropertyMediaType 过滤查询。 MPMediaItemPropertyMediaType 仅适用于 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];
    

    如果您从 MPMediaQuery collections 数组返回数组,这些 MPMediaPropertyPredicates 将不会过滤。您应该会在日志语句中看到 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.
    }];  
    

    如果您从MPMediaQuery items 返回数组,MPMediaPropertyPredicates 将过滤:

    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];
    

    【讨论】:

    • 这正是我所需要的。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 2016-07-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多