Я использую AVPlayer для воспроизведения видео. Я следил за этим видеоруководством Давайте создадим это приложение
Я использую UISlider/скруббер, чтобы идти вместе с текущим кадром/временем видео.
У меня есть видео продолжительностью 10,43 секунды, и я использую функцию перемотки вперед, которая доводит меня до самого конца.
@objc fileprivate func fastForwardButtonTapped() {
guard let playerItem = playerItem else { return }
guard let player = player else { return }
let duration: Float64 = CMTimeGetSeconds(playerItem.duration)
let seekTime: CMTime = CMTimeMakeWithSeconds(duration, 1)
player.seek(to: seekTime)
}
Видео идет до самого конца, но проблема в том, что ползунок переходит только к 10-секундной точке, и я не могу заставить его перейти к последним 0,43 секунды. Я получаю предупреждающее сообщение:
Значение ползунка определяется в player?.addPeriodicTimeObserver()
И из-за этого, когда я нажимаю ускоренную перемотку вперед вместо того, чтобы ползунок доходил до самого конца, он останавливается на пару точек (обратите внимание на пробел):
Как я могу получить более точные значения, чтобы мой ползунок мог перемещаться до конца?
playerItem?.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status),
options: [.old, .new],
context: &playerItemContext)
let interval = CMTime(value: 1, timescale: 2)
timeObserverToken = player?.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main, using: {
[weak self] (progressTime) in
let seconds = CMTimeGetSeconds(progressTime)
let secondsString = String(format: "%02d", Int(seconds) % 60)
let minutesString = String(format: "%02d", Int(seconds) / 60)
self?.currentTimeLabel.text = "\(minutesString):\(secondsString)"
if let duration = self?.playerItem!.duration{
let durationSeconds = CMTimeGetSeconds(duration)
self?.slider.value = Float(seconds / durationSeconds) // SLIDER IS UPDATED HERE
}
})