He mirado a mi alrededor pero no puedo encontrar un protocolo de delegado para AVPlayer class
. ¿Lo que da?
Estoy usando su subclase, AVQueuePlayer
para reproducir una matriz de AVPlayerItems
, cada uno cargado desde una URL. ¿Hay alguna forma de llamar a un método cuando una canción termina de reproducirse? ¿Notablemente al final de la cola?
Y si eso no es posible, ¿hay alguna forma de que pueda llamar a un método cuando la canción COMIENZA a reproducirse, después del almacenamiento en búfer? Estoy tratando de obtener un ícono de carga allí, pero apaga el ícono antes de que comience la música, a pesar de que es después de la [audioPlayer play]
acción.
itemDidFinishPlaying:
, por ejemplo, con dos puntos. De laNSNotificationCenter
documentación: El método especificado por notificationSelector debe tener uno y solo un argumento (una instancia deNSNotification
).Si. Agregue un observador de KVO al estado o tasa del jugador:
- (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...]; }
Básicamente, eso es todo.
Descargo de responsabilidad: escribí eso aquí, así que no verifiqué si el código era bueno. TAMBIÉN nunca he usado AVPlayer antes, pero debería estar bien.
fuente
Swift 3 : agrego un observador
AVPlayerItem
cada vez que agrego un video al reproductor: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 }
fuente
Hay mucha información en la Guía de programación de AVFoundation de Apple docs (busque la sección de monitoreo de reproducción). Parece ser principalmente a través de KVO, por lo que es posible que desee repasar eso si no está demasiado familiarizado (hay una guía para eso para la Guía de programación de observación de valores clave .
fuente
Estoy usando este y 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];
donde
_playingAudio
está mi clase personalizada con algunas propiedades ytimeObserver
esid
ivar.fuente