我注意到我几乎可以立即在AVPlayer
发送播放消息,而无需等待AVPlayerItem中的“状态”。我有点困惑。为什么不立即玩?
大多数示例显示在AVPlayerItem的“status”键上添加观察者。这是一些代码:
self.asset!.loadValuesAsynchronouslyForKeys(keys, completionHandler: {
dispatch_async(dispatch_get_main_queue(), {
var error:NSError?
for key in keys {
var status = self.asset!.statusOfValueForKey(key, error: &error)
}
var status = self.asset!.statusOfValueForKey("playable", error: &error)
if status == AVKeyValueStatus.Loaded {
playerItem = AVPlayerItem(asset: self.asset)
playerItem!.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.Initial, context: itemContext)
self.player = AVPlayer(playerItem: playerItem)
playerLayer = AVPlayerLayer(player: self.player)
playerLayer!.videoGravity = AVLayerVideoGravityResizeAspectFill
playerLayer!.frame = self.view!.bounds
self.view.layer.addSublayer(playerLayer)
//self.player!.play() [This seems to work!]
} else {
println("Error in async load of keys")
}
})
})
示例显示我需要实现一个等待直到我从AVPlayerItem
获得状态然后在AVPlayer上调用play的观察者。
override func observeValueForKeyPath(keyPath: String!, ofObject object: AnyObject!, change: NSDictionary!, context: CMutableVoidPointer) {
dispatch_async(dispatch_get_main_queue(), {
self.player!.play()
})
super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
}
还有其他一些SO问题,但没有人解释为什么玩家可以在不必等待AVPlayerItem
上的“状态”键的情况下进行游戏。
答案 0 :(得分:0)
您不能立即播放,因为播放的数据可能还没有准备好(网络不佳)。
这就是为什么玩家决定何时玩,这就是为什么你应该观察AVPlayerStatusReadyToPlay案件的状态。