【iPhone SDK】MPMoviePlayerViewControllerを使った動画の再生

今回はリソースに登録している動画やサーバー上にアップロードされている動画をアプリ内で再生する方法をメモしていきます。

動画の再生は機種のOSのバージョンで大きく変わるため、注意が必要です。
今回はiOS3.2以上から使用することができる部分をメモしていきます。


1.プロジェクトの「Frameworks」に「MediaPlayer.framework」を追加します。
2.動画再生を行う画面のソースに #import <MediaPlayer/MediaPlayer.h> を設定します。

これでムービープレイヤーコンポーネントを使用することが可能になりました。

動画再生を管理するViewControllerを準備します。

MPMoviePlayerViewController *m_pMovieView;

↑こやつがiOS3.2以上から使用可能になるものです。
このクラスの中に
@property(nonatomic, readonly) MPMoviePlayerController *moviePlayer
が存在します。

動画のパスを生成後、初期化時にURLを指定します。

m_pMovieView = [[MPMoviePlayerViewContoller alloc] initWithURL: url];

URLを後で指定したい場合、

m_pMovieView = [[MPMoviePlayerViewController alloc] init];
で一旦作成しておき、
URLを指定したい時に

MPMoviePlayerController *moviePlayer = m_pMovieView.moviePlayer;
[moviePlayer setContentURL: url];

という手順で指定可能のようです。

動画の再生準備ができたら、モーダル画面として登録します。

MPMoviePlayerViewControllerはあくまでUIViewControllerなので中に管理するViewを持っています。

[self.view addSubview: m_pMovieView.view];

として表示することもできますが、
iOS3.2以上から使える機能を駆使してみましょう

こちらのDevページの情報からムービープレイヤーをモーダル表示することができる方法として
[self presentMoviePlayerViewControllerAnimated: m_pMovieView];

と指定することができます。
これにより画面がYouTube動画を再生するときのようにスライドしてプレイヤーが表示されます。

再生終了後に画面から切り離すときは

[self dismissMoviePlayerViewControllerAnimated];
でいいようですね。

イベントとして以下をフックするようにすれば管理がしやすくなると思います。
// 再生準備完了を検知
[[NSNotificationCenter defaultCenter] addObserver: self
        selector: @selector(moviePreloadEnd:)
        name: MPMoviePlayerContentPreloadDidFinishNotification
        object: moviePlayer];
    
    // 再生完了を検知
[[NSNotificationCenter defaultCenter] addObserver: self
        selector: @selector(moviePlayEnd:)
        name: MPMoviePlayerPlaybackDidFinishNotification
        object: moviePlayer];

// 再生準備完了
- (void) moviePreloadEnd:(NSNotification*)notification
{
 MPMoviePlayerController *p = [notification object];
 // イベント削除
 [[NSNotificationCenter defaultCenter] removeObserver:self
       name:MPMoviePlayerContentPreloadDidFinishNotification
       object:p];
 // 再生
 [p play];
}

// 再生終了
- (void) moviePlayEnd:(NSNotification*)notification
{
 MPMoviePlayerController *p = [notification object];

 // イベント削除
 [[NSNotificationCenter defaultCenter] removeObserver:self
           name:MPMoviePlayerPlaybackDidFinishNotification
           object:p];
 [[UIDevice currentDevice] setOrientation:UIDeviceOrientationPortrait animated:NO];
 
 NSDictionary* userInfo = [notification userInfo];
 s16 ret = [[userInfo objectForKey:@"MPMoviePlayerPlaybackDidFinishReasonUserInfoKey"] intValue];
 // どのような状態で再生終了したのか 
 switch(ret){
  case MPMovieFinishReasonPlaybackEnded:{
   // 再生完了
   [p stop];
   break;
  }
  case MPMovieFinishReasonPlaybackError:{
   // エラー
   break;
  }
  case MPMovieFinishReasonUserExited:{
   // Doneボタン押下による終了
   [p stop];
   break;
  }
 }

 [self dismissMoviePlayerViewControllerAnimated];
}


さくっとメモということで
このへんで


iPhoneプログラミングUIKit詳解リファレンス

新品価格
¥3,990から
(2010/9/2 13:32時点)

この記事へのコメント


この記事へのトラックバック