¿Hay alguna forma de saber si una AVPlayer
reproducción se ha detenido o ha llegado al final?
106
¿Hay alguna forma de saber si una AVPlayer
reproducción se ha detenido o ha llegado al final?
Para recibir una notificación por llegar al final de un artículo (a través de Apple ):
[[NSNotificationCenter defaultCenter]
addObserver:<self>
selector:@selector(<#The selector name#>)
name:AVPlayerItemDidPlayToEndTimeNotification
object:<#A player item#>];
Y para rastrear la reproducción puedes:
"seguir los cambios en la posición de la cabeza lectora en un objeto AVPlayer" mediante el uso de addPeriodicTimeObserverForInterval: cola: usingBlock: o addBoundaryTimeObserverForTimes: cola: usingBlock: .
El ejemplo es de 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:
, y no lo maneja correctamente. Una forma más confiable para mí es rastrearAVPlayer
el estado usando KVO. Vea mi respuesta a continuación para obtener más detalles: stackoverflow.com/a/34321993/3160561AVPlayerItemFailedToPlayToEndTimeNotification
Puedes saber que está jugando usando:
Extensión Swift 3:
fuente
- [AVPlayer setRate:-1.0]
), porque-1.0
es menor que 0.En iOS10, hay una propiedad incorporada para esto ahora: timeControlStatus
Por ejemplo, esta función reproduce o pausa el avPlayer según su estado y actualiza el botón de reproducción / pausa de manera apropiada.
En cuanto a su segunda pregunta, para saber si avPlayer llegó al final, lo más fácil sería configurar una notificación.
Cuando llega al final, por ejemplo, puede rebobinar hasta el principio del video y restablecer el botón Pausa a Reproducir.
Estos ejemplos son útiles si está creando sus propios controles, pero si usa un AVPlayerViewController, los controles vienen integrados.
fuente
rate
NO es la forma de comprobar si se está reproduciendo un vídeo (podría bloquearse). De documentación derate
:Palabras clave "deseo de reproducir": una tasa de
1.0
no significa que el video se esté reproduciendo.La solución desde iOS 10.0 es usar lo
AVPlayerTimeControlStatus
que se puede observar en laAVPlayer
timeControlStatus
propiedad.La solución anterior a iOS 10.0 (9.0, 8.0, etc.) es desarrollar su propia solución. Una tasa de
0.0
significa que el video está en pausa. Cuandorate != 0.0
significa que el video se está reproduciendo o está bloqueado.Puede averiguar la diferencia observando el tiempo del jugador a través de:
func addPeriodicTimeObserver(forInterval interval: CMTime, queue: DispatchQueue?, using block: @escaping (CMTime) -> Void) -> Any
El bloque devuelve el tiempo del jugador actual
CMTime
, por lo que una comparación delastTime
(el tiempo que se recibió por última vez del bloque) ycurrentTime
(el tiempo que el bloque acaba de informar) dirá si el jugador está jugando o está estancado. Por ejemplo, silastTime == currentTime
yrate != 0.0
, entonces el jugador se ha estancado.Como han señalado otros, averiguar si la reproducción ha finalizado se indica mediante
AVPlayerItemDidPlayToEndTimeNotification
.fuente
Una alternativa más confiable
NSNotification
es agregarse como observador a larate
propiedad del jugador .Luego, verifique si el nuevo valor para la tasa observada es cero, lo que significa que la reproducción se ha detenido por algún motivo, como llegar al final o estancarse debido a que el búfer está vacío.
Por
rate == 0.0
ejemplo, para saber qué causó exactamente la detención de la reproducción, puede realizar las siguientes comprobaciones:Y no olvide hacer que su reproductor se detenga cuando llegue al final:
self.player.actionAtItemEnd = AVPlayerActionAtItemEndPause;
fuente
AVPlayerItemFailedToPlayToEndTimeNotification
. Si ocurre este error, nunca llegará a la hora de finalización. O leyendo la respuesta de maz, agregue a su código una marca de verificaciónplayer.error != nil
, en cuyo caso la reproducción ha "terminado" debido a un error.AVPlayerItemDidPlayToEndTimeNotification
?Para Swift :
AVPlayer :
Actualización : la
player.rate > 0
condición cambió aplayer.rate != 0
porque si el video se reproduce al revés puede ser negativo gracias a Julian por señalarlo.Nota : Esto puede verse igual que la respuesta anterior (Maz) pero en Swift '! Player.error' me estaba dando un error de compilador, por lo que debe verificar el error usando 'player.error == nil' en Swift. (Porque la propiedad de error no es de tipo 'Bool')
AVAudioPlayer:
AVQueuePlayer:
fuente
player.rate = -1.0
), porque -1.0 es menor que 0.Extensión rápida basada en la respuesta de maz
fuente
La versión Swift de la respuesta de maxkonovalov es esta:
y
¡Gracias maxkonovalov!
fuente
nil
! Pero necesito saber cuándo comienza la vista (no termina). ¿Alguna forma de hacer esto?Actualmente, con swift 5, la forma más fácil de comprobar si el reproductor está reproduciendo o en pausa es comprobar la variable .timeControlStatus .
fuente
fuente
fuente