ios avplayer airplay mpnowplayinginfocenter

ios - MPNowPlayingInfoCenter no reacciona correctamente al pausar la reproducción



avplayer airplay (4)

¡Tengo la solución! Establecer solo MPMediaItemPropertyPlaybackDuration

1 - Cuando inicie la pista, establezca la propiedad con la duración total de la pista:

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter]; NSDictionary *songInfo = @{ MPMediaItemPropertyTitle: title, MPMediaItemPropertyArtist: artist MPMediaItemPropertyPlaybackDuration : [NSNumber numberWithFloat:length] }; center.nowPlayingInfo = songInfo;

2 - cuando pausa la pista ... no haga nada.

3 - cuando juegas la pista, establece la propiedad con el actualTiempo de seguimiento:

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter]; NSMutableDictionary *playingInfo = [NSMutableDictionary dictionaryWithDictionary:center.nowPlayingInfo]; [playingInfo setObject:[NSNumber numberWithFloat:player.currentTrackTime] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime]; center.nowPlayingInfo = playingInfo;

Estoy intentando que MPNowPlayingInfoCenter funcione correctamente al detener la reproducción. (Tengo una aplicación de música en tiempo real que usa AVPlayer para la reproducción, y estoy reproduciendo en mi Apple TV en Airplay.) Todo, excepto la pausa, parece reflejarse correctamente en la interfaz de usuario de Apple TV. Lo estoy inicializando así:

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter]; NSDictionary *songInfo = @{ MPMediaItemPropertyTitle: title, MPMediaItemPropertyArtist: artist }; center.nowPlayingInfo = songInfo;

Como estoy transmitiendo, no tengo información de duración al iniciar la reproducción. Cuando obtengo la señal de "listo" de la transmisión, actualizo la duración que se muestra correctamente en mi Apple TV:

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter]; NSMutableDictionary *playingInfo = [NSMutableDictionary dictionaryWithDictionary:center.nowPlayingInfo]; [playingInfo setObject:[NSNumber numberWithFloat:length] forKey:MPMediaItemPropertyPlaybackDuration]; center.nowPlayingInfo = playingInfo;

También puedo buscar con esta técnica cuando el usuario busca la pista:

[playingInfo setObject:[NSNumber numberWithFloat:length * targetProgress] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];

Lo único que no puedo entender es cómo pausar la cabeza lectora en mi Apple TV. Cuando el usuario toca pausa en mi interfaz de usuario, trato de hacer algo como:

MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter]; NSMutableDictionary *playingInfo = [NSMutableDictionary dictionaryWithDictionary:center.nowPlayingInfo]; [playingInfo setObject:[NSNumber numberWithFloat:0.0f] forKey:MPNowPlayingInfoPropertyPlaybackRate]; center.nowPlayingInfo = playingInfo;

En lugar de detenerse, esto busca que el cabeza de reproducción vuelva a cero y continúa avanzando.

¿Cómo hago para que la cabeza lectora se pause correctamente en mi Apple TV UI?


Aquí lo que busca, este funciona muy bien, agregue esto a su clase:

- (void)remoteControlReceivedWithEvent: (UIEvent *) receivedEvent { if (receivedEvent.type == UIEventTypeRemoteControl) { switch (receivedEvent.subtype) { case UIEventSubtypeRemoteControlTogglePlayPause:[self playPause:nil]; break; default: break; } } }

puede agregar funciones para avanzar o retroceder agregando otro código CASE como este:

case UIEventSubtypeRemoteControlBeginSeekingBackward:[self yourBackward:nil]; break;

y para llamar pausa de reproducción necesitas crear una acción como esta:

- (IBAction)playPause:(id)sender { if (yourPlayer.rate == 1.0){ [yourPlayer pause]; } else if (yourPlayer.rate == 0.0) { [yourPlayer play]; } }

Importante: cualquier caso que agregue necesita el IBAction

Espero que esto te ayude


Probé mi sugerencia a partir de los comentarios (hace aproximadamente un mes), y funcionó para mí:

[playingInfo setObject: [NSNumber numberWithFloat:0.000001f] forKey: MPNowPlayingInfoPropertyPlaybackRate];

(Es decir, mueva lentamente la barra de reproducción lentamente). NSTimer un NSTimer para restablecer MPNowPlayingInfoPropertyElapsedPlaybackTime periódicamente mientras está en pausa.

Para cualquiera que no haya usado NSTimer anteriormente, consulte ¿Cómo uso NSTimer? .


MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter]; NSDictionary *songInfo = @{ MPMediaItemPropertyTitle: title, MPMediaItemPropertyArtist: artist };

la llamada como

center setnowPlayingInfo = songInfo;