MediaItemCollection 中的下一首歌曲?
Posted
技术标签:
【中文标题】MediaItemCollection 中的下一首歌曲?【英文标题】:Next Song in MediaItemCollection? 【发布时间】:2014-05-19 12:35:19 【问题描述】:如何找出MPMediaItem
收藏中下一个要播放的项目的名称?我更愿意将其存储为MPMediaItem
。
我有一个songsViewController
,其中包含所有歌曲的tableView
。这是我的didSelectRowAtIndexPath
代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
MPMediaItem *selectedItem;
selectedItem = [[songs objectAtIndex:indexPath.row] representativeItem];
MPMusicPlayerController *musicPlayer = [MPMusicPlayerController iPodMusicPlayer];
[musicPlayer setQueueWithItemCollection:[MPMediaItemCollection collectionWithItems:[songsQuery items]]];
[musicPlayer setNowPlayingItem:selectedItem];
nowPlayingViewController *nowPlaying = [[rightSideMenuViewController alloc]
initWithNibName:@"nowPlayingViewController" bundle:nil];
[self presentViewController:nowPlaying animated:YES completion:nil];
[musicPlayer play];
我的nowPlayingViewController
上有一个UILabel
,当用户选择一首歌曲时它会弹出。我想将下一个项目的标题存储在 MediaItemCollection
/queue 中,以便在 UILabel
中 - 所以它是下一首歌曲的预览。
任何帮助将不胜感激,谢谢! :)
【问题讨论】:
如果您跟踪MPMediaItemCollection
,您可以使用[musicPlayer indexOfNowPlayingItem]
知道下一个是哪一个。
我该如何使用它?我一直在尝试一些事情,但我不确定我是否正确使用它:S
保存[songsQuery items]
,这是一个NSArray
。下一个音乐应该是:MPMediaItem *nextItem = [musicPlayer indexOfNowPlayingItem]+1;
。好吧,我没有尝试,您可能必须检查此索引是否存在(我的意思是,如果您的 nowPlayingItem 已经是最后一个,等等以避免超出范围的错误)
是的,我得到两个错误 - 1) 不兼容的整数到指针转换初始化 'MPMediaItem *__strong' 使用类型为 'unsigned long 的表达式和 2) 隐式ARC 不允许将“unsigned long”转换为“MPMediaItem *”
你能具体展示一下你尝试了什么吗?
【参考方案1】:
保留您的列表(因为您无法在音乐播放器队列中访问)。
@property (nonatomic, strong) NSArray *playlist;
当你这样做时:
[musicPlayer setQueueWithItemCollection:[MPMediaItemCollection collectionWithItems:[songsQuery items]]];
添加:
playlist = [songsQuery items];
获取上一个/下一个:
-(MPMediaItem *)nextItem
int currentIndex = [musicPlayer indexOfNowPlayingItem];
MPMediaItem *nextItem = [playlist objectAtIndex:currentIndex+1];
return nextItem
-(MPMediaItem *)previousItem
int currentIndex = [musicPlayer indexOfNowPlayingItem];
MPMediaItem *previousItem = [playlist objectAtIndex:currentIndex-1];
return previousItem;
重要提示:
我没有检查当前项目是否是playlist
中的第一个/最后一个(根据您是否想要上一个/下一个)项目。所以要小心NSArray
的边界,否则你会得到:
NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index Z beyond bounds [X .. Y]
previousItem
“存在”吗? nextItem
“存在”吗?
您可能还需要查看:
@property (nonatomic) MPMusicRepeatMode repeatMode
如果nextItem
可能是第一项,或者上一项是最后一项。
【讨论】:
【参考方案2】:MPMusicPlayerController 提供以下实例方法来快速跳到下一首或上一首歌曲:
[musicPlayer skipToNextItem];
[musicPlayer skipToPreviousItem];
【讨论】:
以上是关于MediaItemCollection 中的下一首歌曲?的主要内容,如果未能解决你的问题,请参考以下文章
在播放 iOS 中的下一首歌曲之前,我是不是需要先停止 MusicPlayerController?
如何在 Spotify 上播放专辑中的曲目,以便之后使用 Spotify App Remote SDK for Android 播放专辑的下一首曲目?
如何从 mediaPickerController 获取 mediaItemCollection 以在 AVPlayer 上播放?