具有缓冲进度的UISlider-AVPlayer

时间:2018-08-30 10:29:32

标签: avplayer uislider swift4.2

enter image description here我正在使用AVPlayer从服务器流式传输音频,现在要做的是显示一个自定义UISlider,该UISlider显示缓冲的进度。

有人想出这个吗?请给我解决方法。 现在,播放器一次加载整个持续时间,并在UISlider中显示。

1 个答案:

答案 0 :(得分:0)

您需要使用preferredforwardbufferduration

  

此属性定义首选的前向缓冲区持续时间(以秒为单位)。如果设置为0,则播放器将为大多数用例选择适当的缓冲级别。将此属性设置为较低的值将增加播放停止和重新缓冲的机会,而将其设置为较高的值将增加对系统资源的需求。

还要在此处查看如何使用的详细示例:Is it possible to pause and resume buffering of 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内部调用bufferValueself.setNeedsDisplay()随时可以didSet进行呼叫

    @IBInspectable var bufferValue : Float = 0 {
    didSet {
        if(bufferValue < 0 ) {
            bufferValue = 0
        } else if (bufferValue > maximumValue) {
            bufferValue = maximumValue
        }
        self.setNeedsDisplay()
    }
}