Vários vídeos com o AVPlayer

Estou desenvolvendo um aplicativo para iOS para iPad que precisa reproduzir vídeos em alguma parte da tela. Eu tenho vários arquivos de vídeo que precisam ser reproduzidos um após o outro em uma ordem que não é fornecida em tempo de compilação. Deve parecer que é apenas um vídeo tocando. É bom que, ao passar de um vídeo para o outro, haja algum atraso em que o último ou o primeiro quadro dos dois vídeos sejam exibidos, mas não deve haver telas piscando ou brancas sem conteúdo. Os vídeos não contêm áudio. É importante levar em conta o uso da memória. Os vídeos têm uma resolução muito alta e várias sequências de vídeo diferentes podem ser reproduzidas ao lado umas das outras ao mesmo tempo.

Para obter isso eu tentei algumas soluções até agora. Eles estão listados abaixo:

1. AVPlayer com AVComposition com todos os vídeos nele

Nesta solução eu tenho um AVPlayer que irá usar somente no AVPlayerItem feito usando uma AVComposition contendo todos os vídeos colocados um ao lado do outro. Ao ir para vídeos específicos eu busco o tempo na composição onde o próximo vídeo começa. O problema com essa solução é que ao buscar o player mostrará rapidamente alguns dos frames que ele está buscando, o que não é aceitável. Parece que não há como pular diretamente para um momento específico na composição. Eu tentei resolver isso fazendo uma imagem do último quadro no vídeo que acabou de terminar, então mostre isso na frente do AVPLayer enquanto procurava e finalmente removê-lo após a busca ter sido feita. Eu estou fazendo a imagem usando AVAssetImageGenerator, mas por algum motivo, a qualidade da imagem não é o mesmo que o vídeo, portanto, há mudanças notáveis ​​ao mostrar e ocultar a imagem sobre o vídeo. Outro problema é que o AVPlayer usa muita memória porque um único AVPlayerItem contém todos os vídeos.

2. AVPlayer com vários AVPlayerItems

Essa solução usa um AVPlayerItem para cada vídeo e substitui o item do AVPlayer ao alternar para um novo vídeo. O problema com isso é que ao trocar o item de um AVPlayer, ele mostrará uma tela branca por um curto período de tempo enquanto carrega o novo item. Para corrigir isso, a solução de colocar uma imagem na frente do último quadro durante o carregamento poderia ser usada, mas ainda com o problema de que a qualidade da imagem e do vídeo é diferente e notável.

3. Dois AVPlayers em cima uns dos outros se revezando para reproduzir o AVPlayerItem

A próxima solução que tentei era ter dois AVPlayer um em cima do outro, que se revezavam tocando AVPlayerItems. Então, quando um dos jogadores terminar de jogar, ele permanecerá no último quadro do vídeo. O outro AVPlayer será trazido para a frente (com seu item definido como nulo, então é transparente), e o próximo AVPlayerItem será inserido nesse AVPlayer. Assim que for carregado, começará a ser reproduzido e a ilusão de uma transação suave entre os dois vídeos estará intacta. O problema com essa solução é o uso da memória. Em alguns casos, eu preciso reproduzir dois vídeos na tela ao mesmo tempo, o que resultará em 4 AVPlayers com um AVPlayerItem carregado ao mesmo tempo. Isso é simplesmente muita memória, já que os vídeos podem ter uma resolução muito alta.

Alguém tem alguns pensamentos, sugestões, comentários ou algo sobre o problema geral e as soluções experimentadas postadas acima.

questionAnswers(3)

yourAnswerToTheQuestion