Looping AVPlayer sin problemas

Se ha debatido antes sobre cómo hacer un bucle en el elemento de video de un AVPlayer , pero ninguna ‘solución’ es lo suficientemente transparente como para proporcionar un bucle sin retardo de un video .

Estoy desarrollando una aplicación de TVOS que tiene un clip de 10 segundos de alta calidad de “paisaje” en el fondo de una de sus vistas, y simplemente reiniciar su AVPlayer de la manera “estándar” (suscribirse a NSNotification para atraparlo) es demasiado nervioso, no para notar y restar valor a la experiencia del usuario.

Parece que la única forma de lograr un bucle sin interrupciones es administrar cuadros manualmente, en un nivel inferior (en OpenGL) …

A pesar de los mejores esfuerzos para leer sobre esto, y como novato en la manipulación de video pipes, no me he acercado lo suficiente a una solución comprensible.

Soy consciente de que existen bibliotecas externas para poder realizar este comportamiento más fácilmente; más notablemente GPUImage . Sin embargo, la aplicación que estoy desarrollando es para tvOS y, por lo tanto, tiene dificultades para usar muchas de las bibliotecas de iOS de terceros que existen, incluida GPUImage. Otra biblioteca con la que me he encontrado es AVAnimator , que ofrece una gran funcionalidad para videos de animación de peso ligero, pero no para video clips densos y de alta calidad de material de archivo codificado en .H264.

Lo más cerca que he llegado hasta ahora es el propio código fuente de AVCustomEdit de Apple, sin embargo, esto se refiere principalmente a la producción estática de una “transición” que, aunque es perfecta, es demasiado compleja para poder discernir cómo hacer que ejecute una funcionalidad simple de bucle.

Si alguien puede AVPlayer con la experiencia de manipular AVPlayer a un nivel inferior, es decir, con procesadores de imagen / búferes (o desarrollo de iOS que no se AVPlayer en bibliotecas externas), estaría increíblemente interesado en saber cómo podría comenzar.

Tuve el mismo problema al transmitir un video. Después de jugar por primera vez, había una pantalla negra al cargar el video por segunda vez. Me deshice de la pantalla en negro buscando video a 5ms más adelante. Hizo casi un ciclo de video sin interrupciones. (Swift 2.1)

 // Create player here.. let player = AVPlayer(URL: videoURL) // Add notification block NSNotificationCenter.defaultCenter().addObserverForName(AVPlayerItemDidPlayToEndTimeNotification, object: player.currentItem, queue: nil) { notification in let t1 = CMTimeMake(5, 100); player.seekToTime(t1) player.play() } 

Si el video es muy corto (unos pocos segundos), probablemente pueda extraer cada cuadro como CGImage y usar CAKeyframeAnimation para animarlo. Estoy usando esta técnica para reproducir imágenes GIF en mi aplicación y la animación es muy fluida.

Usted menciona que miró AVAnimator, pero ¿vio mi publicación en el blog sobre este tema específico de bucle continuo? Específicamente construí lógica de bucle sin interrupción porque no se podía hacer correctamente con AVPlayer y el hardware H.264.

Uso dos AVPlayerItems con el mismo AVAsset en un AVQueuePlayer y cambio los elementos:

  weak var w = self NSNotificationCenter.defaultCenter().addObserverForName(AVPlayerItemDidPlayToEndTimeNotification, object: nil, queue: nil) { (notification) -> Void in let queuePlayer = w!.playerController.player! as! AVQueuePlayer if(queuePlayer.currentItem == playerItem1) { queuePlayer.insertItem(playerItem2, afterItem: nil) playerItem1.seekToTime(kCMTimeZero) } else { queuePlayer.insertItem(playerItem1, afterItem: nil) playerItem2.seekToTime(kCMTimeZero) } }