lternar rapidamente entre vídeos usando o AVFoundation

Estou escrevendo um aplicativo em que o usuário pode gravar até 6 videoclipes, cada um com a duração de 2 segundos. Quando os clipes de vídeo são gravados, o usuário pode jogar com eles usando 6 botões - um para cada clipe. O usuário pode gravar um filme alternando entre os 6 clipes. O problema é que eu preciso alternar quase instantaneamente entre os 6 clipes quando o usuário pressiona um botão - caso contrário, a ilusão de brincar com os clipes é perdida - a funcionalidade é um pouco semelhante ao aplicativo chamado CamBox na App Stor

Tentei inicializar todos os clipes com e AVAsset em um AvPlayerItem em um AVPlayer toda vez que o usuário pressionava um botão. A saída do player foi direcionada para um AVPlayerLayer na minha visualização principal. O problema é que o tempo necessário para carregar e iniciar a reprodução é bastante longo, o que significa que o vídeo fica lento quando o usuário pressiona os botões em rápida sucessã

Decidi tentar pré-carregar todos os clipes usando 5 AVPlayers e 5 AVPlayerLayers. Os 5 PlayerLayers são inseridos na minha visualização principal e, quando o usuário pressiona um botão, o AVPlayer atualmente sendo reproduzido é pausado e rebobinado, e o AVPlayerLayer atualmente visível é oculto. O novo AVPlayer é iniciado e o AVPlayerLayer correspondente é mostrado. Funciona muito bem, sendo muito mais rápido que a minha primeira solução, embora não instantânea, mas o problema é que eu só posso pré-carregar 4 clipes, o que significa que quando o usuário pressiona o botão que reproduz os dois últimos, fica grande demais. Abaixo está o meu código para pré-carregar os clipes

-(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;
  }    
}

O manipulador de eventos para os 6 botões fica assim:

- (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;    
}

Estou certo de que a limitação de 4 videoclipes pré-carregados é uma limitação de hardware, mas qual é a alternativa. alguém tem alguma ideia? Desde já, obrigado

questionAnswers(1)

yourAnswerToTheQuestion