2016-05-08 157 views
0

我正在製作音樂/視頻流應用程序,並且我正在使用AVPlayer加載視頻和歌曲。iOS MPRemoteCommandCenter在音頻和視頻流之間切換時

我有一個處理音樂播放的音樂播放器類的單例實例。我已經包含的代碼片段與相關音頻會話和指揮中心設置:

let audio_Session: AVAudioSession = AVAudioSession.sharedInstance() 

     do { 
      try audio_Session.setCategory(AVAudioSessionCategoryPlayback) 
     } catch _ { 
     } 
     do { 
      try audio_Session.setActive(true) 
     } catch _ { 
     } 

     UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 
     if UIApplication.sharedApplication().canBecomeFirstResponder() { 
      UIApplication.sharedApplication().becomeFirstResponder() 
     } 

let now_Playing_Command: MPRemoteCommandCenter = MPRemoteCommandCenter.sharedCommandCenter() 
     now_Playing_Command.pauseCommand.addTarget(self, action: #selector(self.pause_Command)) 
     now_Playing_Command.playCommand.addTarget(self, action: #selector(self.play_Command)) 
     now_Playing_Command.nextTrackCommand.addTarget(self, action: #selector(self.next_Track_Command)) 
     now_Playing_Command.togglePlayPauseCommand.addTarget(self, action: #selector(self.toggle_Play_Pause)) 
     now_Playing_Command.previousTrackCommand.addTarget(self, action: #selector(self.previous_Track_Command)) 

一切正常,直到我開始流式視頻。在視頻播放過程中,指揮中心開始接受視頻的暫停/播放命令,暫停/恢復視頻。有時,它會導致歌曲在後臺繼續播放。

這是序列:

  1. 開始串流歌曲
  2. 暫停歌曲
  3. 開始串流視頻
  4. 端視頻
  5. 但是當我恢復播放樂曲(經由視圖控制器控制),MPCommandCenter按鈕變灰,我不能設置它們。開始一首新歌曲(其中大部分音頻會話等設置都不起作用)也不起作用。

在播放任何歌曲之前開始播放視頻並結束播放所有未來歌曲流的命令中心按鈕。

我希望能夠編程命令中心,從接收來自音樂(單例實例)的遠程命令到視頻(常規實例)的無縫轉換,並返回到暫停的Singleton實例歌曲。

回答

0

我解決了我的問題。我在這裏張貼,因爲它可能會幫助未來的人。

我的歌曲播放是由我自己構建的AVPlayer的自定義sharedInstance單例實例處理的。

我還創建了一個自定義AVPlayerViewController,它只處理視頻播放並且是無狀態的,因此當用戶解散視頻時,視頻將永遠消失。

從我的父母VC中,我實例化並顯示了我的自定義AVPlayerViewController,它僅用於視頻。

let mainStoryBoard:UIStoryboard = UIStoryboard(name:"Main", bundle:nil) 

     //Create View Controllers 
     let video_VC:VideoViewController = mainStoryBoard.instantiateViewControllerWithIdentifier("video_View_Controller") as! VideoViewController 

     video_VC.url = url 
     video_VC.video_Holder = video_Holder 
     video_VC.player = AVPlayer(URL: url) 


     self.presentViewController(video_VC, animated: true, completion: { void in 
      video_VC.player?.play() 
     })` 

然後,在我AVPlayerViewControllerviewDidLoad,我檢查,看看是否我的音頻播放器的單實例是具有播放任何歌曲/暫停。如果是這樣,我在該單例實例中設置一個名爲is_Variable_Open的變量爲true。此時,音樂播放器功能將忽略所有命令中心命令。此外,我再次啓用命令按鈕並將它們設置爲僅處理視頻流的AVPlayerViewController的實例。

override func viewDidLoad() { 
if(media().sharedInstance.playerItem != nil){ 
      print("there is a song playing, so lets pause it") 
      media().sharedInstance.is_Video_Player_Open = true 
      if(media().sharedInstance.player?.rate == 1){ 
       media().sharedInstance.player.pause() 
      } 

      let now_Playing_Command: MPRemoteCommandCenter = MPRemoteCommandCenter.sharedCommandCenter() 
      now_Playing_Command.pauseCommand.enabled = true 
      now_Playing_Command.pauseCommand.addTarget(self, action: #selector(self.pause_Command)) 
      now_Playing_Command.playCommand.enabled = true 
      now_Playing_Command.playCommand.addTarget(self, action: #selector(self.play_Command)) 
      now_Playing_Command.togglePlayPauseCommand.enabled = true 
      now_Playing_Command.togglePlayPauseCommand.addTarget(self, action:#selector(self.toggle_Play_Pause)) 

然後在該視頻的解僱,在viewWillDisappear,我設置變量is_Video_Player_Openfalse,並告訴音樂播放器重新設置其指揮中心設置。 BAM。

override func viewWillDisappear(animated: Bool) { 
     print("video player is about to disapear") 

     if(media().sharedInstance.playerItem != nil){ 
      print("video is about to end, and there is ssog playing, so lets do stuff") 
      media().sharedInstance.is_Video_Player_Open = false 
      media().sharedInstance.set_MP_Command() 
      media().sharedInstance.set_Now_Playing() 
     } 
    }