我正在使用 AVPlayer 从服务器流式传输音频,我现在要做的是显示一个自定义 UISlider 来显示缓冲的进度。
有人想出这个吗?请给我解决方案。现在播放器一次加载整个持续时间并在 UISlider 中显示。
你需要使用preferredforwardbufferduration
此属性以秒为单位定义首选的转发缓冲区持续时间。如果设置为 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()
}
}