0

我正在尝试在标签栏导航中正确实现嵌入式视频播放。在我的具体情况下,视频应以非全屏方式显示在由 UIViewController 托管、由 UITabBarController 管理的 UIView 上。

为了简化示例,假设我的标签栏中有两个标签。第一个显示一些随机的东西,第二个显示托管嵌入视频的视图控制器。

一旦用户选择第二个选项卡,视频就会正常加载和播放。

为了初始化播放器,我在我的 UIView 派生类中使用以下代码,由初始化程序 (initWithFrame) 触发:

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

为了开始播放,我使用以下代码,由我的 UIViewController 派生类的 viewWillAppear 方法触发:

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

如果那时,用户选择第一个选项卡(当视频仍在播放时),我确保视频停止,因为如果没有这样做,它将继续播放:

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

一旦用户再次选择第二个选项卡,视图将保持空白,即使调用了 playVideo 方法,也不会加载或播放任何内容。

我错过了什么,为什么重新选择第二个选项卡时视频播放失败?

==========新尝试==============

这次我不再依赖 shouldAutoplay(如建议的那样),但这并没有什么不同。

为此修改并添加了代码;

- (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];
}
4

3 回答 3

0

playVideo我认为应该是
[movieViewController_.moviePlayer setContentURL:fileURL_]; [movieViewController_.moviePlayer play];

我认为它是第一次工作,因为自动播放默认为YES

于 2011-02-19T17:05:52.620 回答
0

MPMoviePlayerViewController是 的子类UIViewController。如果第二个选项卡专用于显示视频,为什么不直接使用它的一个实例作为第二个选项卡的根视图控制器呢?

于 2011-02-19T18:32:56.157 回答
0

将 [movieViewController_.movi​​ePlayer prepareToPlay] 添加到我的 playVideo 方法可以解决问题(使用远程流时)。

于 2011-02-23T14:33:35.403 回答