вам нужно использовать предпочитаемую прямую буферизацию
Это свойство определяет предпочтительную длительность буфера пересылки в секундах. Если установлено значение 0, игрок выберет подходящий уровень буферизации для большинства случаев использования. Установка этого свойства в низкое значение увеличит вероятность того, что воспроизведение остановится и будет повторно буферизован, в то время как установка его в высокое значение увеличит спрос на системные ресурсы.
также проверьте здесь подробный пример использования: Можно ли приостановить и возобновить буферизацию AVPlayer?
внутри вашего плеера вам нужно соблюдать временной диапазон, используя функцию ниже
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
как это:
let timeRanges = change![NSKeyValueChangeKey.newKey] as? NSArray
if timeRanges != nil && timeRanges!.count != 0 {
DispatchQueue.main.async {
let cmTimeRange = (timeRanges![0] as AnyObject).timeRangeValue as CMTimeRange
self.playerView.timeSlider.bufferValue = Float(CMTimeGetSeconds(cmTimeRange.start) + CMTimeGetSeconds(cmTimeRange.duration))
}
}
У меня есть пользовательский ползунок с переменной, которую я определил как bufferValue
, вы можете переопределить func draw(_ rect: CGRect)
внутри вашего ползунка и применить изменения во время работы буфера.
Я получаю draw
звонить в любое время bufferValue
меняется, звоня self.setNeedsDisplay()
внутри didSet
@IBInspectable var bufferValue : Float = 0 {
didSet {
if(bufferValue < 0 ) {
bufferValue = 0
} else if (bufferValue > maximumValue) {
bufferValue = maximumValue
}
self.setNeedsDisplay()
}
}