(2020/02/28。サンプルのリンク先などを更新)
「語学学習支援プレイヤー」で、オーディオ再生部分にMPMusicPlayerControllerを使っていたが、バージョン1.3.0でAVPlayerを使うことにした。
AVPlayerは、ビデオ用のクラスかと思ってたけど、オーディオデータのみもあつかえるのだった。
(その後、映像を表示する機能についても記しました。
[iOS]動画を再生する(AVPlayerViewController使用)
[iOS]動画を再生する(AVPlayerLayer使用)
)
以下、語学学習支援プレイヤー(Repete)作成時に、参考にしたもの。
リファレンス
プログラミングガイド
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のインスタンスに関連付ける。
(ここでのトラックとは?アセット内のメディアデータを指す。シンプルな動画のアセットだと、ビデオコンポーネントのトラックとオーディオコンポーネントのトラックを持つ。もっと複雑なトラックを持つアセットも作れる)
(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件のフィードバック