可以在AVPlayer中添加一个KVO观察者,监听AVPlayerItem的status属性和loadedTimeRanges属性。当status变为AVPlayerStatusReadyToPlay时,开始播放。当loadedTimeRanges的duration大于视频总时长的某个百分比(例如0.7),说明已经缓存了足够的数据,可以继续播放。如果缓存的时间小于0.7倍的视频总时长,则暂停播放,等待缓存完成。在等待时,通常会显示一个加载指示器,以告知用户视频正在加载中。
示例代码如下:
let player = AVPlayer(url: videoURL)
player.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), options: [.old, .new], context: nil)
player.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.loadedTimeRanges), options: [.old, .new], context: nil)
// 播放视频
player.play()
// KVO通知回调
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == #keyPath(AVPlayerItem.status) {
if let status = change?[.newKey] as? Int, let player = object as? AVPlayer {
if status == AVPlayer.Status.readyToPlay.rawValue {
player.play()
}
}
}
if keyPath == #keyPath(AVPlayerItem.loadedTimeRanges) {
if let timeRange = (object as? AVPlayerItem)?.loadedTimeRanges.first?.timeRangeValue {
let loadedDuration = CMTimeGetSeconds(CMTimeAdd(timeRange.start, timeRange.duration))
let totalDuration = CMTimeGetSeconds(player.currentItem?.duration ?? .zero)
if loadedDuration / totalDuration > 0.7 {
player.play()
}
}
}
}