【问题标题】:Play an MPMediaItemCollection in MPMusicPlayerController shuffled, but let user choose the first item?在 MPMusicPlayerController 中播放 MPMediaItemCollection 随机播放,但让用户选择第一个项目?
【发布时间】:2014-03-31 06:52:54
【问题描述】:

我正在开发一个与 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 并为此自己洗牌?

【问题讨论】:

    标签: ios avfoundation mpmusicplayercontroller mpmediaitem mpmediaitemcollection


    【解决方案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];
    

    【讨论】:

      【解决方案2】:

      这是answer by 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()
      }
      

      【讨论】:

        猜你喜欢
        • 2014-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-09
        • 1970-01-01
        • 2018-08-11
        • 1970-01-01
        相关资源
        最近更新 更多