ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
AVFoundationのメディアパフォーマンスメトリックスの紹介
新しいメディアパフォーマンスAPIを使用して、ユーザー体験をモニタリング、分析し、向上させる方法を説明します。さまざまなAVMetricEventsを使用し、AVplayerでHLSアセットを再生する際のパフォーマンスを監視する方法や、これらの指標を使用してプレイヤーのパフォーマンスに関する問題を把握し、対応の優先順位を判断する方法を学ぶことができます。
関連する章
- 0:00 - Introduction
- 1:33 - What are events?
- 5:36 - Subscribing to events
リソース
-
ダウンロード
こんにちは AVFoundation HLSエンジニアの Nishantです 今日は Appleが取り組んできた メディアパフォーマンスメトリックスを 収集する新しい方法について紹介します iOS 18では これらのメトリックスは イベントとして表されます このセッションでは 様々なイベントのタイプを見たあと アプリがこれらのイベントに サブスクライブする方法を説明します その前にメディアの再生に関する 一般的な問題をいくつか見てみましょう 1つはメディアの再生が開始されるのに 時間がかかりすぎるという問題 もう1つは途中で再生が停止する という問題です
これらの問題を 現場で選別するのは難しいですが クライアント側のメトリックスに アクセスできるなら非常に簡単に行えます そのほかにも クライアント側のメトリックスから AVFoundation APIの動作について 情報を得られます これらはパフォーマンスを理解し 改善するのに役立ちます
これまでは メディア再生について クライアント側のメトリックスのいくつかは アクセスログやエラーログ 様々なAVPlayer通知を通して 得ることができました iOS 18では HLS Streamingアセットの 利用可能なメトリックスが強化され データポイントが追加されています では メディア再生に問題がある 再生セッションを見ながら 新しいメトリックスのいくつかを 見てみましょう ここに15分間のビデオ再生の タイムラインがあります 最初の2秒間を拡大すると 開始時に何が起こったかがわかります AVPlayerでマルチバリアント プレイリストのフェッチが開始され それがイベントとして タイムラインに表示されます
そのあと AVPlayerにより ビデオ オーディオ 字幕の プレイリストがフェッチされます これらも同様にイベントとして タイムラインに表示されます メディアプレイリストを使用して AVPlayerによりメディアセグメントと 必要なコンテンツキーがフェッチされます AVPlayerにより バッファにデータが十分に溜まったら 再生を再開できる状態になります それが「likely to keep up」イベント としてタイムラインに表されています このイベントは開始時間と 関連プレイリストやメディアセグメント コンテンツキーイベントなど 開始に影響を与えた要素についての 詳細を提供します ご覧のように 開始にほぼ2秒かかっています
開始時間が長いため 先行するイベントを見てみましょう 開始時間の大半が コンテンツキーのリクエストの待機に 費やされていることがわかります そのため 主要なサーバパフォーマンスを 向上させるか クライアント側で再生前のキーの プリロードを調べる必要があります それにより開始時間を 短縮できるかもしれません クライアント側のメトリックスにより AVFoundationの再生セッション内で 何が起きているか わかるようになりました
次に進みましょう 途中でメディアの再生が停止する もう1つの問題を見てみましょう タイムラインを拡大すると 7分から8分の部分に停止が発生しています
そのことがイベントとして タイムラインで表されています
停止する前のイベントを 見てみましょう AVPlayerがメディアセグメントを フェッチしていることがわかります よく見ると ビデオメディアセグメントが HTTP 404エラーを返しています そのため20Mbpsから15Mbpsに バリアントが切り替えられています
切り替えのあと 新しいバリアントでも ビデオメディアセグメントが HTTP 404エラーを返しています この時点でAVPlayerが バッファ内のデータを使い切り 停止に至っています
メディアセグメントイベントへの アクセスにより NSURLSessionTaskのメトリックスを 参照できるようになりました このため リクエストに失敗した理由について すべての応答ヘッダや その他のネットワークトランザクションなど さらに詳しく調べられるようになりました こうした情報やセッション識別子は CDNパートナーと協力するときに 問題の絞り込みに役立つかもしれません クライアント側のメトリックスにより このように現場で問題を選別できます
さらに セッションを大規模にモニタリングする場合 AVPlayerでは 最後にサマリーイベントが作成されます このイベントでは セッションの停止回数や切り替え回数など 様々な主要パフォーマンス指標が 一目でわかります これらのKPIを活用することで メディアの再生状況を大規模に追跡できます ここまでをまとめると プレイリストやメディアセグメント コンテンツキーイベントを確認することで 個々のリソースリクエストについての 情報を得ることができました 停止イベントと バリアント切り替えイベントからは メディアの再生停止とバリアントの 切り替えに関する情報を得られました 最後に作成されるサマリーイベントでは KPIを確認できました ほかにも AVPlayerItemは 再生速度が変化すると 速度変更イベントを生成し ユーザーによるシーク時にはシークイベント エラー発生時はエラーイベントを生成します それでは アプリでイベントにサブスクライブして 受け取る方法を見ていきましょう iOS 18では AVMetricsと呼ばれる 新しいAVFoundation APIが 導入されています これにより 様々な AVFoundationインターフェイスから 統一された方法でメトリックスを 収集できるようになりました メディアタイムラインでのイベント発生時に アプリでイベントを受け取ることができます イベントは メディアプレイリストのフェッチなど 特定のアクティビティの最後に生成されます パブリッシャー/ サブスクライバーモデルに従い 興味のあるイベントにのみ サブスクライブすることができます それでは 重要ないくつかの 概念について見ていきましょう パブリッシャーとはイベント発行に対応する AVFoundationインターフェイスのことで AVMetricEventStreamPublisher プロトコルに準拠しています このプロトコルでは 特定の メトリックスイベントタイプのイベント またはすべてのメトリックスのイベントの 発行をサポートしています iOS 18では AVPlayerItemは AVMetricEventStreamPublisher プロトコルに準拠しており イベントを発行することができます では一例を見てみましょう ここでは「likely to keep up」と 「summary events」に注目し それらをバックエンドの アナリティクスサーバに報告します まず「likely to keep up」と 「summary events」のAVMetrics非同期 シーケンスストリームをグラブします 次に 時系列にマージしたストリームを作成します これにより「likely to keep up」と 「summary events」の両方を時系列で 効率的に生成することができます イベントを受け取ったら それらをシリアル化して バックエンドのアナリティクスサーバに 送信します
Objective-Cデベロッパの場合は AVMetrics APIが少し異なります ここで AVMetricEventStream インスタンスを作成し サブスクライバーを設定します そのあと 興味のあるイベントに サブスクライブします
次に AVPlayerItemを追加します この時点からサブスクライバーは これらのイベントを受け取り始めます
これらのイベントをシリアル化して バックエンドサーバに送信します 以上が アプリでサブスクライブして クライアント側のメトリックスを バックエンドのアナリティクスサーバに 報告する方法です ここまで AVPlayerの クライアント側のメトリックスと 様々なイベントタイプを紹介しました アプリでサブスクライブして メトリックスを受け取る方法も紹介しました 新しいAPIをみなさんのアプリに ぜひ導入してみてください 機能強化された クライアント側のアナリティクスが 現場での問題の選別に役立ち ユーザーのメディア再生パフォーマンスを 改善させることを願っています ご視聴ありがとうございました
-
-
6:27 - AVMetric Publishers
public protocol AVMetricEventStreamPublisher { func metrics<MetricType: AVMetricEvent>(forType metricType: MetricType.Type) -> AVMetrics<MetricType> func allMetrics() -> AVMetrics<AVMetricEvent> } extension AVPlayerItem : AVMetricEventStreamPublisher
-
6:50 - Example showing how to obtain likely to keep up and summary metrics from AVPlayerItem - Swift
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 }
-
7:26 - Example showing how to obtain likely to keep up and summary metrics from AVPlayerItem - Objective-C
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];
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。