具有缓冲进度的 UISlider - AVPlayer

Posted

技术标签:

【中文标题】具有缓冲进度的 UISlider - AVPlayer【英文标题】:UISlider with buffering progress - AVPlayer 【发布时间】:2018-08-30 10:29:31 【问题描述】:

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

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

【问题讨论】:

是否可以暂停和恢复 AVPlayer 的缓冲? 【参考方案1】:

你需要使用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 随时调用bufferValue 更改通过调用self.setNeedsDisplay()inside didSet

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

【讨论】:

以上是关于具有缓冲进度的 UISlider - AVPlayer的主要内容,如果未能解决你的问题,请参考以下文章

给 UISlider 进度条圆角 [Swift]

AVPlayer 串流进度

制作进度条(UISlider)

UIProgressView和UISlider

如何在 iOS 中使用 MpMoviePlayerController 在 UISlider 上显示缓冲数据?

UISlider Swift 的 AVPlayer 进度