MPMoviePlayerController выполняет поиск вперед в полноэкранном режиме, пока конец не застрянет - PullRequest
6 голосов
/ 08 августа 2011

Кажется, есть проблема с MPMoviePlayerController, когда, находясь в полноэкранном режиме, вы нажимаете кнопку ускоренной перемотки вперед, позволяя ему искать вперед (играть на высокой скорости) вплоть до конца видео.

После этого вы просто получаете черный экран, и он застрял. Другими словами он не реагирует на какие-либо касания жестами и не может выйти из этой ситуации. Кто-нибудь еще сталкивался с этой проблемой?

Есть ли способ обойти это в коде?

Ответы [ 4 ]

1 голос
/ 03 февраля 2012

Кажется, это ошибка iOS, так как быстрый обратный переход к самому началу не вызовет черный экран, но быстрый возврат к концу сработает, и после этого вызов «play» / «pause» для видеопроигрывателя никогда не будет работать. Я временно исправляю это, добавляя защищенную логику в обратный вызов обновления скруббера: давайте предположим, что monitorPlaybackTime будет вызываться в период 'PLAY_BACK_TIME_MONITOR_INTERVAL' для обновления скруббера, и в него я добавляю логику проверки:

NSTimeInterval duration = self.moviePlayer.duration;
NSTimeInterval current = self.moviePlayer.currentPlaybackTime;

if (isnan(current) || current > duration) {
    current = duration;
} else if (self.moviePlayer.playbackState == MPMoviePlaybackStateSeekingForward) {
    if (current + self.moviePlayer.currentPlaybackRate*PLAY_BACK_TIME_MONITOR_INTERVAL > duration) {
        [self.moviePlayer endSeeking];
    }
}

Обходной путь для решения черного экрана, не идеальный, надеюсь, он поможет.

0 голосов
/ 30 апреля 2015

Ни одно из вышеперечисленных решений не сработало для меня, поэтому я в итоге и сделал:

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("moviePlayerLoadStateDidChange"), name: MPMoviePlayerLoadStateDidChangeNotification, object: nil)

func moviePlayerLoadStateDidChange() {
    let loadState = moviePlayerController?.loadState

    if loadState == MPMovieLoadState.Unknown {
        moviePlayerController?.contentURL = currentmovieURL
        moviePlayerController?.prepareToPlay()
    }
}

Я думаю, что проблема в том, что когда кнопка поиска вперед нажата один раз, она хочет перейти к следующему видео, поэтому появляется индикатор загрузки. Прислушиваясь к событию изменения состояния загрузки, вы можете указать, каким должно быть следующее видео, а если у вас его нет, вы можете просто дать ему тот же URL.

0 голосов
/ 05 декабря 2012

столкнулся с той же проблемой на iOS6.Исправить это удалось, зарегистрировавшись для MPMoviePlayerPlaybackDidFinishNotification (как предложено Leuguimerius) со следующей реализацией:

- (void)playbackDidFisnish:(NSNotification *)notif {
    if (self.player.currentPlaybackTime <= 0.1) {
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.player stop];
        [self.player play];
        [self.player pause];
        });
    }
}

Где self.player - это связанный экземпляр MPMoviePlayerController.Проверка против currentPlaybackTime служит для того, чтобы отличить более стандартные вызовы playDidFinish (где фильму разрешено воспроизведение с нормальной скоростью до конца) от тех сценариев, когда пользователь переходит вперед до конца.Остановка воспроизведения и паузы приводит к удобному визуально согласованному интерфейсу даже при быстрой перемотке вперед до конца.

0 голосов
/ 09 августа 2011

Полагаю, вы не обрабатываете MPMoviePlayerPlaybackDidFinishNotification . Вы действительно должны, если вы не.

Тем не менее для меня неожиданно, что проигрыватель фильма перейдет в состояние «зависания», как вы описали. Я бы с большей готовностью ожидал, что он автоматически остановит воспроизведение и сбросит его по достижении конца. В любом случае, я думаю, что ваша проблема исчезнет, ​​если вы наблюдаете MPMoviePlayerPlaybackDidFinishNotification и соответственно обрабатываете контроллер видео.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...