在音频和视频流之间切换时,iOS MPRemoteCommandCenter

时间:2016-05-08 13:58:56

标签: ios avplayer

我正在处理音乐/视频流媒体应用,我正在使用[~] |14> stack array([ 0.091698 , 0.69801199, 0.88459301, 0.83468097, 0.50044298, 0.229835 , 0.429932 , 0.989021 , 0. ]) [~] |15> print stack [ 0.091698 0.69801199 0.88459301 0.83468097 0.50044298 0.229835 0.429932 0.989021 0. ] [~] |16> print str(stack) [ 0.091698 0.69801199 0.88459301 0.83468097 0.50044298 0.229835 0.429932 0.989021 0. ] [~] |17> print repr(str(stack)) '[ 0.091698 0.69801199 0.88459301 0.83468097 0.50044298 0.229835\n 0.429932 0.989021 0. ]' [~] |18> repr(stack[5]) '0.22983500000000001' 来加载视频和歌曲。

我有一个处理音乐播放的音乐播放器类的单例实例。我已经在代码片段中添加了相关的音频会话和命令中心设置:

AVPlayer

一切正常我直到开始播放视频。在视频播放期间,命令中心开始接受视频的暂停/播放命令,暂停/恢复视频。有时,它会使歌曲在后台继续播放。

这是序列:

  1. 开始播放歌曲
  2. 暂停歌曲
  3. 开始播放视频
  4. 结束视频
  5. 但是当我恢复歌曲播放时(通过视图控制器控件),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)) 按钮显示为灰色,我无法设置它们。开始一首新歌(它完成音频会话的大部分设置等)也不起作用。
  6. 在播放任何歌曲之前开始播放视频并结束播放视频会使所有未来歌曲流的命令中心按钮变灰。 。

    我希望能够将命令中心编程为从接收音乐(单例实例)的远程命令到视频(常规实例)并返回到暂停的Singleton实例歌曲。

1 个答案:

答案 0 :(得分: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()
        })`

然后,在我AVPlayerViewController的{​​{1}}中,我检查了我的音频播放器的单例实例是否有播放/暂停的歌曲。如果是这样,我在该单例实例中设置一个名为viewDidLoad的变量到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_Open,并告诉音乐播放器再次设置其命令中心设置。 BAM。

false