Добавьте Observer для окончания короткого видео высокого разрешения - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь воспроизвести видео 4k в AVPlayer с Swift 3 для 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)
}

Я добавляю Observer в представление ViewController viewDidLoad. Это условие гонки, потому что, как указано, более длинные видео работают нормально? Как я могу предотвратить это поведение.

(Sidenote: Не обычный плакат, поэтому, пожалуйста, скажите мне, если мой вопрос задан неправильно или трудно понять)

1 Ответ

0 голосов
/ 09 января 2019
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()
    }
}
...