【iPhone SDK】MPMoviePlayerViewController以外で動画の再生

半年ぶりくらいのiPhone開発記事です。

新しい職場ではiPhoneアプリ開発の業務を担当しているので
そこで調べて得た知識を書いていきますよ。

さて、今回はこのブログで毎日最もアクセスが多い
MPMoviePlayerViewControllerではなくてAVPlayerとAVPlayerlayerを使った動画再生方法についてです。

ちなみにこの機能はiOS4.0以降からでないと使用できません。



まずこちらのpdfを一読しておきましょう。

26ページにとても重要なことがかいてあります。

AVPlayerにて動画再生を行いたいViewクラスに
+ (Class)layerClass{
return [AVPlayerLayer class];
}
最低でも上記のメソッドを追加しましょう。そしてそのViewクラス内にてAVPlayerたちを作っていきます。
NSString* moviePath = @"http://〜動画のパス";
// プレイアイテムを作成
AVPlayerItem* playerItem = [AVPlayerItem playerItemWithURL: [NSURL URLWithString: moviePath]];
// プレイアイテムより動画プレイヤーを作成
AVPlayer* player = [AVPlayer playerWithPlayerItem: playerItem];
if( player != nil ) {
 // 動画を描画するレイヤーを取得(※ 
 AVPlayerLayer* playerLayer = (AVPlayerLayer*)self.layer;
 // 取得したレイヤーにプレイヤーをセット
 playerLayer.player = player;
 // 動画再生開始
 [player play];
}
簡単にはこのようにすると画面中央に動画が再生されます。

再生終了を検知するイベントを登録するには

[[NSNotificationCenter defaultCenter]	addObserver: self
   selector: @selector(playerItemDidReachEnd:)
   name: AVPlayerItemDidPlayToEndTimeNotification
   object: [m_pMoviePlayer currentItem]];
と宣言してイベント関数を設定するだけです。
- (void)playerItemDidReachEnd:(NSNotification *)notification{
 NSLog(@"movie play end");
}

動画の再生準備が完了したイベントをとりたい場合、
少々面倒な処理が必要になります。

// 動画再生開始前にアイテム状態監視を登録する
[playerItem addObserver: self forKeyPath: @"status" options: 0 context: nil];

上記は[player play]の部分を書き換えるイメージで問題ありません。
そして再生準備ができたことを監視するイベント関数を定義します。

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"status"]) {
AVPlayerItem *pItem = (AVPlayerItem *)object;
if (pItem.status == AVPlayerItemStatusReadyToPlay) {
      NSLog(@"movie ready play observe");
      // 動画再生開始
      [ m_pMoviePlayer play];
      // 監視終了
       [pItem removeObserver: self forKeyPath: @"status"];
}
}
}
こんな感じになります。ちなみにAVPlayerはクラス内で使用することになるので、
プロパティとして定義しておいてハンドルを保持しておきましょう。
この関数ではm_pMoviePlayerとしているがおわかりいただけるかと思います。

Apple公式のリファレンスとは※の部分が異なっています。
リファレンスのやり方だと音は再生されますが、映像が出ないので注意が必要です。

最近こちらの本を購入しました。
中級者向けになりますが、しっかりとサンプルコードが載っているので参考になります。

この記事へのコメント


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