0

J'ai une classe qui joue une boucle répétitive de musique de fond avec un AVAudioPlayer, et à une occasion spécifique, joue une vidéo plein écran avec sa propre piste sonore en utilisant MPMoviePlayerController. Pour avoir seulement une piste à la fois, j'arrêter la musique de fond avant de lancer la vidéo:Pourquoi MPMoviePlayerController empêche-t-il la reprise de l'audio une fois le film terminé?

-(void)startVideo{ 
    [backgroundMusic stop]; 
    MPMoviePlayerViewController *mp = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"videofile" ofType:@"m4v"]]]; 
    [self presentMoviePlayerViewControllerAnimated:mp]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoOver) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 
    [mp.moviePlayer play]; 
    [mp release]; 
} 

-(void)videoOver{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 
    if(![backgroundMusic play]){ 
     NSLog(@"bad: can't resume bg music!"); 
     [backgroundMusic release]; 
     backgroundMusic = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"videofile" ofType:@"m4v"]] error:NULL]; 
     backgroundMusic.delegate = self; 
     backgroundMusic.numberOfLoops = -1; 
     [backgroundMusic play]; 
    } 
} 

La reprise a bien fonctionné sans recréer l'objet AVAudioPlayer (la méthode play retour OUI) sur le code analogue sur OS versions jusqu'à et y compris 3.2. Mais sur iOS4, la méthode play renvoie toujours NON et doit recréer l'objet. Pourquoi est-ce, et puis-je reprendre la piste de fond correctement (j'ai des cas où la solution utilisée ci-dessus est inacceptable)?

Répondre

2

Compris ceci. Il s'avère que dans iOS 3.2 et supérieur, quand une vidéo finit de jouer, il passe en état MPMoviePlaybackStatePaused plutôt que MPMoviePlaybackStateStopped, et afin de le faire libérer le matériel, vous devez explicitement appeler la méthode stop sur MPMoviePlayerController après avoir fini de jouer avant essayer de reprendre AVAudioPlayer.