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?

使用pygame自动完成歌曲后如何播放文件中的下一首歌曲

如何在 Spotify 上播放专辑中的曲目,以便之后使用 Spotify App Remote SDK for Android 播放专辑的下一首曲目?

从 tableview 播放音频并前进到列表中的下一个文件

如何从 mediaPickerController 获取 mediaItemCollection 以在 AVPlayer 上播放?

停止下一首曲目从播放列表中删除上一首曲目