Подтвердить что ты не робот

MPMoviePlayerController ломается/останавливается после перехода на полноэкранный режим в iOS6

У меня есть MPMoviewPlayerViewController, встроенный в объект UIView. Когда я запускаю плеер во встроенном режиме, все работает отлично и, как ожидалось. Если пользователь затем вступает в полноэкранный режим (или если я программно переключаюсь в полноэкранный режим с помощью setFullscreen:animated), плеер переходит в полноэкранный режим, фильм воспроизводится в течение еще одной секунды, после чего экран становится черным только с сообщением "Загрузка...".

Такое поведение появляется только при использовании iOS 6 (также iPad 6.0 Simulator), на устройствах под управлением iOS 5 все работает по назначению.

Источник фильма - это локальный файл из пакета приложений.

После воспроизведения и ввода полноэкранного режима вывод отладки выглядит следующим образом:

2012-09-26 15:24:48.251 [39895:c07] [MPAVController] Autoplay: Disabling autoplay for pause
2012-09-26 15:24:48.252 [39895:c07] [MPAVController] Autoplay: Disabling autoplay
2012-09-26 15:24:48.262 [39895:c07] [MPAVController] Autoplay: Enabling autoplay
2012-09-26 15:24:48.265 [39895:c07] [MPAVController] Autoplay: Likely to keep up or full buffer: 0
2012-09-26 15:24:48.266 [39895:c07] [MPAVController] Autoplay: Skipping autoplay, not enough buffered to keep up.
2012-09-26 15:24:48.267 [39895:c07] [MPAVController] Autoplay: Likely to keep up or full buffer: 0
2012-09-26 15:24:48.268 [39895:c07] [MPAVController] Autoplay: Skipping autoplay, not enough buffered to keep up.
2012-09-26 15:24:48.276 [39895:c07] [MPAVController] Autoplay: Skipping autoplay, disabled (for current item: 0, on player: 1)
2012-09-26 15:24:48.286 [39895:c07] [MPCloudAssetDownloadController] Prioritization requested for media item ID: 0
2012-09-26 15:24:48.938 [39895:c07] [MPAVController] Autoplay: Enabling autoplay
2012-09-26 15:24:48.940 [39895:c07] [MPAVController] Autoplay: Enabling autoplay
2012-09-26 15:24:48.954 [39895:c07] [MPAVController] Autoplay: Skipping autoplay, disabled (for current item: 0, on player: 1)
2012-09-26 15:24:49.006 [39895:c07] [MPAVController] Autoplay: Enabling autoplay
2012-09-26 15:24:49.012 [39895:c07] [MPAVController] Autoplay: Skipping autoplay, disabled (for current item: 0, on player: 1)

Есть ли у кого-нибудь идея, почему плеер перестает работать?

Edit: Добавлен проект на github

4b9b3361

Ответ 1

Я решил это сам. Когда я добавляю Movie Player в качестве представления в виде контейнера, мне не нужно использовать фактический контроллер представления, созданный с помощью MPMoviePlayerViewController, который предназначен для его представления в виде модально или в какой-либо другой иерархии vc.

Для единственной цели наличия представления Movie Player, которое может быть добавлено в какое-либо другое представление в качестве подчиненного представления, свойство представления MPMoviePlayerController достаточно.

До тех пор, пока iOS 6 не работали, но iOS 6, похоже, отличается в отношении управления ресурсами/срока службы.

Пример проекта обновляется рабочим кодом.

Ответ 2

Вы останавливаете видео в viewWillDisappear: или viewDidDisappear:? Эти методы вызывают, когда видео входит в полноэкранный режим на iOS 6, но не в каких-либо более ранних версиях iOS (был отправлен отчет в Open Radar для эта "ошибка" ). Я разместил это временное решение по аналогичному вопросу:

Мое временное решение до тех пор, пока ошибка не будет исправлена, это проверить проигрыватель fullscreen Логическое значение в viewWillDisappear: и/или viewDidDisappear:. Если он возвращает YES, фильм переходит в полноэкранный режим, и вы должны воздерживаться от действий, которые могут его прервать.

Ответ 3

Я решил эту проблему с другим подходом. Поскольку основной причиной проблемы является iOS 6, вызывающая viewWillDisappear: и/или viewDidDisappear: методы. Я думал, что, возможно, iOS также вызывает те же методы MPMoviePlayerViewController. Поэтому я создал категорию для MPMoviePlayerViewController и реализовал методы viewWillDisappear: и/или viewDidDisappear:. Интересно, что это работает. (кстати, это не рекомендуется яблоком)

Вот коды:

Заголовок (MPMoviePlayerViewController_FullscreenFix.h)

#import <MediaPlayer/MediaPlayer.h>

@interface MPMoviePlayerViewController (MPMoviePlayerViewController_FullscreenFix)
- (void)viewDidDisappear:(BOOL)animated;
- (void)viewWillDisappear:(BOOL)animated;
@end

Реализация (MPMoviePlayerViewController_FullscreenFix.m)

