ios5 - 如何从 iOS 上的播放列表播放歌曲(仅歌曲)?

标签 ios5 mpmediaitem mpmediaquery mpmediaitemcollection

我正在尝试播放 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 << 8),我不明白为什么我也会获取视频。

有什么建议吗?

最佳答案

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

这些 MPMediaPropertyPredicate如果您从 MPMediaQuery 返回数组,s 将不会过滤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如果您从 MPMediaQuery 返回数组,s 将进行过滤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];

关于ios5 - 如何从 iOS 上的播放列表播放歌曲(仅歌曲)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11333577/

相关文章:

ios - UILocalizedIndexedCollat​​ion - MPMediaQuery

iphone - 使用 MPMediaPropertyPredicate 搜索多种类型

iphone - 你如何在 iOS5 的 UISearchBar 中更改字体?

ios - 如何在单击按钮期间调整 UIView 框架的大小?

iphone - iOS向前兼容或向后兼容

ios - iOS 4.3 中消失的导航栏颜色

ios - 以编程方式将歌曲从 iTunes 云下载到本地设备

ios - 如何在 iOS 中获取 iPod 库中歌曲的文件位置

ios - 如何在 SwiftUI 列表中显示 MPMediaItem 图稿?

ios - 使用 Swift 2 编程从持久 ID 中查找歌曲