6

私のプロジェクトではMPMoviePlayerController、http URL からビデオをストリーミングしていました。フルスクリーンで再生します。ビデオの再生中に「完了」ボタンをタップすると、ビデオが停止して消えますが、問題は次のとおりです。ビデオ画面を閉じるためにピンチすると、ビデオ画面は消えますが、ビデオは引き続き再生され、ビデオのサウンドは引き続き再生されます。

フルスクリーン終了通知を検出し、ビデオを手動で停止しようとしましたが、うまくいきませんでした。私のmoviePlayerDidExitFullScreenメソッドは呼び出されませんでした。

それを制御するために、正しい方法で通知を受け取っている場合、別の通知を取得しようとしました: MPMoviePlayerPlaybackStateDidChangeNotification、それは機能しています。ビデオの起動時にメソッドを呼び出します。

多くのフォーラムや Apple のドキュメントを検索しましたが、十分な情報が見つかりませんでした。

フルスクリーンのビデオを開き、フルスクリーンの終了を検出するコードは次のとおりです。

- (void)openFullVideo
{
    NSString* path = @"http://trtvizyon.mysys.com/test/leyla_ile_mecnun.mp4";
    NSURL *fileURL = [NSURL URLWithString:path];
    MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:fileURL];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerDidExitFullScreen:) name:MPMoviePlayerDidExitFullscreenNotification object:nil];

    player.controlStyle = MPMovieControlStyleDefault;
    player.movieSourceType = MPMovieSourceTypeStreaming;

    [self.view addSubview:player.view];

    [player setFullscreen:YES animated:YES];

    [player play];

}

- (void) moviePlayerDidExitFullScreen:(id)sender {
    NSLog(@"moviePlayerDidExitFullScreen");
}
4

1 に答える 1

7

OK、私はあなたのコードでしばらく遊んで、最終的にその小さなバグを腸に撃ちました.

最初の問題は、プレーヤー オブジェクトを保持していないことです (ARC を使用していると仮定すると、そうでない場合はスキップしてください)。したがって、インスタンス変数として保持するようにしてください。たとえば、次のようになります。

//Header File
@interface ViewController : UIViewController {
    MPMoviePlayerController* _player;
}

// Implementation File
- (void)openFullVideo {
    // ...
    _player = player;
}

さて、それがうまくいくなら、素晴らしいです!! しかし、Apple側で恐ろしい未解決のバグが発生しています:

An AVPlayerItem can occupy only one position in a player's queue at a time

この問題を解決するには、次のようにします。

NSString* path = @"http://trtvizyon.mysys.com/test/leyla_ile_mecnun.mp4";
NSURL *fileURL = [NSURL URLWithString:path];
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] init];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerDidExitFullScreen:) name:MPMoviePlayerDidExitFullscreenNotification object:nil];

player.controlStyle = MPMovieControlStyleDefault;
player.movieSourceType = MPMovieSourceTypeStreaming;

[self.view addSubview:player.view];

[player setContentURL:fileURL];
[player setInitialPlaybackTime:-1.f];
[player setFullscreen:YES animated:YES];
[player prepareToPlay];
[player play];

_player = player;

それはそれを行う必要があります!

その他の親切なアドバイス:

  • ムービーを再度再生する前に、必ず NSNotificationCenter から自分自身を削除してください。
  • if (_player != nil)オブジェクトの再作成を避けるために、何かを追加することをお勧めします。
于 2012-07-14T09:07:33.580 に答える