添加观察者以观看简短的高分辨率视频

时间:2019-01-09 17:23:59

标签: swift swift3 avplayer notificationcenter

我正在尝试使用iOS 12的Swift 3在AVPlayer中播放4k视频,它的工作原理非常好,但是我希望该视频可以循环播放。我发现有文章指出,您应该使用此方法注册视频播放的结束时间:

    NotificationCenter.default.addObserver(self, selector: #selector(self.replay), 
    name:NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)

在这种情况下,一旦播放器到达视频结尾,就会调用self.replay。这对于普通视频来说效果很好,但是一旦我尝试播放〜4秒长的视频,它就不会循环播放。 重放功能如下所示:

@objc func replay() {
    self.playerViewController!.player?.seek(to: CMTime.zero)
    self.playerViewController!.player!.playImmediately(atRate: 1)
}

我将Observer添加到呈现的ViewController的viewDidLoad中。 这是竞赛条件吗?因为如上所述,较长的视频可以正常工作吗?我如何防止这种行为。

(旁注:不是常规海报,所以请告诉我我的问题是错误的还是难以理解的)

1 个答案:

答案 0 :(得分:1)

NotificationCenter.default.addObserver(self, selector: #selector(replay), 
name:NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)

@objc func replay() {
    self.playerViewController!.player!.seek(to: CMTime.zero)
    self.playerViewController!.player!.play()
}

不确定playImmediately(atRate:)的作用,但是,根据我的经验,循环播放视频是像您一样将播放器重置为零时间。然后,自然地播放视频。

添加:另一方面,您可以等待视频准备播放以添加观察者并开始播放视频。

override func viewDidLoad() {
    player.addObserver(self, forKeyPath: "status", options: [], context: nil)
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if(keyPath == "status" && self.playerViewController!.player!.status == .readyToPlay) {
        NotificationCenter.default.addObserver(self, selector: #selector(replay), name:NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
        self.playerViewController!.player!.play()
    }
}