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];
Другие вопросы по тегам