2

我正在开发一个与 iOS 上的 iPod Music 应用程序集成的应用程序。它显示不同的音乐分组(即 MPMediaItemCollections),并允许用户使用 [MPMusicPlayerController ipodMusicPlayer] 在音乐应用程序中播放这些分组。

我的问题是我很难让随机播放功能在我的应用程序和音乐应用程序之间以相同的方式工作。当我播放歌曲时,我会调用:

MPMusicPlayerController* musicPlayer = [MPMusicPlayerController iPodMusicPlayer];
[musicPlayer stop];
MPMediaItemCollection* collection = [self.displayedContainerGroup getMediaItemCollection];
[musicPlayer setQueueWithItemCollection:collection];
[musicPlayer setNowPlayingItem:[container getMediaItem];
[musicPlayer play];

如果关闭随机播放,这将非常有用。如果用户选择一首歌曲(它是专辑的一部分),则会在音乐应用程序中播放专辑并从指定的歌曲开始播放。

但是,如果打开了随机播放,这似乎是先随机播放歌曲,然后按照它们刚刚随机播放的顺序跳转到新的 nowPlayingItem。这样做的问题是,除非 nowPlayingItem 被随机播放到第一个命令,它最终不会播放专辑中的所有歌曲。

MPMusicPlayerController 文档谈到 nowPlayingItem:“要指定播放应该从播放队列中的特定媒体项目开始,请在音乐播放器停止或暂停时将此属性设置为该项目。”

所以,我想知道是否有一种方法可以使这项工作适用于随机播放模式 - 从专辑中的一首用户选择的歌曲开始,然后播放所有其他随机播放的歌曲。还是我应该只创建一个自定义 MPMediaItemCollection 并为此自己洗牌?

4

2 回答 2

1

这似乎奏效了;我不得不关闭随机播放,添加歌曲,切换到正在播放的项目,然后重新打开随机播放:

[musicPlayer stop];
BOOL shuffleWasOn = NO;
if (musicPlayer.shuffleMode != MPMusicShuffleModeOff)
{
     musicPlayer.shuffleMode = MPMusicShuffleModeOff;
     shuffleWasOn = YES;
}
[musicPlayer setQueueWithItemCollection:mediaItemCollectionIn];
[musicPlayer setNowPlayingItem:mediaItemIn];
if (shuffleWasOn)
     musicPlayer.shuffleMode = MPMusicShuffleModeSongs;

[musicPlayer play];
于 2014-02-27T20:06:25.727 回答
1

这是DivideByZer0 答案的 Swift 4 实现。我已经将代码重组为两个函数,stop()play(),它们也可以独立使用来停止和播放。

重要:一个重要的区别,我发现调用shuffleMode musicPlayer.stop()需要存储。shuffleMode有时调用后会发生变化musicPlayer.stop()

let musicPlayer = MPMusicPlayerController.systemMusicPlayer
private var shuffleMode = MPMusicPlayerController.systemMusicPlayer.shuffleMode

private func stop() {
    shuffleMode = musicPlayer.shuffleMode
    musicPlayer.shuffleMode = MPMusicShuffleMode.off

    musicPlayer.stop()
}

private func play() {
    musicPlayer.shuffleMode = shuffleMode

    musicPlayer.prepareToPlay()
    musicPlayer.play()
}

func play(itemCollection: MPMediaItemCollection, startingAt index: Int) {
    stop()

    musicPlayer.setQueue(with: itemCollection)
    musicPlayer.nowPlayingItem = itemCollection.items[index]

    play()
}
于 2018-03-25T13:26:21.423 回答