Почему MPMoviePlayerController предотвращает возобновление звука после окончания фильма? - PullRequest
0 голосов
/ 20 октября 2010

У меня есть класс, который воспроизводит повторяющуюся петлю фоновой музыки с AVAudioPlayer, а в определенных случаях воспроизводит полноэкранное видео со своей собственной звуковой дорожкой, используя MPMoviePlayerController.Чтобы иметь только одну дорожку за раз, я прекращаю фоновую музыку перед запуском видео:

-(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];
    }
}

Возобновление работало нормально, без воссоздания объекта AVAudioPlayer (т. Е. Возвращенный метод playДА) по аналогичному коду на версиях ОС вплоть до 3.2 включительно.Но на iOS4 метод play всегда возвращает NO и должен воссоздать объект.Почему это так, и могу ли я возобновить фоновую дорожку должным образом (у меня есть случаи, когда вышеупомянутое решение неприемлемо.)?

1 Ответ

2 голосов
/ 24 октября 2010

понял это. Оказывается, что в iOS 3.2 и выше, когда воспроизведение видео заканчивается, оно переходит в состояние MPMoviePlaybackStatePaused, а не MPMoviePlaybackStateStopped, и для того, чтобы оно освободило аппаратное обеспечение, необходимо явно вызвать метод stop для MPMoviePlayerController после завершения воспроизведения перед попыткой возобновления AVAudioPlayer.

...