MPMoviePlayerController вызывает вспышку черного цвета при запуске видео - PullRequest
6 голосов
/ 18 ноября 2010

Фильм воспроизводится очень хорошо, но перед воспроизведением вспыхивает черная вспышка.Является ли это причудой, возникающей в результате установки элемента управления стиля MPMovieControlStyleNone?

NSString *url = [[NSBundle mainBundle] pathForResource:@"00" ofType:@"mov"];
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] 
    initWithContentURL:[NSURL fileURLWithPath:url]];

[[NSNotificationCenter defaultCenter]
    addObserver:self
    selector:@selector(movieFinishedCallback:)
    name:MPMoviePlayerPlaybackDidFinishNotification
    object:player];

//---play video in implicit size---
player.view.frame = CGRectMake(80, 64, 163, 246);
[self.view addSubview:player.view];

// Hide video controls
player.controlStyle =  MPMovieControlStyleNone;

//---play movie---
[player play];

Ответы [ 8 ]

19 голосов
/ 03 июля 2012

Я только что столкнулся с этой проблемой и исправил ее, добавив наблюдателя в NSNotificationCenter по умолчанию, чтобы узнать, когда фильм был полностью готов к воспроизведению, и ТО, добавив представление в качестве подпредставления к моему основному виду.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkMovieStatus:) name:MPMoviePlayerLoadStateDidChangeNotification object:nil];

...

if(moviePlayer.loadState & (MPMovieLoadStatePlayable | MPMovieLoadStatePlaythroughOK))
{
    [pageShown.view addSubview:moviePlayer.view];
    [moviePlayer play];
}
7 голосов
/ 19 октября 2013

В IOS 6 mpmoviewplayer добавлено новое свойство: readyForDisplay

это то, с чем я играю, и пока все хорошо:

  1. создать mpmovieplayer, добавить на сцену, скрыть it.
  2. добавить уведомление о состоянии воспроизведения на movieController
  3. дождитесь, пока displayState изменится, и когда он будет готов, покажите видеоконтроллер:

    - (void)moviePlayerPlayState:(NSNotification *)noti {
    
    if (noti.object == self.movieController) {
    
        MPMoviePlaybackState reason = self.movieController.playbackState;
    
         if (reason==MPMoviePlaybackStatePlaying) {
    
                 [[NSNotificationCenter defaultCenter] removeObserver:self name: MPMoviePlayerPlaybackStateDidChangeNotification object:nil];
    
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    
                while (self.movieController.view.hidden)
                {
                    NSLog(@"not ready");
                    if (self.movieController.readyForDisplay) {
    
                     dispatch_async(dispatch_get_main_queue(), ^(void) {
                         NSLog(@"show");
                         self.movieController.view.hidden=NO;
                     });
    
                    }
                    usleep(50);
                }
            });
         }
    
    }
    

    }

Когда состояние воспроизведения изменяется на MPMoviePlaybackStatePlaying , мы начинаем проверять готовность к изменению готовности.

6 голосов
/ 03 декабря 2010

Очевидно, что в прямоугольнике фильма вспыхивает черная вспышка до тех пор, пока фильм не загрузится достаточно, чтобы можно было начать воспроизведение.Вот мой обходной путь:

  1. Создайте UIImageView и поместите в него MPMoviePlayerController.Таким образом, вы можете установить альфа на 0.

  2. Как только вы позвоните [player play];для воспроизведения видео установите таймер .5 секунд.

  3. Когда время закончится, измените альфа на 1.

Этосделает игрока невидимым на 1/2 секунды (который скрывает черную вспышку).

3 голосов
/ 04 декабря 2013

Создание видео без addSubview и инструкция по воспроизведению:

    NSString *filepath   =   [[NSBundle mainBundle] pathForResource:@"video" ofType:@"mp4"];
    NSURL    *fileURL    =   [NSURL fileURLWithPath:filepath];
    MPMoviePlayerController *moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:fileURL];
    [moviePlayerController.view setFrame:CGRectMake(80, 64, 163, 246)];
    moviePlayerController.controlStyle = MPMovieControlStyleNone;

Подготовьте видео для воспроизведения и добавьте уведомление:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkMovieStatus:) name:MPMoviePlayerLoadStateDidChangeNotification object:nil];
    [moviePlayerController prepareToPlay];

Создание функции checkMovieStatus с addSubview и инструкциями по воспроизведению:

- (void)checkMovieStatus:(NSNotification *)notification {
    if(moviePlayerController.loadState & (MPMovieLoadStatePlayable | MPMovieLoadStatePlaythroughOK)) {
        [self.view addSubview:moviePlayerController.view];
        [moviePlayerController play];
    }
}
2 голосов
/ 19 июня 2012

Я полагаю, что черная вспышка может быть связана со свойством movieSourceType MPMoviePlayerController.

Если вы не установите его, по умолчанию будет MPMovieSourceTypeUnknown, что приведет к задержке пользовательского интерфейса до загрузки файла.

Попробуйте добавить эту строку:

player.movieSourceType = MPMovieSourceTypeFile;

Сразу после инициализации игрока.

2 голосов
/ 17 июля 2011

Или просто измените цвет изображения, вот что вы на самом деле видите ...

player.view.backgroundColor = [UIColor colorWithRed: 1 зеленый: 1 синий: 1 альфа: 0];

1 голос
/ 25 сентября 2014

Любимое решение здесь http://joris.kluivers.nl/blog/2010/01/04/mpmovieplayercontroller-handle-with-care/ из iOS 6 вам нужно использовать [self.moviePlayer prepareToPlay]; и перехватить MPMoviePlayerReadyForDisplayDidChangeNotification для использования [self.moviePlayer play];

1 голос
/ 24 апреля 2012

Чтобы избежать черной вспышки, используйте MPMoviePlayerViewController вместо MPMoviePlayerController. Я думаю, что этот класс создает фон при отображении представления, а не при загрузке видео (как это делает MPMoviePlayerController).

Перед добавлением moviePlayerViewController.moviePlayer.view в ваше представление дисплея, вы должны добавить белое подпредставление (или подпредставление, подходящее для вашего контента) к backgroundView, например:

[moviePlayerViewController.moviePlayer.view setFrame:[displayView bounds]];

UIView *movieBackgroundView = [[UIView alloc] initWithFrame:[displayView bounds]];
movieBackgroundView.backgroundColor = [UIColor whiteColor];
[moviePlayerViewController.moviePlayer.backgroundView addSubview:movieBackgroundView];
[movieBackgroundView release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...