MPMoviePlayerViewController со встроенным видео в UITabBarController - PullRequest
0 голосов
/ 19 февраля 2011

Я пытаюсь правильно воспроизвести встроенное воспроизведение видео с помощью панели вкладок. В моем конкретном случае видео должно отображаться не в полноэкранном режиме на UIView, размещенном на UIViewController, управляемом UITabBarController.

Для упрощения примера, скажем, у меня есть две вкладки в моей панели вкладок. Первый показывает некоторые случайные вещи, второй показывает viewcontroller, который содержит встроенное видео.

Как только пользователь выбирает вторую вкладку, видео загружается и воспроизводится правильно.

Для инициализации проигрывателя я использую следующий код из моего производного класса UIView, запускаемого инициализатором (initWithFrame):

- (void)initPlayback
{
     self.movieViewController = [[MPMoviePlayerViewController alloc] init];
     movieViewController_.wantsFullScreenLayout = NO;
     movieViewController_.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
     [self addSubview:self.movieViewController.view];
}

Для запуска воспроизведения я использую следующий код, запускаемый методом viewWillAppear моего производного класса UIViewController:

- (void)playVideo
{
     [movieViewController_.moviePlayer setContentURL:fileURL_];
}

Если затем пользователь выбирает первую вкладку (пока видео все еще воспроизводится), я удостоверяюсь, что видео остановлено, поскольку оно продолжит воспроизведение, если это не было сделано:

- (void)stopVideo
{
     [movieViewController_.moviePlayer stop];
}

Когда пользователь снова выбирает вторую вкладку, представление остается пустым, ничего не загружается и не воспроизводится, даже если вызывается метод playVideo.

Чего мне не хватает, почему не удается воспроизвести видео при повторном выборе второй вкладки?

========== новая попытка =============

На этот раз я перестал полагаться на автоматическое воспроизведение (как было предложено), но это не имело значения.

Адаптированный и добавленный код для этого;

- (void)MPMoviePlayerLoadStateDidChange:(NSNotification *)notification
{
    if (movieViewController_.moviePlayer.loadState == MPMovieLoadStatePlayable &&
        movieViewController_.moviePlayer.playbackState != MPMoviePlaybackStatePlaying)
    {
        [movieViewController_.moviePlayer play];
    }
}

- (void)deregisterFromNotifications
{
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                                                    name:MPMoviePlayerLoadStateDidChangeNotification 
                                                  object:nil];

}


- (void)registerForNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(MPMoviePlayerLoadStateDidChange:) 
                                                 name:MPMoviePlayerLoadStateDidChangeNotification 
                                               object:nil];
}

- (void)initPlayback
{
    NSLog(@"playback init...");
    self.movieViewController = [[MPMoviePlayerViewController alloc] init];
    movieViewController_.wantsFullScreenLayout = NO;
    movieViewController_.moviePlayer.shouldAutoplay = NO;
    movieViewController_.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
    movieViewController_.moviePlayer.currentPlaybackTime = 0.0f;
    [self addSubview:movieViewController_.view];
}

- (void)playVideo
{
    NSLog(@"playback starting...");
    [self registerForNotifications];
    [movieViewController_.moviePlayer setContentURL:fileURL_];
}

- (void)stopVideo
{
    NSLog(@"playback stopping...");
    [movieViewController_.moviePlayer stop];
    [self deregisterFromNotifications];
}

Ответы [ 3 ]

0 голосов
/ 19 февраля 2011

MPMoviePlayerViewController является подклассом UIViewController. Если вторая вкладка предназначена для отображения видео, почему бы просто не использовать его экземпляр в качестве корневого контроллера представления для второй вкладки?

0 голосов
/ 23 февраля 2011

Добавление [movieViewController_.moviePlayer prepareToPlay] к моему методу playVideo помогает (при работе с удаленными потоками).

0 голосов
/ 19 февраля 2011

В playVideo Я думаю, что это должно быть
[movieViewController_.moviePlayer setContentURL:fileURL_]; [movieViewController_.moviePlayer play];

Я предполагаю, что это работает в первый раз, потому что автозапуск по умолчанию YES

...