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