如何在 iOS 上播放列表中的歌曲(仅限歌曲)?
Posted
技术标签:
【中文标题】如何在 iOS 上播放列表中的歌曲(仅限歌曲)?【英文标题】:How to play songs (only songs) from a playlist on 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 个视频的播放列表后,输出为:
项目数 32562561 如果查询旨在检索歌曲,并且媒体项目的媒体类型为 MPMediaTypeMovie(256 或 1
有什么建议吗?
【问题讨论】:
【参考方案1】:
一种可能的解决方法是使用谓词创建自定义查询。这可以通过使用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];
如果您从 MPMediaQuery
collections
数组返回数组,这些 MPMediaPropertyPredicate
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.
];
如果您从MPMediaQuery
items
返回数组,MPMediaPropertyPredicate
s 将过滤:
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];
【讨论】:
这正是我所需要的。非常感谢您的帮助。以上是关于如何在 iOS 上播放列表中的歌曲(仅限歌曲)?的主要内容,如果未能解决你的问题,请参考以下文章
关闭应用程序后,Android 媒体播放器如何继续播放歌曲?
我可以在 iOS 中使用 iPodMusicPlayer 播放文档目录中的歌曲吗?
在播放 iOS 中的下一首歌曲之前,我是不是需要先停止 MusicPlayerController?