Oto*_*Leo 3 mpmediaitem mpmediaitemcollection mpmediaquery ios5
我正在尝试播放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;
}
}
Run Code Online (Sandbox Code Playgroud)
在我加载1首歌曲和2个视频的播放列表后,输出为:
items count 3
256
256
1
我不明白为什么我也会收到视频,如果查询是为了检索歌曲,而媒体项目的媒体类型是MPMediaTypeMovie(256或1 << 8).
有什么建议吗?
Bry*_*uby 12
一种可能的解决方法是使用谓词创建自定义查询.这可以通过使用MPMediaQuery items数组而不是collections数组来实现.该collections数组是一个MPMediaItemCollections 数组.该items数组是一个MPMediaItems 数组,因此您可以通过过滤查询MPMediaItemPropertyMediaType.MPMediaItemPropertyMediaType仅适用于a MPMediaItem而非a 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];
Run Code Online (Sandbox Code Playgroud)
MPMediaPropertyPredicate如果从MPMediaQuery collections阵列返回数组,则不会过滤这些s .您应该在日志语句中看到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.
}];
Run Code Online (Sandbox Code Playgroud)
该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.
Run Code Online (Sandbox Code Playgroud)
您还可以通过以下方式仅使用mediaTypePredicate将媒体类型过滤器应用于整个库songsQuery:
MPMediaQuery *query = [MPMediaQuery songsQuery];
[query setGroupingType:MPMediaGroupingPlaylist];
[mediaTypeQuery addFilterPredicate:mediaTypePredicate];
NSArray *playlists = [query items];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5528 次 |
| 最近记录: |