MPMoviePlayerViewController воспроизводит видео после перехода в фоновый режим для YouTube

Я установил App Plays Audio для обязательных фоновых режимов в моем приложении info.plist, чтобы mpmovieplayerviewcontroller не закрывался после перехода в фоновый режим. Это проделало большую работу. Однако Apple недавно отклонила обновление моего приложения, поскольку я установил этот атрибут.

Затем я продолжаю находить решения для выполнения той же работы, но терплю неудачу. Чтобы справиться с этим, я сохраняю текущее время воспроизведения, когда контроллер представления получает UIApplicationDidEnterBackgroundNotification

-(void)willEnterBackground {
    NSLog(@"willEnterBackground");
    if (self.mp) {
        playbackTime = self.mp.moviePlayer.currentPlaybackTime;
        [self.mp dismissModalViewControllerAnimated:YES];
    }
}

И установите currentPlayBackTime после того, как он получит UIApplicationWillEnterForegroundNotification:

- (void)willEnterForeground {
    NSLog(@"willEnterForeground");

    if (!self.mp)
        return;
    if(self.mp.moviePlayer.playbackState == MPMoviePlaybackStateInterrupted || self.mp.moviePlayer.playbackState == MPMoviePlaybackStateStopped || self.mp.moviePlayer.playbackState == MPMoviePlaybackStatePaused)
    {
        [self continuePlayback];
    }
}

- (void)continuePlayback {
    NSLog(@"%f", self.mp.moviePlayer.duration);
    NSLog(@"%f", playbackTime);
    [self.mp.moviePlayer stop];
    self.mp = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:[self.videos objectForKey:@"medium"]]] ;
    [self.mp.moviePlayer setInitialPlaybackTime:playbackTime];
    [self.mp.moviePlayer play];
    [self presentModalViewController:self.mp animated:YES];
}

Это работает, но с некоторым компромиссом: когда я повторно запускаю его, он теряет часть потокового видео. Пользователям нужно снова дождаться потоковой передачи.

А вот и мои вопросы:

  1. Есть ли способ продолжать потоковое видео с Youtube, когда приложение находится в фоновом режиме?
  2. или как сохранить потоковую часть?

Видео будет воспроизводиться с начала, если я пропущу строку:

self.mp = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:[self.videos objectForKey:@"medium"]]] ;

в методе continuePlayBack или я устанавливаюCurrentPlayBackTime вместо setInitPlayBackTime.


person Horst    schedule 13.03.2013    source источник
comment
stackoverflow.com /вопросы/13023241/   -  person Tunvir Rahman Tusher    schedule 13.02.2014


Ответы (1)


То, что вы там обнаружили, совершенно нормально — странно, но нормально. MPMoviePlayerController уважает initialPlaybackTime только при использовании в новом экземпляре. Я действительно призываю вас подать отчет об ошибке по этой проблеме, поскольку она известна с незапамятных времен (iOS3), но не исправлена.

Невозможно сохранить состояние буфера, и решение, которое вы разработали, почти такое же, как я использую во многих приложениях.


Теперь напрямую отвечая на ваши вопросы;

1) Да и нет. Как вы сами обнаружили, Apple очень резко отнеслась к использованию UIBackgroundModes. Несмотря на то, что они явно рекомендуют использовать его для обеспечения непрерывной потоковой передачи AirPlay (видео и аудиоконтента), они по-прежнему отвергают приложения, когда все, что они делают, — это воспроизведение видео. Это я также считаю эпическим провалом со стороны команды проверки Apple. Возможно, вы захотите попытаться оспорить их отказ, процитировав их собственную документацию:

Важно! Звуковой ключ UIBackgroundModes позволит приложениям транслировать аудио- или видеоконтент в фоновом режиме с помощью AirPlay.

Откуда: http://developer.apple.com/library/ios/#qa/qa1668/_index.html

относительно 2) Нет (см. вводный текст ответа)


Подниму тему с другой стороны...

Если ваша проблема на самом деле заключается в том, что на iOS5 устройство переходит в спящий режим во время потоковой передачи через AirPlay. Тогда на самом деле есть один возможный обходной путь, который, по крайней мере, работает, хотя он чертовски неприятный...

Вы можете зарегистрироваться на MPMoviePlayerIsAirPlayVideoActiveDidChangeNotification и проверить airPlayVideoActive внутри перехваченного метода. Когда AirPlay активен, просто предотвратите холостой ход, установив [UIApplication sharedApplication].idleTimerDisabled = YES; Не забудьте сделать обратное, когда AirPlay станет неактивным. Все это должно быть необходимо только на iOS5, так как iOS6 исправила проблему холостого хода при активном AirPlay.

person Till    schedule 14.03.2013
comment
Спасибо за ответ. К вашему сведению, я уже цитировал это предложение для борьбы с отказом, но безуспешно. они продолжают отклонять мое обновление по той же причине. Я приму ваш ответ, когда перестану пытаться. - person Horst; 15.03.2013
comment
@fattomhk добавил частичное решение проблемы. - person Till; 15.03.2013
comment
Хотя это не мой случай, приятно знать, что в iOS5 может возникнуть другая проблема. Я отказываюсь от поиска ответа, так как хочу опубликовать обновление как можно скорее. Я верю, что однажды появится флаг для фоновой потоковой передачи. - person Horst; 18.03.2013