2016-04-13 4 views
4

Ich möchte wirklich schnelles Vorwärts- und Rückwärtsspiel mit AVFoundation implementieren.Warum die canPlayFastForward-Methode von AVPlayerItem False zurückgibt?

Soweit ich weiß, kann ich nur 0.0 ~ 2.0 Rate mit AVPlayer spielen, wenn AVPlayerItem canPlayReverse und canPlayFastForward False zurückgibt.

Aber ich brauche -1.0 und auch Rate über 2.0.

Mein Problem ist, dass ich einfach nicht wenn und warum die Ergebnisse falsch finden.

Es wird nicht erwähnt, wann canPlayFastForward in Apples Dokument false zurückgibt.

Kann mir jemand erklären wann und warum die Ergebnisse der canPlayFastForward & canPlayReverse ist falsch und wie kann ich es ändern zu wahr?

Antwort

2

Möglichkeit ist, dass Sie die AVPlayerItem 's canPlayReverse oder canPlayFastForward vor der AVPlayerItem' s-Eigenschaft status Änderungen .readToPlay einlagern möchten. Wenn Sie dies tun, erhalten Sie immer false.

nicht wie folgt tun:

import AVFoundation 

let anAsset = AVAsset(URL: <#A URL#>) 
let playerItem = AVPlayerItem(asset: anAsset) 
let canPlayFastForward = playerItem.canPlayFastForward 
if (canPlayFastForward){ 
    print("This line won't execute") 
} 

Statt der AVPlayerItem ‚s-Eigenschaft status beobachten. Folgendes ist der documentation von Apple:

AVPlayerItem Objekte sind dynamisch. Der Wert AVPlayerItem.canPlayFastForward ändert sich zu YES für alle dateibasierten Assets und einige Streaming-basierte Assets (wenn die Quell-Playlist Medien anbietet, die dies zulassen), wenn das Element zur Wiedergabe bereit ist. Der Weg, um benachrichtigt zu werden, wenn der Spieler Gegenstand bereit ist zu spielen, ist durch Beobachtung der Eigenschaft AVPlayerItem.status über Key-Value Observing (KVO).

import AVFoundation 
dynamic var songItem:AVPlayerItem! //Make it instance variable 

let anAsset = AVAsset(URL: <#A URL#>) 
let songItem = AVPlayerItem(asset: anAsset) 
playerItem.addObserver(self, forKeyPath: "status", options: .new, context: nil) 

Ovveride der observeValue Methode in derselben Klasse:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
     if let status = change?[.newKey] as? Int{ 
      if(status == AVPlayerItemStatus.readyToPlay.rawValue){ 
       yourPlayer.rate = 2.0 // or whatever you want 
      } 
     } 

    } 

Vergessen Sie nicht, diese Klasse von songItem Status Beobachter zu entfernen

deinit { 
     playerItem.removeObserver(self, forKeyPath: "status") 
    } 
Verwandte Themen