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