添加观察者以结束短的高分辨率视频
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()
}
}
我正在尝试在 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()
}
}