2011-12-06 12 views
6

Tengo un AVQueuePlayer (que obviamente se extiende a AVPlayer) que carga una lista de reproducción de transmisión de audio. La transmisión está funcionando bien, pero me gustaría tener un indicador de actividad para mostrar que se está cargando el audio del usuario. El problema es que parece que no puedo encontrar ninguna Notificación en el AVQueuePlayer (o AVPlayer) que indique cuándo el buffer de audio ha terminado de cargarse/está listo para jugar (ni parece haber un método de delegado). ¿Alguna idea?AVQueuePlayer/AVPlayer ¿Está cargando la notificación?

Respuesta

26

Deberá utilizar KVO para hacerlo.

Para cada elemento que se agrega a la cola, es posible que los observadores configuración como esta:

item_ = [[AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://somefunkyurl"]] retain]; 
[item_ addObserver:self forKeyPath:@"status" options:0 context:nil]; 
[item_ addObserver:self forKeyPath:@"playbackBufferEmpty" options:0 context:nil]; 

Ahora se puede evaluar el estado de ese elemento en el método de observador;

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([object isKindOfClass:[AVPlayerItem class]]) 
    { 
     AVPlayerItem *item = (AVPlayerItem *)object; 
     //playerItem status value changed? 
     if ([keyPath isEqualToString:@"status"]) 
     { //yes->check it... 
      switch(item.status) 
      { 
       case AVPlayerItemStatusFailed: 
        NSLog(@"player item status failed"); 
       break; 
       case AVPlayerItemStatusReadyToPlay: 
        NSLog(@"player item status is ready to play"); 
       break; 
       case AVPlayerItemStatusUnknown: 
        NSLog(@"player item status is unknown"); 
       break; 
      } 
     } 
     else if ([keyPath isEqualToString:@"playbackBufferEmpty"]) 
     { 
      if (item.playbackBufferEmpty) 
      { 
       NSLog(@"player item playback buffer is empty"); 
      } 
     } 
    } 
} 
+6

También se puede observar la propiedad de los objetos playbackBufferEmpty AVPlayerItem para detectar si/cuando el búfer se vacía durante la reproducción para que pueda mostrar un indicador de actividad o una advertencia 'buffering'. – reddersky

+0

@virorum ¡Buen punto, agregué ese a mi respuesta - ty! – Till

+2

Siempre podría subir mi comentario si le gustó ;-) – reddersky

Cuestiones relacionadas