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.