0

タブバーナビゲーション内に埋め込みビデオ再生を適切に実装しようとしています。私の特定のケースでは、ビデオは、UITabBarControllerによって管理されるUIViewControllerによってホストされるUIViewにフルスクリーンではない方法で表示されます。

例を単純化するために、タブバー内に2つのタブがあるとします。1つ目はランダムなものを示し、2つ目は埋め込みビデオをホストするビューコントローラーを示しています。

ユーザーが2番目のタブを選択すると、ビデオが正しく読み込まれ、再生されます。

プレーヤーを初期化するために、初期化子(initWithFrame)によってトリガーされる、UIView派生クラス内から次のコードを使用しています。

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

ユーザーが2番目のタブを再度選択すると、ビューは空白のままになり、playVideoメソッドが呼び出されても何もロードまたは再生されません。

何が欠けていますか、2番目のタブを再選択したときにビデオの再生が失敗するのはなぜですか?

==========新しい試み=============

今回は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

[movieViewController_.movi​​ePlayer prepareToPlay] を playVideo メソッドに追加すると、うまくいきます (リモート ストリームを操作する場合)。

于 2011-02-23T14:33:35.403 に答える
0

MPMoviePlayerViewControllerのサブクラスですUIViewController。2 番目のタブがビデオの表示専用である場合、そのインスタンスを 2 番目のタブのルート ビュー コントローラーとして使用しないのはなぜですか?

于 2011-02-19T18:32:56.157 に答える