Existe uma maneira de saber se uma AVPlayer
reprodução estagnou ou chegou ao fim?
106
Existe uma maneira de saber se uma AVPlayer
reprodução estagnou ou chegou ao fim?
Para obter uma notificação por chegar ao final de um item (via Apple ):
[[NSNotificationCenter defaultCenter]
addObserver:<self>
selector:@selector(<#The selector name#>)
name:AVPlayerItemDidPlayToEndTimeNotification
object:<#A player item#>];
E para acompanhar a reprodução, você pode:
"rastrear mudanças na posição do indicador de reprodução em um objeto AVPlayer" usando addPeriodicTimeObserverForInterval: queue: usingBlock: ou addBoundaryTimeObserverForTimes: queue: usingBlock: .
O exemplo é da Apple:
// Assume a property: @property (retain) id playerObserver;
Float64 durationSeconds = CMTimeGetSeconds([<#An asset#> duration]);
CMTime firstThird = CMTimeMakeWithSeconds(durationSeconds/3.0, 1);
CMTime secondThird = CMTimeMakeWithSeconds(durationSeconds*2.0/3.0, 1);
NSArray *times = [NSArray arrayWithObjects:[NSValue valueWithCMTime:firstThird], [NSValue valueWithCMTime:secondThird], nil];
self.playerObserver = [<#A player#> addBoundaryTimeObserverForTimes:times queue:NULL usingBlock:^{
// Passing NULL for the queue specifies the main queue.
NSString *timeDescription = (NSString *)CMTimeCopyDescription(NULL, [self.player currentTime]);
NSLog(@"Passed a boundary at %@", timeDescription);
[timeDescription release];
}];
-replaceCurrentItemWithPlayerItem:
, e não manuseá-lo corretamente. Uma maneira mais confiável para mim é rastrearAVPlayer
o status de usando o KVO. Veja minha resposta abaixo para mais detalhes: stackoverflow.com/a/34321993/3160561AVPlayerItemFailedToPlayToEndTimeNotification
Você pode saber que está jogando usando:
Extensão Swift 3:
fonte
- [AVPlayer setRate:-1.0]
), porque-1.0
é inferior a 0.No iOS10, há uma propriedade integrada para isso agora: timeControlStatus
Por exemplo, esta função reproduz ou pausa o avPlayer com base em seu status e atualiza o botão play / pause apropriadamente.
Quanto à sua segunda pergunta, para saber se o avPlayer chegou ao fim, a coisa mais fácil de fazer seria configurar uma notificação.
Quando chegar ao final, por exemplo, você pode retroceder até o início do vídeo e redefinir o botão Pausa para Reproduzir.
Esses exemplos são úteis se você estiver criando seus próprios controles, mas se usar um AVPlayerViewController, os controles vêm integrados.
fonte
rate
NÃO é a maneira de verificar se um vídeo está sendo reproduzido (ele pode travar). Da documentação derate
:Palavras-chave "desejo de reproduzir" - uma taxa de
1.0
não significa que o vídeo está sendo reproduzido.A solução desde o iOS 10.0 é usar o
AVPlayerTimeControlStatus
que pode ser observado naAVPlayer
timeControlStatus
propriedade.A solução anterior ao iOS 10.0 (9.0, 8.0 etc.) é lançar sua própria solução. Uma taxa de
0.0
significa que o vídeo está pausado. Quandorate != 0.0
isso significa que o vídeo está sendo reproduzido ou está parado.Você pode descobrir a diferença observando o tempo do jogador via:
func addPeriodicTimeObserver(forInterval interval: CMTime, queue: DispatchQueue?, using block: @escaping (CMTime) -> Void) -> Any
O bloco retorna a hora atual do jogador
CMTime
, então uma comparação delastTime
(a hora que foi recebida pela última vez do bloco) ecurrentTime
(a hora que o bloco acabou de reportar) dirá se o jogador está jogando ou está parado. Por exemplo, selastTime == currentTime
erate != 0.0
, então o jogador estagnou.Conforme observado por outros, descobrir se a reprodução terminou é indicado por
AVPlayerItemDidPlayToEndTimeNotification
.fonte
Uma alternativa mais confiável
NSNotification
é adicionar-se como observador àrate
propriedade do jogador .Em seguida, verifique se o novo valor para a taxa observada é zero, o que significa que a reprodução foi interrompida por algum motivo, como chegar ao fim ou travar devido ao buffer vazio.
Por
rate == 0.0
exemplo, para saber o que exatamente causou a interrupção da reprodução, você pode fazer as seguintes verificações:E não se esqueça de fazer o seu jogador parar quando chegar ao fim:
self.player.actionAtItemEnd = AVPlayerActionAtItemEndPause;
fonte
AVPlayerItemFailedToPlayToEndTimeNotification
. Se esse erro acontecer, nunca chegará ao horário de término. Ou lendo a resposta de maz, adicione ao seu código uma verificação paraplayer.error != nil
, caso em que a reprodução foi "encerrada" devido a um erro.AVPlayerItemDidPlayToEndTimeNotification
?Para Swift :
AVPlayer :
Atualização :
player.rate > 0
condição alterada paraplayer.rate != 0
porque se o vídeo estiver sendo reproduzido ao contrário, pode ser negativo graças a Julian por apontar.Nota : Isso pode ser parecido com a resposta acima (Maz), mas no Swift '! Player.error' estava me dando um erro do compilador, então você deve verificar se há erros usando 'player.error == nil' no Swift. (Devido à propriedade de erro não é do tipo 'Bool')
AVAudioPlayer:
AVQueuePlayer:
fonte
player.rate = -1.0
), porque -1.0 é menor que 0.Extensão Swift baseada na resposta de maz
fonte
A versão Swift da resposta de maxkonovalov é esta:
e
Obrigado maxkonovalov!
fonte
nil
! Mas preciso saber quando a visualização começa (não termina). Alguma maneira de fazer isso?Atualmente, com o swift 5, a maneira mais fácil de verificar se o player está jogando ou pausado é verificar a variável .timeControlStatus .
fonte
fonte
fonte