Olhei em volta, mas não consigo encontrar um protocolo de delegado para o AVPlayer class
. O que da?
Estou usando sua subclasse,, AVQueuePlayer
para reproduzir um array de AVPlayerItems
, cada um carregado de uma URL. Existe alguma maneira de chamar um método quando uma música termina de tocar? Principalmente no final da fila?
E se isso não for possível, há alguma maneira de chamar um método quando a música COMEÇA a tocar, após o armazenamento em buffer? Estou tentando colocar um ícone de carregamento lá, mas ele desliga o ícone antes de a música realmente começar, mesmo que seja depois da [audioPlayer play]
ação.
itemDidFinishPlaying:
, por exemplo, com dois pontos. DaNSNotificationCenter
documentação: o método especificado por notificationSelector deve ter um e apenas um argumento (uma instância deNSNotification
).Sim. Adicione um observador KVO ao status ou taxa do jogador:
- (IBAction)go { self.player = ..... self.player.actionAtItemEnd = AVPlayerActionStop; [self.player addObserver:self forKeyPath:@"rate" options:0 context:0]; } - (void)stopped { ... [self.player removeObserver:self]; //assumes we are the only observer } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (context == 0) { if(player.rate==0.0) //stopped [self stopped]; } else [super observeVal...]; }
Então, basicamente, é isso.
Isenção de responsabilidade: eu escrevi isso aqui, então não verifiquei se o código estava bom. TAMBÉM eu nunca usei o AVPlayer antes, mas deve estar certo.
fonte
Swift 3 - adiciono um observador a
AVPlayerItem
cada vez que adiciono um vídeo ao player:func playVideo(url: URL) { let playerItem = AVPlayerItem(asset: AVURLAsset(url: someVideoUrl)) NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidPlayToEndTime), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerItem) self.player.replaceCurrentItem(with: playerItem) self.player.play() } func playerItemDidPlayToEndTime() { // load next video or something }
fonte
Há muitas informações nos documentos da Apple AVFoundation Programming Guide (procure a seção de monitoramento de reprodução). Parece ser principalmente por meio do KVO, então você pode querer relembrar se não estiver muito familiarizado (há um guia para isso no Guia de Programação de Observação de Valores-Chave .
fonte
Estou usando este e funciona:
_player = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:_playingAudio.url]]; CMTime endTime = CMTimeMakeWithSeconds(_playingAudio.duration, 1); timeObserver = [_player addBoundaryTimeObserverForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:endTime]] queue:NULL usingBlock:^(void) { [_player removeTimeObserver:timeObserver]; timeObserver = nil; //TODO play next sound }]; [self play];
onde
_playingAudio
está minha classe personalizada com algumas propriedades etimeObserver
éid
ivar.fonte