MPMoviePlayerController показывает пустой черный экран - PullRequest
25 голосов
/ 08 декабря 2011

Я использую MPMoviePlayerController для воспроизведения локального файла в папке с приложением, которую я скачал для URL сервера:

itemMoviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:fileURL];
 [self.view addSubview:itemMoviePlayerController.view];
 itemMoviePlayerController.fullscreen = YES;
 itemMoviePlayerController.movieSourceType = MPMovieSourceTypeFile;
 itemMoviePlayerController.initialPlaybackTime = -1.0;
 [itemMoviePlayerController play];

Когда я играю файл .mov сразу после его загрузки, он показывает черный пустой экран и пользовательский интерфейс приложения не работает. Но если в следующий раз воспроизвести тот же локальный файл, он воспроизводится нормально. Я даже проверил playState & localState для MPMoviePlayerController они кажутся нормальными. В чем может быть причина черного пустого экрана?

Ответы [ 13 ]

31 голосов
/ 16 октября 2012

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

15 голосов
/ 28 марта 2012

Вы можете попытаться поставить [itemMoviePlayerController prepareToPlay]; перед [itemMoviePlayerController play];

. Apple предпочитает выводить только полноэкранное видео - показ мод MPMoviePlayerViewController (как сказал Холланс).Чтобы представить это, вы должны использовать что-то вроде:

 moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:fileURL];
 [self presentMoviePlayerViewControllerAnimated:moviePlayerViewController];
 [itemMoviePlayerController play];

Это задокументировано Apple здесь

Вы можете прочитать там, что вы должны сохранить ссылку на ваш MPMoviePlayerViewController, чтобы потом отклонить его с

[self dismissMoviePlayerViewControllerAnimated:moviePlayerViewController].

13 голосов
/ 08 января 2014

Я исправил это, поставив

@property (strong, nonatomic) MPMoviePlayerController *moviePlayer; 

в моем файле .h и вызов self.moviePlayer во всем моем коде, и это сработало!

7 голосов
/ 08 декабря 2011

Вам нужно использовать MPMoviePlayerViewController. Обратите внимание на слово «Вид» там.

3 голосов
/ 24 сентября 2013

Надеюсь, это поможет.Я решил эту проблему в своем проекте

 -(void)startPlayingMovie
{
    NSLog(@"startPlayingMovie");
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
                                         pathForResource:@"Start_video" ofType:@"mov"]];
    moviePlayer =  [[MPMoviePlayerViewController alloc]
                    initWithContentURL:url];
    moviePlayer.view.frame = CGRectMake(0, 0, self.view.bounds.size.height, self.view.bounds.size.width);
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(moviePlayBackDidFinish:)
                                                 name:MPMoviePlayerPlaybackDidFinishNotification
                                               object:moviePlayer.moviePlayer];

moviePlayer.moviePlayer.controlStyle = MPMovieControlStyleNone;
moviePlayer.moviePlayer.shouldAutoplay = YES;
[self presentMoviePlayerViewControllerAnimated:moviePlayer];
[moviePlayer.moviePlayer setFullscreen:YES animated:NO];

NSLog(@"endPlayingMovie");

}
2 голосов
/ 05 сентября 2012

У меня была такая же проблема, и она сводила меня с ума. будет работать на одном контроллере представления нормально (аудио и видео), но не будет работать на другом (черный экран только с аудио). В конце концов, все, что я сделал, это ИЗМЕНИЛ ПОРЯДОК ВЫЗОВОВ: я просто ждал, пока не закончу настройку проигрывателя фильмов, прежде чем добавить его в представление. Другими словами, я вызвал «addSubview» на линии непосредственно перед вызовом «play».

2 голосов
/ 14 мая 2012

То же самое случилось со мной.Оказывается, я пытался воспроизвести фильм, пока «1001» еще не был уволен.

В моем UIImagePickerDelegate мне пришлось сначала закрыть всплывающее окно UIImagePicker, а затем открыть ViewController, управляющее MPMediaPlayerController:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)infoDict
{
    //the first thing to do: dismiss the media picker
    if ([ipPop isPopoverVisible])
    {
        [ipPop dismissPopoverAnimated:ANIMATION_SETTING];
    }

    myMediaPlayerViewController * playerVC = [[myMediaPlayerViewController alloc] initWithMediaDict:infoDict];
    [self.navigationController pushViewController:playerVC animated:ANIMATION_SETTING];
}
1 голос
/ 19 июня 2012

Это код, который я использую для воспроизведения файла с URL:

MPMoviePlayerViewController *movieViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:contentUrl]];
movieViewController.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
[self presentMoviePlayerViewControllerAnimated:movieViewController];
[movieViewController release];

Кажется, у меня нормально работает. Две заметки:

  • Некоторые симуляторы (например, текущая iOS 5.0) дают сбой при воспроизведении фильма, но работают на реальном устройстве
  • Если вы пропустите часть movieSourceType, черный экран будет показан примерно за секунду до начала фильма
0 голосов
/ 11 мая 2016

Кроме того, если вы используете URL-адреса http, обязательно отключите App Transport Security в ваших проектах *. Plist файл. Это также вызовет черный экран.

Добавьте следующий код:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>

Здесь:

   [INSERT CODE ABOVE HERE]
  </dict>
</plist>
----- BOTTOM OF PLIST FILE
0 голосов
/ 05 сентября 2013

У меня была похожая проблема. После воспроизведения появляется пустой экран, который не позволяет мне снова воспроизводить видео. Ну вот моя работа вокруг. Таким образом, кнопка воспроизведения не исчезает.

[self.movieController stop]; 
[self.movieController prepareToPlay];
[self.movieController pause];
...