UISlider с прогрессом буферизации - AVPlayer - PullRequest
0 голосов
/ 30 августа 2018

enter image description here Я использую AVPlayer для потоковой передачи аудио с сервера, и сейчас я хочу показать пользовательский UISlider, который показывает ход буферизации.

Кто-нибудь придумал это? Пожалуйста, дайте мне решение. Теперь игрок загружает всю длительность за один раз и показывает в UISlider.

1 Ответ

0 голосов
/ 01 сентября 2018

вам нужно использовать предпочитаемую прямую буферизацию

Это свойство определяет предпочтительную длительность буфера пересылки в секундах. Если установлено значение 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()
    }
}
...