检测AVPlayerViewController是否正在播放视频或缓冲并向播放器添加叠加层

时间:2016-08-03 14:11:59

标签: ios swift avplayer avplayerviewcontroller

  1. 我必须检测视频是处于播放还是缓冲模式。我正在从URL加载视频。我已经尝试了下面的代码,我可以在视频开始播放后跟踪,但不能在它处于缓冲状态时跟踪。
  2. 另外,我想在播放器中添加叠加视图。我试图在AVPlayer中添加叠加层,但在全屏模式下叠加层消失。
  3. 需要一些建议。提前致谢。以下是我的代码:

        let playerAV = AVPlayerViewController()
        var player = AVPlayer()
        player = AVPlayer(URL: url)
        print(url)
        playerAV.player = player
        playerAV.view.frame = CGRectMake(0, 0,  self.videoView.frame.width,  self.videoView.frame.height)
        self.addChildViewController(playerAV)
        self.videoView.addSubview(playerAV.view)
        playerAV.didMoveToParentViewController(self)
        playerAV.player?.play()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ChannelDetailViewController.notificationObserver(_:)), name:AVPlayerItemDidPlayToEndTimeNotification , object: player.currentItem)
            _ = UIDevice.beginGeneratingDeviceOrientationNotifications
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ChannelDetailViewController.deviceOrientationDidChange(_:)) , name:
            UIDeviceOrientationDidChangeNotification, object: nil)
        player.addObserver(self, forKeyPath: "rate", options: NSKeyValueObservingOptions.New, context: nil)
      player.addPeriodicTimeObserverForInterval(CMTime(value: 1, timescale: 3), queue: dispatch_get_main_queue()) { [weak self] time in
        self?.handlePlayerStatus(time)
      }
    
      func handlePlayerStatus(time: CMTime) {
         if player.status == .ReadyToPlay {
         // buffering is finished, the player is ready to play
         print("playing")
      }
      if player.status == .Unknown{
        print("Buffering")
      }
     }
    
     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 player.currentItem!.status == AVPlayerItemStatus.ReadyToPlay{
                if rate != 0 && player.error == nil {
    
                  print("normal playback")
                }
                else{
                  print("playback stopped")
                }
    
              }else if player.currentItem?.status == AVPlayerItemStatus.Unknown{
                print("test")
              }
            }
        }
        print("you are here")
    }
    

    check here for project

2 个答案:

答案 0 :(得分:1)

  1. 检查我的答案:https://stackoverflow.com/a/38867386/5109911,这会告诉您如何检查播放器是否正在加载缓冲区,检查是否已准备好播放,您必须同时检查player.currentItem.status和{{ 1}}

  2. 要向AVPlayer添加叠加层,我建议您在AVPlayer图层上方使用player.status

答案 1 :(得分:1)

我对类似的问题采取了稍微不同的方法 - 当AVPlayer开始实际播放时更新UI(在我们的例子中,它是音频播放,但同样的原则适用)。

我们使用边界时间在播放开始时执行一个块 - 特别是在播放的1/3秒后 - 在可听回放的同时更新UI:

let times = [NSValue(time:CMTimeMake(1,3))]
_ = self.player.addBoundaryTimeObserver(forTimes: times, queue: DispatchQueue.main, using: {
    [weak self] time in
    // Code to update the UI goes here, e.g.
    self?.someUIView.isHidden = false
})

我在公司博客上详细介绍了该方法(以及示例Xcode项目):http://www.artermobilize.com/blog/2017/02/09/detect-when-ios-avplayer-finishes-buffering-using-swift/

关于问题#2,我同意Marco的建议,即使用UIView覆盖AVPlayer层。