Múltiples videos con AVPlayer

Estoy desarrollando una aplicación iOS para iPad que necesita reproducir videos en alguna parte de la pantalla. Tengo varios archivos de video que deben reproducirse uno tras otro en un orden que no se entrega en el momento de la compilación. Debe parecer que es solo un video en reproducción. Está bien que al pasar de un video a otro, se produzca una cierta demora donde se muestre el último o el primer fotograma de los dos videos, pero no debe haber parpadeo ni pantallas blancas sin contenido. Los videos no contienen audio. Es importante tener en cuenta el uso de la memoria. Los videos tienen una resolución muy alta y se pueden reproducir varias secuencias de video diferentes una al lado de la otra al mismo tiempo.

Con el fin de obtener esto he intentado algunas soluciones para lejos. Se enumeran a continuación:

1. AVPlayer con AVComposition con todos los videos que contiene.

En esta solución tengo un AVPlayer que usaré solo en AVPlayerItem hecho usando una AVComposition que contiene todos los videos puestos uno junto al otro. Cuando voy a videos específicos, busco la hora en la composición donde comienza el siguiente video. El problema con esta solución es que al buscar, el jugador mostrará rápidamente algunos de los cuadros que busca, lo cual no es aceptable. Parece que no hay manera de saltar directamente a un tiempo específico en la composición. Intenté resolver esto haciendo una imagen del último fotograma del video que acaba de terminar, luego muestro eso frente a AVPLayer mientras buscaba, y finalmente lo eliminé después de que se realizó la búsqueda. Estoy creando la imagen utilizando AVAssetImageGenerator, pero por alguna razón, la calidad de la imagen no es la misma que la del video, por lo que hay cambios notables al mostrar y ocultar la imagen sobre el video. Otro problema es que AVPlayer usa mucha memoria porque un solo AVPlayerItem contiene todos los videos.

2. AVPlayer con múltiples AVPlayerItems

Esta solución utiliza un AVPlayerItem para cada video y reemplaza el elemento de AVPlayer cuando se cambia a un nuevo video. El problema con esto es que al cambiar el elemento de un AVPlayer se mostrará una pantalla en blanco durante un breve tiempo mientras se carga el nuevo elemento. Para solucionar este problema, se puede utilizar la solución con poner una imagen al frente con el último cuadro durante la carga, pero aún así, con el problema de que la calidad de la imagen y el video es diferente y notable.

3. Dos AVPlayers uno encima del otro turnándose para jugar AVPlayerItem

La siguiente solución que probé era tener dos AVPlayer uno encima del otro que se turnaban para reproducir AVPlayerItems. Por lo tanto, cuando uno de los jugadores termine de jugar, permanecerá en el último cuadro del video. El otro AVPlayer será llevado al frente (con su elemento establecido en nulo, por lo que es transparente), y el siguiente AVPlayerItem se insertará en ese AVPlayer. Tan pronto como se cargue, comenzará a reproducirse y la ilusión de una transacción fluida entre los dos videos quedará intacta. El problema con esta solución es el uso de la memoria. En algunos casos, necesito reproducir dos videos en la pantalla al mismo tiempo, lo que resultará en 4 AVPlayers con un AVPlayerItem cargado al mismo tiempo. Esto es simplemente demasiada memoria ya que los videos pueden estar en una resolución muy alta.

¿Alguien tiene alguna idea, sugerencia, comentario o algo relacionado con el problema general y las soluciones probadas publicadas anteriormente?

Respuestas a la pregunta(3)

Su respuesta a la pregunta