45 votes

MPNowPlayingInfoCenter ne réagissent pas correctement lors de la pause de la lecture

Je suis en train d'essayer d'obtenir MPNowPlayingInfoCenter pour fonctionner correctement lors de la pause de la lecture. (J'ai un streaming de musique app qui utilise AVPlayer pour la lecture, et je joue de retour dans mon Apple TV sur Airplay.) Tout mais la suspension semble être un reflet correctement dans l'Apple TV de l'INTERFACE utilisateur. Je suis l'initialiser comme ceci:

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

Depuis que je suis en streaming, je n'ai pas de durée d'info dès le démarrage de la lecture. Quand je me "prête" signal du ruisseau, je l'ai mise à jour de la durée qui s'affiche correctement sur mon Apple TV:

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

Je peux également rechercher avec cette technique lorsque l'utilisateur cherche à la piste:

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

La seule chose que je n'arrive PAS à comprendre, comment mettre en pause la tête de lecture sur mon Apple TV. Lorsque l'utilisateur touche pause dans mon INTERFACE, je suis en train de faire quelque chose comme:

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

Au lieu de la pause, il s'agit de la tête de lecture à zéro et maintient la faire progresser.

Comment puis-je obtenir la tête de lecture pour mettre en pause correctement dans mon Apple TV de l'INTERFACE utilisateur?

15voto

Damien Points 468

J'ai la solution! Définir les MPMediaItemPropertyPlaybackDuration

1 - Lorsque vous commencez à la piste, définissez la propriété avec la durée totale de la piste:

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

2 - lorsque vous mettez en pause la piste... ne rien faire.

3 - lorsque vous jouez de la piste, définissez la propriété avec le currentTrackTime:

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

3voto

Jhon Points 581

Voici ce que vous chercher, ce travail très bon de l'ajouter à votre Classe:

- (void)remoteControlReceivedWithEvent: (UIEvent *) receivedEvent {

    if (receivedEvent.type == UIEventTypeRemoteControl) {

        switch (receivedEvent.subtype) {

            case UIEventSubtypeRemoteControlTogglePlayPause:[self playPause:nil];

                break;

            default: break;
        }
    }
}

vous pouvez ajouter des fonctions pour l'avant ou vers l'arrière, avec l'ajout d'autres CAS, le code comme ceci:

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

et à l'appel de play pause vous avez besoin pour créer une action comme ceci:

- (IBAction)playPause:(id)sender {

    if (yourPlayer.rate == 1.0){

        [yourPlayer pause];
    } else if (yourPlayer.rate == 0.0) {

        [yourPlayer play];
    }
}

Important: en tout cas vous avez besoin de l'ajout de la IBAction

Espérons que cette aide vous

-1voto

Aaron Brager Points 16394

J'ai essayé ma suggestion d'après les commentaires (il y a un mois), et ils ont travaillé pour moi:

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

(Qui est, déplacez la tête de lecture verrrrry lentement.) J'ai ajouté une NSTimer pour réinitialiser l' MPNowPlayingInfoPropertyElapsedPlaybackTime régulièrement alors qu'il est en pause.

Pour quelqu'un qui n'a pas utilisé NSTimer avant, veuillez consulter Comment puis-je utiliser NSTimer?.

-2voto

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

l'appel comme

center setnowPlayingInfo = songInfo;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X