MPMoviePlayerViewController не может воспроизводить файл mp4
Я работаю над тестовым приложением, которое запустит файл mp4 из Интернета. код является:
-(IBAction)playRemoteVideo
{
NSString *mp4File = @"http://archive.org/download/Pbtestfilemp4videotestmp4/video_test_512kb.mp4";
MPMoviePlayerViewController *playerController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:mp4File]];
[self presentMoviePlayerViewControllerAnimated:playerController];
playerController.moviePlayer.movieSourceType=MPMovieSourceTypeStreaming;
[playerController.moviePlayer play];
[playerController release];
playerController=nil;
}
Когда я запускаю приложение и воспроизводю видео, проигрыватель пытается загрузить видео некоторое время, но после того, как я получил это исключение на консоли
2012-04-18 22:45:11.309 VideoPlayer[891:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An AVPlayerItem can occupy only one position in a player's queue at a time.'
*** First throw call stack:
(0x1df1052 0x1333d0a 0x27cfb31 0x27cbb2a 0x27e45cc 0x103b73 0xd4e6a 0x2ff2445 0x2ff44f0 0x1d28833 0x1d27db4 0x1d27ccb 0x16d8879 0x16d893e 0x24ea9b 0x1d12 0x1c85)
terminate called throwing an exception(gdb)
Если я выполню тот же код с файлом m3u8, например;
http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8
Я могу запустить видео, но то же самое не работает для файла mp4.
У вас есть идея, почему я получил это исключение и что не так с моим кодом?
Я запускаю приложение на симуляторе Iphone, и у меня есть XCode 4.2 С наилучшими пожеланиями Tugrul
3 ответа
Установите стиль управления проигрывателем фильма следующим образом.
[self.mPlayer.moviePlayer setControlStyle:MPMovieControlStyleDefault];
Кроме того, локальные файлы имеют свойство MPMovieSourceTypeFile, а не набор свойств MPMovieSourceTypeStreaming.
Еще один сценарий, в котором это может произойти, это, как подсказывает вам журнал, когда "AVPlayerItem может занимать только одну позицию в очереди игрока за раз". По сути, когда вы пытаетесь заставить два видео начать воспроизведение одновременно или даже ВЗАИМОДЕЙСТВОВАТЬ с двумя объектами videos/MPMoviePlayerController одновременно.
В своем приложении я использую два MPMoviePlayerController и постоянно меняю их местами, чтобы создать иллюзию для пользователя, как бесконечно перемещаться и переключаться между различными видео.
Пока это работало нормально, но я недавно добавил уведомления для некоторых событий, которые должны приводить к приостановке и возобновлению видео. Однако я не осознавал, что оба моих объекта игрока слушали уведомления одновременно, и, следовательно, пытался вызвать либо "Пауза", либо "Воспроизведение" одновременно. Это заставило фреймворк подумать, что я пытался воспроизвести несколько видео одновременно, и выбросило это исключение.
Все, что мне теперь нужно было сделать, это убедиться, что только один объект игрока слушал уведомления в любой заданный момент. Просто небольшая настройка в логике моего приложения.
Так что, если вы получаете странную ошибку, это не обязательно должна быть структура, в которой есть проблема, вредоносная операционная система, склонная превращать вашу жизнь в ад или стихийное бедствие. Это может быть просто старый добрый плохой код.:)
Я знаю эту ошибку. Попробуйте этот код здесь.
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL: url];
self.movieController = player;
self.movieController.fullscreen = YES;
self.movieController.controlStyle = MPMovieControlStyleDefault;
// Register to receive a notification when the movie has finished playing.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:self.movieController];
// Register to receive a notification when the movie has finished playing.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerDidExitFullscreenNotification
object:self.movieController];
[self.movieController prepareToPlay];
[self.movieController.view setFrame: self.view.bounds]; // player's frame must match parent's
[self.view addSubview: self.movieController.view];
// ...
[self.movieController play];