Como reduzir o atraso do iOS AVPlayer

Observe, para a pergunta abaixo: Todos os recursos são locais no dispositivo - não há fluxo de rede. Os vídeos contêm faixas de áudio.

Eu estou trabalhando em um aplicativo iOS que requer a reprodução de arquivos de vídeo com o mínimo de atraso para iniciar o clipe de vídeo em questão. Infelizmente, não sabemos qual é o próximo clipe de vídeo específico até que realmente precisemos iniciá-lo. Especificamente: Quando um videoclipe está sendo reproduzido, saberemos qual é o próximo conjunto de (aproximadamente) 10 videoclipes, mas não sabemos exatamente qual, até chegar a hora de 'imediatamente' reproduzir o próximo clipe.

O que eu fiz para ver os atrasos reais no começo é chamaraddBoundaryTimeObserverForTimes no player de vídeo, com um período de um milissegundo para ver quando o vídeo realmente começou a ser reproduzido, e aproveito a diferença desse registro de data e hora com o primeiro lugar no código que indica qual ativo começar a reproduzir.

Pelo que vi até agora, descobri que usar a combinação deAVAsset carregando e criando umAVPlayerItem a partir disso, uma vez pronto, e então esperandoAVPlayerStatusReadyToPlay antes de ligar para a reprodução, tende a demorar entre 1 e 3 segundos para iniciar o clipe.

Eu já mudei para o que eu acho que é mais ou menos equivalente: chamar[AVPlayerItem playerItemWithURL:] e esperando porAVPlayerItemStatusReadyToPlay jogar. Aproximadamente o mesmo desempenho.

Uma coisa que estou observando é que o primeiro carregamento do item do AVPlayer é mais lento que o restante. Parece uma idéia é pré-vôo do AVPlayer com um recurso curto / vazio antes de tentar reproduzir o primeiro vídeo pode ser de boa prática geral. [Início lento para o AVAudioPlayer na primeira vez que um som é reproduzido

Eu adoraria ter o tempo de início do vídeo o mais baixo possível, e ter algumas idéias de coisas para experimentar, mas gostaria de alguma orientação de alguém que possa ser capaz de ajudar.

Atualização: a ideia 7, abaixo, como implementada, gera tempos de comutação de cerca de 500 ms. Isso é uma melhoria, mas seria bom conseguir isso ainda mais rápido.

Idéia 1: Use N AVPlayers (não funciona)

Usando ~ 10AVPPlayer objetos e iniciar e pausar todos os ~ 10 clipes, e uma vez que sabemos qual realmente precisamos, mudar para e pausar o corretoAVPlayer, e começar tudo de novo para o próximo ciclo.

Eu não acho que isso funciona, porque eu li lá é aproximadamente um limite de 4 ativoAVPlayer's no iOS. Alguém perguntou sobre isso no StackOverflow aqui e descobriu o limite do 4 AVPlayer:alternar rapidamente entre vídeos usando avfoundation

Idéia 2: Use o AVQueuePlayer (não funciona)

Eu não acredito que empurrando 10AVPlayerItems em umAVQueuePlayer pré-carregaria todos para um início perfeito.AVQueuePlayer é uma fila, e acho que só torna o próximo vídeo na fila pronto para reprodução imediata. Eu não sei qual dos 10 vídeos que eu quero reproduzir, até a hora de começar esse.ios-avplayer-video-preloading

Ideia 3: carregar, reproduzir e reterAVPlayerItems no fundo (não 100% de certeza ainda - mas não parece bom)

Eu estou olhando para se há algum benefício para carregar e reproduzir o primeiro segundo de cada clipe de vídeo em segundo plano (suprimir saída de vídeo e áudio) e manter uma referência para cadaAVPlayerItem, e quando soubermos qual item precisa ser jogado de verdade, troque-o e troque o AVPlayer de fundo pelo ativo. Enxague e repita.

A teoria seria que jogou recentementeAVPlayer/AVPlayerItemAinda é possível manter alguns recursos preparados que tornariam a reprodução subseqüente mais rápida. Até agora, eu não vi benefícios disso, mas eu posso não ter oAVPlayerLayer configuração correta para o plano de fundo. Eu duvido que isso realmente melhore as coisas do que eu vi.

Idéia 4: Use um formato de arquivo diferente - talvez um que seja mais rápido para carregar?

Atualmente estou usando o formato H.264 do .m4v (video-MPEG4). O H.264 tem muitas opções diferentes de codec, então é possível que algumas opções sejam mais rápidas de procurar do que outras. Descobri que usar configurações mais avançadas que aumentam o tamanho do arquivo aumenta o tempo de busca, mas não encontrou nenhuma opção diferente.

Ideia 5: Combinação de formato de vídeo sem perdas + AVQueuePlayer

Se houver um formato de vídeo que seja rápido de carregar, mas talvez o tamanho do arquivo seja insano, uma ideia pode ser pré-preparar os primeiros 10 segundos de cada clipe de vídeo com uma versão inchada, mas mais rápida de carregar, mas voltando isso com um ativo codificado em H.264. Use um AVQueuePlayer e adicione os primeiros 10 segundos no formato de arquivo descompactado, e siga-o com um que esteja no H.264 e obtenha até 10 segundos de tempo de preparação / pré-carga. Então eu consegui o melhor dos dois mundos: tempos de início rápido, mas também se beneficia de um formato mais compacto.

Idéia 6: Use um AVPlayer não padrão / escreva o meu próprio / use o de outra pessoa

Dadas as minhas necessidades, talvez eu não possa usar o AVPlayer, mas tenha que recorrer ao AVAssetReader e decodificar os primeiros segundos (possivelmente gravar arquivo bruto no disco) e, quando se trata de reprodução, usar o formato raw para executá-lo volta rápido. Parece um enorme projeto para mim, e se eu for de uma maneira ingênua, não é claro / improvável que funcione melhor. Cada quadro de vídeo decodificado e descompactado é de 2,25 MB. Ingenuamente falando - se formos com ~ 30 fps para o vídeo, eu acabaria com um requisito de leitura de disco de ~ 60 MB / s, o que é provavelmente impossível / empurrá-lo. Obviamente, teríamos que fazer algum nível de compressão de imagem (talvez formatos de compressão nativo openGL / es via PVRTC) ... mas isso é meio louco. Talvez haja uma biblioteca por aí que eu possa usar?

Ideia 7: Combine tudo num único recurso de filme e seekToTime

Uma ideia que pode ser mais fácil do que algumas das alternativas acima, é combinar tudo em um único filme e usar o método seekToTime. A coisa é que estaríamos pulando por todo o lugar. Acesso essencialmente aleatório ao filme. Eu acho que isso pode realmente dar certo:avplayer-movie-playing-lag-in-ios5

Qual abordagem você acha que seria melhor? Até agora, não fiz tanto progresso em termos de reduzir o atraso.

questionAnswers(5)

yourAnswerToTheQuestion