ios audio avfoundation avplayer mpnowplayinginfocenter

ios - MPNowPlayingInfoCenter desaparece cuando se detiene la transmisión de audio



avfoundation avplayer (2)

Mi aplicación reproduce transmisión de audio a través de AVPlayer y usa MPNowPlayingInfoCenter para mostrar información sobre la transmisión en la pantalla de bloqueo del dispositivo.

Esto funciona bien cuando el audio se está reproduciendo, pero si el flujo se detiene debido a la desaceleración de la red (es decir, recibo AVPlayerItemPlaybackStalledNotification ), la información desaparece de la pantalla de bloqueo. Pero luego, si la transmisión continúa reproduciéndose, reaparece.

Esto es confuso porque cuando la información que se reproduce ahora desaparece de la pantalla de bloqueo, da la apariencia de que la aplicación ha detenido la reproducción. Pero luego se reanuda la reproducción, cuando la interfaz de usuario de la pantalla de bloqueo parece indicar que esto no sucederá.

¿Hay algo que pueda hacer para asegurarme de que la información que se está reproduciendo permanezca visible cada vez que se reproduce la transmisión, pero que actualmente no se debe a problemas de velocidad de la red? Parece que la única forma de mantener una interfaz de usuario de pantalla de bloqueo consistente es matar realmente la conexión de red cuando se detiene, lo cual es algo estúpido, pero al menos no confuso.

En caso de que más detalles ayudarían:

  • Cuando la aplicación recibe esa notificación, lo único que hace es actualizar la interfaz de usuario.
  • La aplicación nunca borra MPNowPlayingInfoCenter cuando hay un programa actual, por lo que mientras se supone que la transmisión se está reproduciendo, hay datos no vacíos que deberían mostrarse.

No tengo ningún problema cuando configuro la pantalla de bloqueo incluso en un problema de red.

También estoy tratando con la transmisión.

Y creo que la pantalla de bloqueo solo se ve afectada cuando la sesión de audio está activa o no.

Aquí puede ver mi código y no tengo ningún problema, espero que esto lo ayude.

-(void)setLockScreen { Class playingInfoCenter = NSClassFromString(@"MPNowPlayingInfoCenter"); if (playingInfoCenter) { [[AVAudioSession sharedInstance] setActive:YES error:nil]; NSError *myErr; if (![[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&myErr]) { // Handle the error here. NSLog(@"Audio Session error %@, %@", myErr, [myErr userInfo]); } else { [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self becomeFirstResponder]; } MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage:imgViewLogo.image]; NSArray *keys = [NSArray arrayWithObjects: MPMediaItemPropertyTitle, MPMediaItemPropertyArtist, MPMediaItemPropertyArtwork, MPNowPlayingInfoPropertyPlaybackRate, nil]; NSArray *values = [NSArray arrayWithObjects: [[self.arrChannel objectAtIndex:[AppDelegate sharedAppDelegate].selectedRow] objectForKey:@"name"], [[AppDelegate sharedAppDelegate].dictChannelsConfig objectForKey:@"venueName"], albumArt, [NSNumber numberWithInt:1], nil]; NSDictionary *mediaInfo = [NSDictionary dictionaryWithObjects:values forKeys:keys]; keys = nil; values = nil; albumArt = nil; [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:mediaInfo]; mediaInfo = nil; } }


Si tuviera que adivinar (y ha pasado un tiempo desde que utilicé AVFoundation), supongo que su sesión de audio será desactivada por el sistema operativo tan pronto como los datos dejen de fluir a través del buffer de audio. Un truco sería mantener un segundo AVPlayer que reproduzca el silencio para rellenar los puntos muertos hasta que hayas almacenado suficiente información para reanudar la reproducción o haya alcanzado algún tiempo de espera y simplemente te des por vencido. Usa la notificación para cambiar entre objetos de jugador.