ios - 检查 AVPlayer 的播放状态并将叠加 View 添加到 AVPlayerViewController

标签 ios swift swift2 avplayer avplayerviewcontroller

我想检查 AVPlayerViewController 是否正在播放视频或其仍在缓冲。我还想在此 AVPlayerViewController 中添加带有下一个和上一个按钮的覆盖 View 。 使用以下代码我的视频正在缓冲,但它显示正常播放。我想跟踪它是在播放还是在暂停或在缓冲阶段。

    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
    }
}

关于ios - 检查 AVPlayer 的播放状态并将叠加 View 添加到 AVPlayerViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38612248/

相关文章:

ios - 更改 UISegmentController 中的分隔符颜色?

iphone - 尝试在 iOS 上使用 Restkit - XCode

ios - 更详细的 Swift 惰性属性

swift - 想要从 firebase 获取用户数据到字典中

ios - 如何为约束获取随机 CGFloat?

ios - iOS 中有 MKSquare 吗?

ios - Drupal 和 Objective C Base 64 不匹配

ios - 在使用 repeat repeatForever 时如何更新 SKAction 中的内容?

ios - 向 SwiftUI TextField 添加不可编辑的后缀

ios - Swift 异步从目录加载图像