ios video opengl-es avfoundation tvos

ios - Bucle de AVPlayer sin problemas



video opengl-es (4)

Se ha debatido anteriormente sobre cómo hacer un bucle del elemento de video de AVPlayer , pero ninguna "solución" es lo suficientemente fluida como para proporcionar un bucle sin demoras de un video .

Estoy desarrollando una aplicación tvOS que tiene un clip de ''segundo'' de alta calidad de 10 segundos 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 realmente perfecto es administrar manualmente los marcos, en un nivel inferior (en OpenGL) ...

A pesar de los mejores esfuerzos para leer sobre esto, y como un novato en la manipulación de tuberías de video, 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 utilizar muchas de las bibliotecas de terceros de iOS que existen, GPUImage incluida. Otra biblioteca con la que me he encontrado es AVAnimator , que proporciona una gran funcionalidad para videos de animación livianos, pero no para clips de video densos y de alta calidad de metraje fuente codificados en .H264.

Lo más cercano que he llegado hasta ahora es el propio código fuente AVCustomEdit Apple, sin embargo, esto trata principalmente con la producción estática de una `` transición '''' que, aunque perfecta, es demasiado compleja para que pueda discernir cómo hacer que realice una funcionalidad de bucle simple.

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


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


Si el video es muy corto (unos segundos), probablemente pueda extraer cada fotograma 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.


Tuve el mismo problema al transmitir un video. Después de reproducir por primera vez, había una pantalla negra al cargar el video por segunda vez. Me deshice de la pantalla negra buscando videos a 5 ms por delante. Se hizo casi un bucle de video perfecto. (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() }


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