WWDC Quick Look 💓 By SwiftGGTeam
Discover media performance metrics in AVFoundation

Discover media performance metrics in AVFoundation

元の動画を見る

ハイライト

iOS 18 の AVMetrics は、AVPlayerItem 再生ライフサイクルの各ステップ——playlist リクエスト、segment ダウンロード、content key 取得、stall、variant 切替——を購読可能なイベントストリームに変換。クライアントから起動遅延と再生カクつきの根本原因を直接特定できます。

主要内容

起動に 2 秒、7 分目で突然停止——メディア app で最も多い 2 つの不満。iOS 18 以前は access log、error log、AVPlayer の各種通知が使えた。粒度が粗すぎた——stall は起きたが、その前のどのステップで問題が起きたか不明。起動が遅いのは分かるが、content key リクエストか segment ダウンロードか時間の使い道が分からない。

iOS 18 で AVMetrics を導入。パブリッシャー/サブスクライバーモデルのイベントストリームシステム。AVPlayerItem が AVMetricEventStreamPublisher に準拠すると、再生中の各完了アクティビティがイベントを生成: multi-variant playlist リクエスト完了、media segment ダウンロード完了、content key 取得完了、stall 発生、variant 切替。各イベントにタイムスタンプとコンテキスト付き。完全なイベントチェーンに連結可能。セッションは 2 つの実シナリオで診断能力を実演: 起動遅延ではイベントチェーンが content key リクエストに大部分の時間を示し、解決策は key のプリロードか key server 最適化。カクつきでは segment イベントがサーバー HTTP 404 を示し、variant が 20Mbps から 15Mbps に低下、新 variant も 404、バッファ枯渇で stall。旧方式ではクライアントデータからほぼ特定不可能な情報。

詳細

AVMetrics コアプロトコル定義(6:27):

public protocol AVMetricEventStreamPublisher
{
    func metrics<MetricType: AVMetricEvent>(forType metricType: MetricType.Type) -> AVMetrics<MetricType>

    func allMetrics() -> AVMetrics<AVMetricEvent>
}

extension AVPlayerItem : AVMetricEventStreamPublisher

キーポイント:

  • metrics(forType:) は指定イベント型のみを含む強型付き AVMetrics<MetricType> 非同期シーケンスを返す
  • allMetrics() は全イベント型のマージシーケンスを返す
  • AVPlayerItem が直接準拠。追加ラッパー不要

Swift で「likely to keep up」と「summary」イベントを購読(6:50):

let playerItem : AVPlayerItem = ...

let ltkuMetrics = item.metrics(forType: AVMetricPlayerItemLikelyToKeepUpEvent.self)
let summaryMetrics = item.metrics(forType: AVMetricPlayerItemPlaybackSummaryEvent.self)

for await (metricEvent, publisher) in ltkuMetrics.chronologicalMerge(with: summaryMetrics)
{
    // send metricEvent to server
}

キーポイント:

  • metrics(forType:) にイベント型の .self を渡して対応非同期シーケンス取得
  • chronologicalMerge(with:) で複数イベントストリームを時系列マージ。手動ソート不要
  • for await でイベントを逐次消費。シリアライズして分析サーバーへ送信
  • イベントは対応アクティビティ完了時に生成(media playlist リクエスト完了後など)。開始時ではない

Objective-C 側(7:26):

AVPlayerItem *item = ...

AVMetricEventStream *eventStream = [AVMetricEventStream eventStream];
id<AVMetricEventStreamSubscriber> subscriber = [[MyMetricSubscriber alloc] init];
[eventStream setSubscriber:subscriber queue:mySerialQueue]

[eventStream subscribeToMetricEvent:[AVMetricPlayerItemLikelyToKeepUpEvent class]];
[eventStream subscribeToMetricEvent:[AVMetricPlayerItemPlaybackSummaryEvent class]];

[eventStream addPublisher:item];

キーポイント:

  • まず AVMetricEventStream インスタンス作成。subscriber と queue を設定
  • subscribeToMetricEvent: で関心イベント型を個別登録
  • addPublisher: で AVPlayerItem をイベントストリームにバインド。subscriber がイベント受信開始

AVMetrics サポートイベント型は再生全ライフサイクルをカバー: playlist イベント(multi-variant playlist、media playlist)、media segment イベント(NSURLSessionTaskMetrics 含む)、content key イベント、stall イベント、variant switch イベント、likely to keep up イベント、rate change イベント、seek イベント、error イベント、最終 summary イベント。Summary イベントは stall count、switch count など KPI を提供。大規模モニタリングに適する(4:44)。

重要ポイント

  • 何をするか: 新規再生項目に初日から AVMetrics を組み込む。なぜ価値があるか: 再生品質は早くモニタリングするほど良い。ユーザー苦情を待つのは遅すぎる。始め方: 最低限 summary イベントを購読し、stall count と switch count を分析システムに報告。十数行のコードで完了。

  • 何をするか: 既存 access log / error log 方式を AVMetrics に置換。なぜ価値があるか: AVMetrics イベントはタイムスタンプとコンテキスト関連付き。完全イベントチェーンを復元。旧方式を大きく超える粒度。始め方: まず少数ユーザーで AVMetrics を段階展開。旧方式とのデータ一貫性を比較。問題なければ全量切替。

  • 何をするか: media segment イベントの NSURLSessionTaskMetrics データを CDN ベンダーと共有。なぜ価値があるか: NSURLSessionTaskMetrics は DNS、TCP、TLS、TTFB など完全なネットワークトランザクション詳細と response headers を含む。CDN ベンダーがエッジノード問題を迅速特定。始め方: 特定リージョンのユーザーが segment ダウンロード失敗に頻繁に遭遇する場合、イベントから session identifier と response headers を抽出して CDN ベンダーへ送信。

関連セッション

コメント

GitHub Issues · utterances