AVPlayerItem replaceCurrentItemWithPlayerItem Bloqueio
Primeiro um pequeno contexto sobre o aplicativo ...
- Há muitas operações pesadas da interface do usuário envolvendo players de vídeo (principalmente rolagem)
- Os vídeos são dinâmicos e mudam com base em nossa página atual.
- então o vídeo tem que ser dinâmico e continuar mudando e a interface do usuário precisa ser responsiva
Eu estava usando inicialmente umMPMoviePlayerController
mas depois, devido a certos requisitos, tive de recorrer ao AVPlayer
Eu fiz o meu próprio invólucro para oAVPlayer
.
Para alterar o conteúdo no videoPlayer, é assim que o método se parece na classe wrapper do AVPlayer
/**We need to change the whole playerItem each time we wish to change a video url */
-(void)initializePlayerWithUrl:(NSURL *)url
{
AVPlayerItem *tempItem = [AVPlayerItem playerItemWithURL:url];
[tempItem addObserver:self forKeyPath:@"status"
options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
context:nil];
[tempItem addObserver:self forKeyPath:@"playbackBufferEmpty"
options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
context:nil];
//Not sure if this should be stopped or paused under the ideal circumstances
//These will be changed to custom enums later
[self setPlaybackState:MPMoviePlaybackStateStopped];
[self setLoadState:MPMovieLoadStateUnknown];
[self.videoPlayer replaceCurrentItemWithPlayerItem:tempItem];
//This is required only if we wish to pause the video immediately as we change the url
//[self.videoPlayer pause];
}
Agora é claro que tudo estava funcionando bem ...... exceto ..
[self.videoPlayer replaceCurrentItemWithPlayerItem:tempItem];
Parece estar bloqueando a interface do usuário por uma fração de segundo e durante a rolagem, isso torna a interface realmente sem resposta e feia, e essa operação não pode ser executada em segundo plano.
Existe alguma correção ou solução para isso ..?