添加观察者以结束短的高分辨率视频

Add Observer for end of short, high resolution video

我正在尝试在 Swift 3 的 AVPlayer 中播放一个 4k 视频 iOS12,它工作得很好,但我希望这个视频在循环中播放。我发现文章说,你应该使用这种方法来注册视频播放结束:

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

我正在 ViewController 的 viewDidLoad 中添加观察者。 这是竞争条件吗,因为如上所述,较长的视频效果很好?我怎样才能防止这种行为。

(旁注:不是一般的发帖人,所以如果我的问题问错或难以理解,请告诉我)

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