iphone ios audio avplayer avqueueplayer

iphone - ¿Cómo obtener una devolución de llamada desde AVQueuePlayer/AVPlayerItem cuando la red se activa(y está lista para jugar)?



avplayer windows (1)

Tengo un reproductor de transmisión de audio basado en AVQueuePlayer que necesita ejecutarse en segundo plano. El jugador debe continuar corriendo hasta que termine de jugar toda la lista. Por supuesto, tendrá que pausar si la conexión de red se vuelve incorrecta, pero debe reanudarse automáticamente cuando la conexión de red regrese.

Para esto, estoy monitoreando

  • AVPlayerItem.status
  • AVPlayerItem.playbackLikelyToKeepUp
  • AVPlayer.currentItem
  • AVPlayer.status
  • AVPlayer.error

usando KVO. Por ejemplo, si la conexión de red se recupera de un error temporal, espero que currentAVPlayerItem.status convierta en AVPlayerStatusItemReadyToPlay , que se informará a mi reproductor y puedo emitir [AVQueuePlayer play] en ese momento.

Este mecanismo (lógica) parece funcionar en algunos casos, pero con bastante frecuencia en entornos fuera de línea, AVPlayerItem.status convierte en AVPlayerItemStatusFailed , que elemento AVQueuePlayer parece omitir automáticamente. Como resultado, la cola terminará vacía y no se puede recibir una devolución de llamada desde AVPlayerItem .

Esperaba que algunas propiedades en AVPlayer cambien cuando la conexión de red se AVPlayer o se recupere, pero nada parece cambiar ( status , error , etc.).

Obviamente puedo monitorear la Reachability , pero eso no funciona cuando la aplicación se ejecuta en segundo plano.

¿Cómo puedo saber cuándo la red vuelve a funcionar y AVQueuePlayer se puede reproducir de nuevo en esta situación?

Puede que solo sea un principiante en esta área. Si alguien puede darme una idea general de cómo logra la experiencia continua de AVQueuePlayer sin ser completamente detenido por problemas temporales de conexión de red, ¡eso también sería una gran ayuda!


Puede supervisar AVPlayerItemPlaybackStalledNotification para saber cuándo el elemento terminó de reproducir su búfer pero no el archivo completo:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(AVPlayerItemPlaybackStalledNotification:) name:AVPlayerItemPlaybackStalledNotification object:playerItem];

Una vez que hay suficiente memoria intermedia para continuar, debe recibir una notificación para playbackLikelyToKeepUp que parece que ya está supervisando.