Cambio rápido entre videos mediante AVFoundation

Estoy escribiendo una aplicación donde el usuario puede grabar hasta 6 videoclips cada uno con una duración de 2 segundos. Cuando se graban los videoclips, el usuario puede jugar con ellos usando 6 botones, uno para cada clip. El usuario puede grabar una película al cambiar entre los 6 clips. El problema es que necesito cambiar casi instantáneamente entre los 6 clips cuando el usuario presiona un button; de lo contrario, se pierde la ilusión de jugar con los clips, la funcionalidad es algo similar a la aplicación llamada CamBox en App Store.

Primero intenté inicializar cada clip y AVAsset en un AvPlayerItem en un AVPlayer cada vez que el usuario presionaba un button. La salida del jugador se dirigió a un AVPlayerLayer en mi vista principal. El problema es que el time que tarda en cargarse y comenzar a jugar es bastante largo, lo que significa que el video se retrasa cuando el usuario presiona los botones en rápida sucesión.

Me decidí a tratar de precargar todos los clips usando 5 AVPlayers y 5 AVPlayerLayers. Los 5 PlayersLayers se insertan en mi vista principal y cuando el usuario presiona un button, el AVPlayer que se está reproduciendo actualmente se pausó y se rebobinó y se ocultó el AVPlayerLayer actualmente visible. Se inicia el nuevo AVPlayer y se muestra el correspondiente AVPlayerLayer. Funciona bastante bien siendo mucho más rápido que mi primera solución, aunque no instantánea, pero el problema es que solo puedo precargar 4 clips, que cuando el usuario presiona el button que reproduce los dos últimos, se queda atrás. A continuación se muestra mi código para precargar los clips.

-(void)loadVideos { layers = [[NSMutableArray alloc] initWithCapacity:6]; players = [[NSMutableArray alloc] initWithCapacity:6]; for(int i = 1; i < 7; i++) { NSURL* fileURL = [NSURL fileURLWithPath:[self getFileName:i]]; AVPlayerItem* avPlayerItem = [[[AVPlayerItem alloc] initWithURL:fileURL] autorelease]; [avPlayerItem addObserver:self forKeyPath:@"status" options:0 context:nil]; AVPlayer *avPlayer = [[[AVPlayer alloc] initWithPlayerItem:avPlayerItem] autorelease]; [avPlayer addObserver:self forKeyPath:@"status" options:0 context:nil]; [avPlayer addObserver:self forKeyPath:@"currentItem" options:0 context:nil]; AVPlayerLayer* layer = [AVPlayerLayer playerLayerWithPlayer:avPlayer]; layer.frame = self.playerView.bounds; [playerView.layer addSublayer:layer]; [layers addObject:layer]; [players addObject:avPlayer]; layer.hidden = YES; } } 

El manejador de events para los 6 botones se ve así:

 - (IBAction)takeBtnClicked:(id)sender { int tag = ((UIButton*)sender).tag; AVPlayer* player; AVPlayerLayer* layer; if (layerIndex > -1) { player = [players objectAtIndex:layerIndex]; layer = [layers objectAtIndex:layerIndex]; [player pause]; layer.hidden = YES; [player seekToTime:kCMTimeZero]; } layerIndex = tag-1; player = [players objectAtIndex:layerIndex]; layer = [layers objectAtIndex:layerIndex]; [player play]; layer.hidden = NO; } 

Estoy seguro de que la limitación de 4 videoclips precargados es una limitación de hardware, pero cuál es la alternativa. ¿Alguien tiene alguna idea? Gracias por adelantado.

Vea mi respuesta para iphone-smooth-transition-from-one-video-to-another , muestra una biblioteca que puede usar para implementar esta lógica y una aplicación de ejemplo con 3 botones que inician clips animados. Cada clip también tiene un efecto de sonido asociado.