#ios #swift #avplayer
#iOS #swift #avplayer
Вопрос:
Я замечаю, что я могу отправить сообщение о воспроизведении на моем AVPlayer
почти сразу, не дожидаясь «статуса» в AVPlayerItem. Я немного смущен этим. Почему бы не воспроизвести сразу?
В большинстве примеров показано добавление наблюдателя в клавише «статус» AVPlayerItem. Вот некоторый код:
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: amp;error)
}
var status = self.asset!.statusOfValueForKey("playable", error: amp;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
, а затем вызовет play на AVPlayer.
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
.
Ответ №1:
вы не воспроизводите сразу, потому что данные для воспроизведения могут быть еще не готовы (плохая сеть).
вот почему проигрыватель решает, когда играть, и вот почему вы должны следить за состоянием для случая AVPlayerStatusReadyToPlay.