#import "MPMoviePlayerViewController_FullscreenFix.h"

@implementation MPMoviePlayerViewController (MPMoviePlayerViewController_FullscreenFix)

-(void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
}

@end

Теперь мой код работает как с версиями iOS 6.1.3, 5.5.1, так и с 4.3.5 с точно таким же поведением.

Ответ 4

У меня была та же проблема, но с загрузкой видео с URL-адреса (в Интернете)

Ранее я:

  • Подписка на уведомления MPMoviePlayerPlaybackDidFinishNotification
  • Инициализировано a MPMoviePlayerViewController (на этом этапе нет URL-адреса контента)
  • Представлено через presentMoviePlayerViewControllerAnimated:
  • Пока он был на экране, я загрузил потоковый URL (асинхронно)
  • Когда вернется URL-адрес, я бы установил URL-адрес контента на MPMoviePlayerViewController 'moviePlayer

Как вы уже сказали, иногда MPMoviePlayerViewController застрял и не уклонился бы от себя, когда пользователь удалит выход, чтобы исправить это, я изменил свой порядок автозапуска, поэтому поток стал:

  • Подписка на уведомления MPMoviePlayerPlaybackDidFinishNotification
  • Инициализировано a MPMoviePlayerViewController (на этом этапе нет URL-адреса контента)
  • Установите для MoviePlayer shouldAutoplay boolean значение NO
  • Представлено через presentMoviePlayerViewControllerAnimated:
  • Пока он был на экране, я загрузил потоковый URL (асинхронно)
  • Когда вернется URL-адрес, я бы установил URL-адрес контента на MPMoviePlayerViewController 'moviePlayer
  • Установите для параметра moviePlayer shouldAutoplay значение boolean значение YES

С тех двух изменений я еще не видел, как контроллер застревает

Ответ 5

У меня было что-то похожее на iOS 6.

Вы пытались заставить игрока играть после выхода в полноэкранный режим? Вызвав [MPMoviePlayerController play] снова, например, - это частично решило проблему, которую я имел.

Ответ 6

Проверьте точный URL-адрес после того, как вы установили URL-адрес содержимого проигрывателя. Он может содержать некоторые незаконные символы.

    NSLog(@"%@", player.contentURL);

Симулятор удаляет пробелы, но устройство этого не делает. Что случилось со мной.

Ответ 7

Решение представляет собой свойство сохранить класс MPMoviePlayerController

@property (nonatomic, retain) MPMoviePlayerController *moviePlayerController;

и используйте свойство в контроллере

self.moviePlayerController = [[MPMoviePlayerController alloc] init];

[_viewMediaPlayer addSubview:self.moviePlayerController.view];

есть ошибка в iOS6, и MPMoviePlayerController освобождается при вводе в полноэкранном режиме http://openradar.appspot.com/12327997

Ответ 8

Итак, для меня это решение сработало:

if( !( player.playbackState == MPMoviePlaybackStatePlaying ) ) {
    player.shouldAutoplay = YES;
    [player prepareToPlay];
    [player stop];
    [player play];
}

добавление "shouldAutoplay" и "stop"

С уважением, Элиза

Ответ 9

Просто добавьте shouldAutoplay boolean для YES после создания URL-адреса Это сработало для меня.

вот так:

NSString *path = [[NSBundle mainBundle] pathForResource:videoFileName ofType:@"mp4" inDirectory:nil];
    NSURL *movieURL = [NSURL fileURLWithPath:path];
    MPMoviePlayerController *player = [[MPMoviePlayerController alloc] init]; 

    player.contentURL = movieURL;
    player.controlStyle = MPMovieControlStyleNone;    

    player.shouldAutoplay = YES;
    [player prepareToPlay];
    player.fullscreen = YES;

    [player.view setFrame:[[[[UIApplication sharedApplication] delegate] window] frame]];  // player frame must match parent's

    [[[[UIApplication sharedApplication] delegate] window] addSubview: player.view];

    [player play];

Ответ 10

Еще один способ справиться с этим - использовать обратный вызов полного экрана:

1) Добавить уведомление для проигрывателя MPMoviePlayerDidEnterFullscreenNotification. 2) Перед воспроизведением фильма установите логическое значение, указывающее, что фильм входит в полноэкранный режим. 3) Очистите логическое значение NO в вашем обратном вызове на весь экран, а также завершение обратного вызова вашего фильма. 4) В вашем представленииWillDisappear проверьте, является ли ваш логический объект, чтобы увидеть, входит ли ваш фильм во весь экран и обрабатывается по мере необходимости.

Также при представлении MPMoviePlayerViewController использование функции setFullScreen после представления может привести к остановке фильма на iOS6.

Ответ 11

Мое решение для работы:

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

[MPCloudAssetDownloadController] Prioritization requested for media item ID: 0
[MPAVController] Autoplay: Skipping autoplay, disabled (for current item: 0, on player: 1)

I решил, поставив команду остановить непосредственно перед командой play:

[playerController stop];
[playerController play];

Теперь он отлично работает!