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
Ответы
Ответ 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];
Теперь он отлично работает!