【问题标题】:Add Observer for end of short, high resolution video为短片、高分辨率视频添加观察者
【发布时间】:2019-01-09 17:23:58
【问题描述】:

我正在尝试使用适用于 iOS12 的 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)
}

我在呈现 ViewController 的 viewDidLoad 中添加了观察者。 这是一种竞争条件,因为如前所述,较长的视频可以正常工作吗?我怎样才能防止这种行为。

(旁注:不是普通的海报,所以如果我的问题被问错或难以理解,请告诉我)

【问题讨论】:

    标签: swift swift3 avplayer notificationcenter


    【解决方案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()
        }
    }
    

    【讨论】:

    • play() 将播放速率设置为 1。playImmediately(atRate: 1) 也这样做。
    • 添加到那个。
    • 看起来很有希望,会试试看!
    • 添加了更多哈哈。第一次错过了if(keyPath == "status") 部分
    • 好的,我刚刚找到了一些可以解决问题的方法!在进入观察者之前插入一个小的usleep。这对我来说完全没问题。非常感谢您的帮助!接受你的答案,即使它不是睡着觉的最漂亮的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多