AVPlayerにおける状態監視の実装
正確な再生状態を把握する
現在映像が再生されているのか?停止しているのか?を正確に把握したい場合がある。例えば、映像の再生状態に合わせてアプリ側の独自の UI を更新したい場合など。
.readyToPlay になっても、再生が開始しているとは限らない
そのため、再生状態の確認にこの値を参照してはいけない
バッファリングがある程度たまったかどうか?の検知には利用できそう
KVO で監視できるが、再生開始の検知に利用しようとした場合、数 msec の誤差が生じる恐れがある このプロパティは 実際の再生速度ではなく、要求された再生速度である
そのため、再生速度の確認にこの値を参照してはいけない
KVO で監視できるが、数 msec の誤差が生じる恐れがある 実際の再生速度を取得できる
KVO で監視すれば、ほぼ誤差なく再生状態を監視できる 一時停止/待機/再生 のどの状態にいるのか?を把握できる
KVO で監視すれば、ほぼ誤差なく再生状態を監視できる 下記のデモを確認すると、各プロパティがどのように変化するのか?がわかりやすい。
プレーヤの再生時刻を監視する
シークバー等の表示のために、AVAsset の再生時間を継続的に監視したいという要求がある。しかし、時刻を表すプロパティは KVO によって継続的な状態変化を監視するのに向いていないため、代わりに AVPlayer が提供している periodic observations もしくは boundary observations を利用するのが推奨される。 定期的な監視
code:swift
func addPeriodicTimeObserver() {
// 0.5秒ごとに時刻を監視する
let interval = CMTime(seconds: 0.5,
preferredTimescale: CMTimeScale(NSEC_PER_SEC))
// ObserverをPlayerに登録する (timeObserverTokenは強参照で保持しておく)
timeObserverToken =
player.addPeriodicTimeObserver(forInterval: interval, queue: .main) {
// 適宜UIの更新等を行う
}
}
境界値による監視
設定した特定時刻に対して必ず callback が呼び出されることは保障されない。例えば、二つの特定時刻が callback の実行にかかる時間よりも短いくらい近い位置にあったり、それらの時刻を超えてシークされた場合などには呼び出されない。
参考