AVAsset
概要
AVAsset はメディアのアセットのモデルであり、immutable な抽象クラス。メディアのコンテナフォーマットやコーデックに依存しない共通の I/F を提供する メディアフォーマット独立 と、初期化時に受け渡す URL の示す先がローカルファイルでもリモートサーバから配信される HLS ファイルでも良い メディアロケーション独立 を提供している。 また、AVAsset には トラック という概念があり、AVAssetTrack クラスとして扱える。これは例えば、映像や音声、字幕等のメディアストリームをモデル化したものであり、tracks プロパティに複数保持することができる。 初期化
code:swift
// 生成されるのは AVURLAsset のインスタンス
if asset is AVURLAsset {
Swift.print("a") // a
} else {
Swift.print("b")
}
ロード完了を監視する対象のプロパティは複数指定できる。指定した全てのプロパティがすでにロード済であった、あるいはエラーが発生していた場合には completion handler は同期的に呼び出される。それ以外の場合は Background Queue で非同期に呼び出される。いずれにしても、completion handler はこのメソッド呼び出し一回につき必ず一回呼び出されるようになっている。監視対象のプロパティが正常にロードできたかどうかは保証されないため、別途 statusOfValue(forKey:error:) を呼び出して確認すべき。 code:swift
let asset = AVAsset(url: contentUrl)
let playerItem = AVPlayerItem(asset: asset)
switch asset.statusOfValue(forKey: \AVAsset.isPlayable, error: nil) {
case .loaded:
}
}
映像や音声等のメディアは、AVAsset の初期化成功後にすぐに値が全て利用可能とは限らない。AVAsset のとあるプロパティの値を要求した場合、同期的に値が返されるが、値がローディング中などの場合には呼び出し側をブロッキングしてしまう可能性がある。これを避けるために、参照したい特定のキーを登録しておき、利用可能になったら通知してくれる機構が存在する。それが AVAsynchronousKeyValueLoading である。これは、KVO の拡張っぽい。 code:swift
let url = Bundle.main.url(forResource: "example", withExtension: "mp4")!
let asset = AVAsset(url: url)
asset.loadValuesAsynchronously(forKeys: "playable") { var error: NSError? = nil
let status = asset.statusOfValue(forKey: playableKey, error: &error)
switch status {
case .loaded:
// Sucessfully loaded. Continue processing.
case .failed:
// Handle error
case .cancelled:
// Terminate processing
default:
// Handle all other cases
}
}
アセットの再生
アセットの再生のためには、まずアセットにより AVPlayerItem を初期化し、presentation state (再生可能な時間範囲等) を設定する。その後、AVPlayer にそれをさらに渡して再生する。 AVURLAsset
初期化オプション
正確な長さとランダムアクセス
どのような追加の工程が必要か?は、コンテナの形式によて異なる。例えば、QuickTime や MPEG-4 等の多くの形式では追加のパースをしなくとも十分な情報が提供されるが、そうでない形式の場合は、ファイルのコンテンツを予め調査して初めてランダムアクセスが可能になる。.mpg などのフォーマットだとコストがかなり高いとのこと。
参考