0

i want to check if AVPlayerViewController is playing video or its still buffering.i also want to add overlay view in this AVPlayerViewController with next and previous button. with the following code my video is buffering but it shows normal playback.i want to track if its playing or its in pause or its in buffering stage.

    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")
}
Prashant Ghimire
  • 518
  • 4
  • 20

1 Answers1

1

In order to check the state of the player you can add a periodic time observer:

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

Inside handlePlayerStatus you check for the state:

func handlePlayerStatus(time: CMTime) {
    if player.status == .ReadyToPlay {
         // buffering is finished, the player is ready to play
    }
}
fiks
  • 1,045
  • 9
  • 21