检查AVPlayer的播放状态并将覆盖视图添加到AVPlayerViewController中

问题描述:

我想检查AVPlayerViewController是否正在播放视频或其仍然缓冲。我还希望通过下一个和上一个按钮在此AVPlayerViewController中添加叠加视图。 使用下面的代码我的视频缓冲,但它显示正常playback.i想要跟踪如果它的播放或其暂停或其缓冲阶段。检查AVPlayer的播放状态并将覆盖视图添加到AVPlayerViewController中

let playerAV = AVPlayerViewController() 
    var player = AVPlayer() 
    let videoURL = NSURL(string: "https://clips.vorwaerts-gmbh.d e/big_buck_bunny.mp4") 
    player = AVPlayer(URL:videoURL!) 
    playerAV.player = player 
    playerAV.view.frame = self.movieView.frame 
    self.addChildViewController(playerAV) 

    self.movieView.addSubview(playerAV.view) 
    playerAV.didMoveToParentViewController(self) 

    playerAV.contentOverlayView?.addSubview(viewNext) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.notificationObserver(_:)), name:AVPlayerItemDidPlayToEndTimeNotification , object: player.currentItem) 

    player.addObserver(self, forKeyPath: "rate", options: NSKeyValueObservingOptions.New, context: nil) 
    _ = UIDevice.beginGeneratingDeviceOrientationNotifications 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.deviceOrientationDidChange(_:)) , name: 
     UIDeviceOrientationDidChangeNotification, object: nil) 


override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
    if keyPath == "rate" { 
     if let rate = change?[NSKeyValueChangeNewKey] as? Float { 
      if rate == 0.0 { 
       print("playback stopped") 
      } 
      if rate == 1.0 { 
       print("normal playback") 
      } 
      if rate == -1.0 { 
       print("reverse playback") 
      } 
     } 
    } 
    print("you are here") 
} 

为了检查你可以添加一个周期性时间观察球员的状态:

player.addPeriodicTimeObserverForInterval(CMTime(value: 1, timescale: 3), queue: dispatch_get_main_queue()) { [weak self] time in 
    self?.handlePlayerStatus(time) 
} 

里面handlePlayerStatus您检查状态:

func handlePlayerStatus(time: CMTime) { 
    if player.status == .ReadyToPlay { 
     // buffering is finished, the player is ready to play 
    } 
} 
+0

它仍然没有工作。 。它仍然缓冲,但accourding到你的handleplayerstatu它说缓冲结束 –

+0

什么是不工作? – fiks

+0

它仍然在缓冲模式,但/ /缓冲完成后,玩家准备玩正在调用。 –