Cómo mostrar video en pausa en lugar de pantalla en negro al iniciar AVPlayer

Soy capaz de crear un reproductor con éxito, pero estaba molesto con la pantalla negra inicial. Decidí superponer una UIImageView y esconderlo una vez que el jugador comenzó. Esto funcionó, pero no quería la molestia de crear y mantener imágenes para todos mis videos.

Pude lograr los resultados exactos que quería al jugar e inmediatamente pausar al jugador después de instanciarlo. El único problema era que a veces el estado del jugador se estaba grabando incorrectamente, así que cuando volví a encender el reproductor, el estado estaba en la list de "reproducción" a pesar de que el reproductor estaba en pausa.

Empecé a search el uso de AVPlayerItem seekToTime pero no encontré ninguna solución factible. ¿Hay una forma "no hacky" de lograr esto?

Si está utilizando un AVPlayerViewController , este es un uso perfecto de la propiedad contentOverlayView del controller del contentOverlayView . Esta es una vista UIView entre la capa del jugador y los controles expuestos exactamente para este propósito:

Primero, crea la captura de pantalla:

 let asset = AVAsset(URL: URL(string: "")!) // link to some video let imageGenerator = AVAssetImageGenerator(asset: asset) let screenshotTime = CMTime(seconds: 1, prefernetworkingTimescale: 1) if let imageRef = try? imageGenerator.copyCGImageAtTime(screenshotTime, actualTime: nil) { let image = UIImage(CGImage: imageRef) // see part 2 below } 

Ahora, agregue la image como una subview de contentOverlayView en el controller del reproductor:

 // in the same try block let imageView = UIImageView(image: image) let playerVC = AVPlayerViewController() let playerItem = AVPlayerItem(asset: asset) playerVC.player = AVPlayer(playerItem: playerItem) self.presentViewController(playerVC, animated: true) { playerVC.contentOverlayView?.addSubview(imageView) // adjust the frame of your imageView to fit on the player controller's contentOverlayView } 

Luego, elimine la subvista de la imageView cuando el reproductor comience a reproducir el elemento o cuando se complete el almacenamiento en búfer.

AVPlayerLayer asociado con su reproductor tiene una propiedad readyForDisplay.

Puede intentar hacer que su vista de host sea un observador para este valor, y haga una actualización tan pronto como esté establecida en true.

Se establece en verdadero cuando el primer cuadro está listo para representarse, por lo que antes de que el jugador tenga suficientes datos para jugar y establecer su estado en readyToPlay.