Existe uma maneira relativamente fácil de repetir um vídeo no AVFoundation?
Eu criei meu AVPlayer e AVPlayerLayer assim:
avPlayer = [[AVPlayer playerWithURL:videoUrl] retain];
avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:avPlayer] retain];
avPlayerLayer.frame = contentView.layer.bounds;
[contentView.layer addSublayer: avPlayerLayer];
e depois reproduzo meu vídeo com:
[avPlayer play];
O vídeo é bom, mas para no final. Com o MPMoviePlayerController, tudo o que você precisa fazer é definir sua repeatMode
propriedade para o valor certo. Não parece haver uma propriedade semelhante no AVPlayer. Também não parece haver um retorno de chamada que me dirá quando o filme terminar, para que eu possa procurar o começo e reproduzi-lo novamente.
Não estou usando o MPMoviePlayerController porque possui algumas limitações sérias. Quero poder reproduzir vários fluxos de vídeo de uma só vez.
Respostas:
Você pode receber uma notificação quando o jogador terminar. Verifica
AVPlayerItemDidPlayToEndTimeNotification
Ao configurar o player:
ObjC
isso impedirá que o jogador faça uma pausa no final.
na notificação:
isso vai retroceder o filme.
Não se esqueça de cancelar o registro da notificação ao liberar o player.
Rápido
Swift 4+
fonte
avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;
isso não vai parar, então não há necessidade de configurá-lo para jogar novamente[player play];
após rebobinar.[[NSNotificationCenter defaultCenter] removeObserver:self];
por exemplo, quandoself
estiver ouvindo as notificações.Se ajudar, no iOS / tvOS 10, há um novo AVPlayerLooper () que você pode usar para criar loop contínuo de vídeo (Swift):
Isso foi apresentado na WWDC 2016 em "Avanços na reprodução da AVFoundation": https://developer.apple.com/videos/play/wwdc2016/503/
Mesmo usando esse código, tive um soluço até registrar um bug na Apple e obter esta resposta:
Acontece que o Premiere estava exportando arquivos com uma faixa de áudio com uma duração ligeiramente diferente do vídeo. No meu caso, foi bom remover completamente o áudio, e isso resolveu o problema.
fonte
Em Swift :
Você pode receber uma notificação quando o player terminar ... verifique AVPlayerItemDidPlayToEndTimeNotification
ao configurar o player:
isso impedirá que o jogador faça uma pausa no final.
na notificação:
Swift3
isso vai retroceder o filme.
Não se esqueça de cancelar o registro da notificação ao liberar o player.
fonte
Aqui está o que acabei fazendo para evitar o problema da pausa-soluço:
Rápido:
Objetivo C:
NOTA: Não usei,
avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone
pois não é necessário.fonte
[weakSelf.avPlayer seekToTime:kCMTimeZero]; [weakSelf.avPlayer play];
linhas - quando eu comento essas linhas, não há mais vazamento de memória. Eu perfilei isso em instrumentos.Eu recomendo usar o AVQueuePlayer para repetir seus vídeos sem problemas. Adicione o observador de notificações
e no seletor, faça um loop do seu vídeo
fonte
Para evitar a lacuna quando o vídeo é rebobinado, o uso de várias cópias do mesmo ativo em uma composição funcionou bem para mim. Encontrei-o aqui:
www.developers-life.com/avplayer-looping-video-without-hiccupdelays.html(link agora morto).fonte
isso funcionou para mim sem problemas de soluço, o ponto é pausar o player antes de chamar o método seekToTime:
init AVPlayer
registrando notificação
função videoLoop
fonte
Para Swift 3 e 4
fonte
minha solução no objetivo-c com AVQueuePlayer - parece que você precisa duplicar o AVPlayerItem e, ao terminar a reprodução do primeiro elemento, adicione instantaneamente outra cópia. "Mais ou menos" faz sentido e funciona para mim sem nenhum soluço
https://gist.github.com/neonm3/06c3b5c911fdd3ca7c7800dccf7202ad
fonte
Swift 5:
Fiz alguns pequenos ajustes nas respostas anteriores, como adicionar o playerItem à fila antes de adicioná-lo ao playerLayer.
E torne o playerLooper uma propriedade do seu UIViewController, caso contrário, o vídeo poderá ser reproduzido apenas uma vez.
fonte
Depois de carregar o vídeo no AVPlayer (através do seu AVPlayerItem, é claro):
O método addDidPlayToEndTimeNotificationForPlayerItem:
No seu método viewWillDisappear:
Na declaração da interface do seu controlador de exibição no arquivo de implementação:
Precisa ver isso em funcionamento antes de tentar? Faça o download e execute este aplicativo de exemplo:
https://developer.apple.com/library/prerelease/ios/samplecode/AVBasicVideoOutput/Listings/AVBasicVideoOutput_APLViewController_m.html#//apple_ref/doc/uid/DTS40013109-AVBasicVideoOutput_APLViewController_mID
No meu aplicativo, que usa esse mesmo código, não há pausa entre o final do vídeo e o início. De fato, dependendo do vídeo, não há como dizer que o vídeo está no início novamente, salve a exibição do código de tempo.
fonte
você pode adicionar um observador AVPlayerItemDidPlayToEndTimeNotification e reproduzir o vídeo do início no seletor, código como abaixo
fonte
O seguinte está funcionando para mim no WKWebView no swift 4.1 A parte principal do WKWebView no WKwebviewConfiguration
fonte
O que fiz foi fazer a reprodução em loop, como no meu código abaixo:
fonte
Swift 4.2 no Xcode 10.1.
Sim , existe uma maneira relativamente fácil de inserir um vídeo em
AVKit
/AVFoundation
usarAVQueuePlayer()
técnica de Observação de Valor-Chave (KVO) e um token para ele.Isso definitivamente funciona para vários vídeos H.264 / HEVC com uma carga mínima para a CPU.
Aqui está um código:
fonte
use AVPlayerViewController abaixo do código, está funcionando para mim
Todos os controles a serem mostrados, espero que seja útil
fonte
Esta propriedade já está definida por dentro
AVAudioPlayer
. Espero que isso possa ajudá-lo. Estou usando o Xcode 6.3.fonte