¿Por qué el método canPlayFastForward de AVPlayerItem devuelve False?

Realmente quiero implementar el avance rápido y el juego inverso con AVFoundation.

Por lo que sé, solo puedo reproducir una velocidad de 0.0 ~ 2.0 con AVPlayer si AVPlayerItem's canPlayReverse y canPlayFastForward devuelve False.

Pero necesito -1.0 y también valoro más de 2.0.

Mi problema es que simplemente no puedo encontrar cuándo y por qué los resultados son falsos.

No se menciona cuándo canPlayFastForward devuelve falso en el documento de Apple.

¿Alguien puede explicar cuándo y por qué los resultados de canPlayFastForward y canPlayReverse son falsos y cómo puedo cambiarlo a verdadero ?

Posibilidad es que esté comprobando el AVPlayerItem de canPlayReverse o canPlayFastForward antes de que el AVPlayerItem de la propiedad de .readToPlay cambie a .readToPlay . Si lo haces, siempre obtendrás false .

No hagas así:

 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") } 

En su lugar, observe el AVPlayerItem de la propiedad de AVPlayerItem . A continuación se encuentra la documentation de Apple:

Los objects AVPlayerItem son dynamics. El valor de AVPlayerItem.canPlayFastForward cambiará a YES para todos los activos basados ​​en files y algunos activos basados ​​en transmisión (si la list de reproducción de origen ofrece medios que lo permiten) en el momento en que el elemento esté listo para reproducirse. La forma de recibir una notificación cuando el elemento del jugador está listo para jugar es observando la propiedad AVPlayerItem.status a través de 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 el método observeValue en la misma class:

 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 } } } 

No olvides eliminar esta class del observador de estado de songItem

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