Ответ на уведомления MPMoviePlayerController во время фонового воспроизведения мультимедиа - PullRequest
6 голосов
/ 31 января 2012

У меня есть приложение, которое передает потоковое видео из сети и воспроизводит его, используя объект MPMoviePlayerController для воспроизведения на устройстве или через AirPlay.

Приложение поддерживает фоновые операции и имеет опцию 'audio', указанную в обязательном ключе UIBackgroundModes в своем файле plist.

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

Согласно документации Apple :

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

Однако эти обратные вызовы не выполняются.

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

Глядя на заметки Apple, я определенно ожидал бы получить первый тип обратного вызова, чтобы приложение могло отвечать на MPMoviePlayerPlaybackStateDidChangeNotification, MPMoviePlayerPlaybackDidFinishNotification и MPMoviePlayerLoadStateDidChangeNotification, но этого не происходит.

Кто-нибудь знает, возможно ли получить их во время фонового воспроизведения AirPlay и, если да, как это было достигнуто?

** Обратите внимание: приложение работает корректно при запуске на переднем плане и получает уведомления в порядке. Только при нажатии на фон и воспроизведении через AirPlay уведомления не принимаются.

Аналогично, видео воспроизводится поверх AirPlay в фоновом режиме. Это только уведомления, которые не получены **

Ответы [ 3 ]

4 голосов
/ 11 февраля 2012

У меня была эта проблема, и я исправил ее, хотя это было несколько месяцев назад.Я мог бы отправить вам весь мой класс для воспроизведения фильма, если это не сработает.Обратите внимание, что используется модель контроллера навигации.

ПРИМЕЧАНИЕ. Это тестируется на iPad 2, а не на iPhone.

Я показываю свой VC следующим образом:

 - (IBAction)playMovie:(id)sender {

    MovieVC* movController = [[MovieVC alloc] initWithID:2];
    movController.view.backgroundColor = [UIColor blackColor];
    AppDelegate *appDel = [[UIApplication sharedApplication] delegate];

    [appDel.navigationController pushViewController:movController animated:NO];
    [movController release];
}

Затем в моем классе контроллера просмотра MovieVC я настроил воспроизведение видео следующим образом:

- (void)initMoviePlayer {

    mMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[self getMovieURL]];

    mMoviePlayer.allowsAirPlay = YES;   

    mMoviePlayer.view.frame = [self.view bounds];

    mMoviePlayer.view.backgroundColor = [UIColor clearColor];

    mMoviePlayer.shouldAutoplay = YES;

    mMoviePlayer.fullscreen = YES;

    mMoviePlayer.scalingMode = MPMovieScalingModeAspectFit;

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(moviePreloadDidFinish:) 
                                             name:MPMoviePlayerLoadStateDidChangeNotification 
                                           object:mMoviePlayer];

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(moviePlayBackDidFinish:) 
                                                  name:MPMoviePlayerPlaybackDidFinishNotification 
                                           object:nil];
}

Это исправило это для меня, если не исправлял комментарии и плохо редактировал весь файл класса.

2 голосов
/ 09 февраля 2012

В одном из моих проектов я сделал то, что ты сделал, и это сработало для меня.Два отличия в моем проекте:

  • Я не транслирую через airPlay (только воспроизведение с устройства),
  • Я просто воспроизводю аудиофайлы.

Myпошагово:

  • Добавьте опцию аудио к UIBackgroundModes в файле plist,
  • Зарегистрируйтесь в Центре уведомлений для MPMoviePlayerPlaybackDidFinishNotification и MPMoviePlayerPlaybackStateDidChangeNotification сследующий код:

    [[NSNotificationCenter defaultCenter]
                    addObserver:self
                       selector:@selector(playbackStateChanged:)
                           name:MPMoviePlayerPlaybackStateDidChangeNotification
                         object:moviePlayer];
    
    [[NSNotificationCenter defaultCenter]
                    addObserver:self
                       selector:@selector(playbackEnded:)
                           name:MPMoviePlayerPlaybackDidFinishNotification
                         object:moviePlayer];
    

Работает как шарм.

0 голосов
/ 15 февраля 2012

Для полноты, я должен добавить, что в настоящее время я считаю, что нет решения этой проблемы.

Я обсуждал это напрямую с Apple через техподдержку, и практического обходного пути не было.

Эта функциональность была необходима, чтобы приложение могло регулярно записывать статистику о воспроизведении потока.Хотя это нормально, когда видео воспроизводится на экране устройства и поверх AirPlay, когда приложение находится на переднем плане, это невозможно сделать с приложением в фоновом режиме.

Решение, которое я использовалвместо этого используется для отключения таймера простоя во время всех типов воспроизведения и последующего включения, используя:

[UIApplication sharedApplication].idleTimerDisabled = YES;

и

[UIApplication sharedApplication].idleTimerDisabled = NO;

Пока это не 'Решение оригинального вопроса - это обходной путь, позволяющий избежать проблемы.

...