[iOS]AVPlayerを使う

(2020/02/28。サンプルのリンク先などを更新)

語学学習支援プレイヤー」で、オーディオ再生部分にMPMusicPlayerControllerを使っていたが、バージョン1.3.0でAVPlayerを使うことにした。
AVPlayerは、ビデオ用のクラスかと思ってたけど、オーディオデータのみもあつかえるのだった。
(その後、映像を表示する機能についても記しました。
[iOS]動画を再生する(AVPlayerViewController使用)
[iOS]動画を再生する(AVPlayerLayer使用)

以下、語学学習支援プレイヤー(Repete)作成時に、参考にしたもの。

リファレンス

AVPlayer Class Reference

プログラミングガイド

AV Foundation Programming Guide: About AV Foundation
AV Foundation プログラミングガイドの目次
・アセットの使用
・再生
・編集
・メディアキャプチャ
・エクスポート
・時間およびメディアの表現

サンプル

AVPlayerDemo
(2020/02/28追記。このサンプルは、2014-07-08が最後の更新となっています。
2020年現在は、Creating a Basic Video Player (iOS and tvOS)
Creating a Movie Player App with Basic Playback Controls
が参考になります)
iPodライブラリ、カメラロール、itunesファイル共有(iTunes File Sharing)のビデオ、オーディオをテーブルビューで表示。選択すると、プレイヤー画面に移行し、各々のビデオ、オーディオを再生・一時停止できる。

サンプルAVPlayerDemoを実行してみてソースコードを読んで、これ、どういうことなのかな、というのをAVFoundationプログラミングガイドと突き合わせながら、AVPlayerの使い方を学んだ。

アセット(Assets)

AVFoundation Frameworkでは、動画や楽曲を抽象化した「アセット」(Asset)という単位を使う。

AssetをMPMediaItemから作成する場合

まずは、iPodライブラリから楽曲を取得する。
(自分のblogでもMediaPickerを使った方法について書いてましたね–>iOSで、ミュージックライブラリにアクセスして音楽を再生する | nackpan Blog)
MPMediaItemCollectionのインスタンスであるitemCollectionがあるとき、最初のitemからAVURLAssetをつくる例。

    MPMediaItem* item = [itemCollection.items firstObject];
    NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL];
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];

アセットの使用準備

アセットを使用するさいには、必要なプロパティをロードする必要がある。ロードは非同期で行う。
複数のプロパティが必要なときは、loadValuesAsynchronouslyForKeys:completionHandler:を使う。
プログラミングガイドでは、「アセットの使用」–>「アセットを使用する準備」に記述がある。
そして、アセットのトラックがロード完了したら、アセットを使用してAVPlayerItemのインスタンスを作成し、アイテムをAVPlayerのインスタンスに関連付ける。
(ここでのトラックとは?アセット内のメディアデータを指す。シンプルな動画のアセットだと、ビデオコンポーネントのトラックとオーディオコンポーネントのトラックを持つ。もっと複雑なトラックを持つアセットも作れる)
ss 2014-05-22 22.01.42
(AV Foundation プログラミングガイドより)

再生時の状態変化を検知する

KVO(key-value observing)(キー値監視)や、notification(通知)を用いて、状態変化を検知する。
key-value observingは、オブジェクトのプロパティの変化を監視して、別のオブジェクトが受けとる仕組み。
notificationは、通知センターに狙いのイベントを登録して、それが起こったら通知を受けとる仕組み。
アイテムが、再生準備完了したかどうかを、key-value observingを使って監視する。

    /* Observe the player item "status" key to determine when it is ready to play. */
    [self.mPlayerItem addObserver:self 
                      forKeyPath:kStatusKey 
                         options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
                         context:AVPlayerDemoPlaybackViewControllerStatusObservationContext];

(AVPlayerDemoより。AVPlayerItemのインスタンスのstatusプロパティの変化を監視するように設定。ここでkStatusKey = @”status”。)

アイテムが、末尾に到達したことを知るには、AVPlayerItemDidPlayToEndTimeNotificationを受けとるように設定する。

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(playerItemDidReachEnd:)
                                                 name:AVPlayerItemDidPlayToEndTimeNotification
                                               object:self.mPlayerItem];

(AVPlayerDemoより。AVPlayerItemDidPlayToEndTimeNotificationを通知センター(notification center)に登録している部分)

これで、準備ができたかや、アイテムの末尾まで到達したかを知ることが出来る。
ガイドでは、「再生」–>「再生の監視」に記述がある。

関連リファレンス・プログラミングガイド

AVPlayerItem Class Reference
Notification Programming Topics: Notification Centers

「[iOS]AVPlayerを使う」への2件のフィードバック

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください