这个答案很大程度上基于这个:https ://stackoverflow.com/a/7195954/765298 。任何和所有的功劳都应该去那里,因为这只是对 swift 的翻译。
您可以正确地假设,当向前寻找尚未缓冲但播放器停止的部分时。问题是它仍然缓冲数据,但在准备好时不会自动启动。因此,将链接的答案改写为 swift :
要设置您的观察者:
player.currentItem?.addObserver(self, forKeyPath: "playbackBufferEmpty", options: .New, context: nil)
player.currentItem?.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: .New, context: nil)
请注意,为了能够观察值,传递的值self
需要继承自NSObject
.
并处理它们:
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
guard keyPath != nil else { // a safety precaution
super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
return
}
switch keyPath! {
case "playbackBufferEmpty" :
if player.currentItem!.playbackBufferEmpty {
print("no buffer")
// do something here to inform the user that the file is buffering
}
case "playbackLikelyToKeepUp" :
if player.currentItem!.playbackLikelyToKeepUp {
self.player.play()
// remove the buffering inidcator if you added it
}
}
}
您还可以从当前播放中获取有关可用时间范围的信息(如果您没有自己创建,AVPlayerItem
您可以通过它访问它)。player.currentItem
这使您能够向用户指示文件的哪些部分已准备就绪。
与往常一样,您可以在文档中阅读更多内容:AVPlayerItem和AVPlayer
要阅读有关键值观察 (KVO) 的更多信息:这里