我正在尝试使用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
中。
这是竞赛条件吗?因为如上所述,较长的视频可以正常工作吗?我如何防止这种行为。
(旁注:不是常规海报,所以请告诉我我的问题是错误的还是难以理解的)
答案 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()
}
}