iOS может воспроизводить AVPlayer, не дожидаясь AVPlayerItem

#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.