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;