クライアントの可観測性 — Windows

OpenTok Windows SDK には、ビデオセッションにおけるリアルタイムのネットワークおよびメディア統計情報にアクセスするための関数が用意されています。これらの関数は、パケットロス、受信データ量、帯域幅などの詳細なストリーム品質メトリクスを報告し、あらゆるパブリッシャーまたはサブスクライブされたストリームで利用できます。

OpenTok Video SDK は、高レベルな統計 API を通じて詳細なストリーム品質メトリクスを提供します。この API はほとんどのユースケースで推奨されており、音声、動画、ネットワーク、および送信者側の統計情報を、ピア接続の切り替え時にも安定した、セッションを意識した統一された形式で提供します。 高度なデバッグを行うために、この SDK では、未処理のピア接続データを反映した生の WebRTC 統計レポートへのアクセスも提供しています。

SDKはまた、パブリッシャーとサブスクライバーの両方に対して、接続の健全性をハイレベルで評価するネットワーク・コンディション・メトリクスを公開します。これらのメトリクスには、ネットワーク・コンディション・スコア、そのスコアの理由、およびサブスクライバについては、観察された問題の原因が接続のどちらにあるかを示すデグラデーション・ソースが含まれます。参照 ネットワークの状態と劣化の原因 詳細はこちら。

このガイドには、以下のセクションが含まれています:

オーディオ、ビデオ、およびメディアリンクの統計情報API

OpenTok Windows SDK は、パブリッシャーとサブスクライバーの両方について、音声、動画、およびメディアリンクの統計情報を定期的に送信します。これには、パケット数、ビットレート、フレームレートデータ、一時停止/フリーズのメトリクス、コーデック情報、および帯域幅の推定値やネットワーク状態のスコアといったトランスポートレベルのネットワークメトリクスが含まれます。

統計は以下のイベントを通じて配信される:

  • Publisher.AudioStatsUpdated - 出版社側のオーディオ統計
  • Publisher.VideoStatsUpdated - パブリッシャー側の動画統計
  • Publisher.MediaLinkStatsUpdated - パブリッシャー側のメディアリンク統計(トランスポートメトリクス)
  • Publisher.VideoQualityChanged - パブリッシャービデオ画質変更通知
  • Publisher.NetworkConditionChanged - パブリッシャーネットワーク条件変更通知
  • Subscriber.AudioStatsUpdated - 加入者側のオーディオ統計
  • Subscriber.VideoStatsUpdated - 加入者側のビデオ統計
  • Subscriber.MediaLinkStatsUpdated - 加入者側メディアリンク統計(トランスポート・メトリクス)
  • Subscriber.VideoQualityChanged - 加入者ビデオ画質変更通知
  • Subscriber.NetworkConditionChanged - 加入者ネットワーク状態変更通知

それを受け取るには、パブリッシャーかサブスクライバーに適切な イベントハンドラを設定してください。

パブリッシャー向け統計の有効化

に対応するイベントハンドラを設定する。 Publisher.AudioStatsUpdated そして Publisher.VideoStatsUpdated:

publisher.AudioStatsUpdated += (sender, args) =>
{
    foreach (var stat in args.Stats)
    {
        Console.WriteLine($"Audio bytes sent: {stat.BytesSent}");
    }
};

publisher.VideoStatsUpdated += (sender, args) =>
{
    foreach (var stat in args.Stats)
    {
        Console.WriteLine($"Video packets sent: {stat.PacketsSent}");
    }
};

publisher.MediaLinkStatsUpdated += (sender, args) =>
{
    foreach (var stat in args.MediaLinkStats)
    {
        Console.WriteLine($"Publisher uplink bandwidth: {stat.Transport.ConnectionEstimatedBandwidth} bps");
        Console.WriteLine($"Network condition: {stat.Transport.Condition}");
        Console.WriteLine($"Condition reason: {stat.Transport.NetworkConditionReason}");
    }
};

これらのイベントは、パブリッシャーのオーディオとビデオの統計情報を報告するために定期的に送られます。 これらのイベントハンドラは オーディオネットワーク統計 そして ビデオネットワーク統計 各メソッドには2つのオブジェクトが渡されます。 オブジェクトの配列です。ルーティングされたセッションのパブリッシャー( OpenTok メディアルーター, この配列には1つのオブジェクトが含まれており、 Vonage Video Media Routerに送信される単一のオーディオまたはビデオメディアストリームの統計情報を定義しています。 中継セッションでは、この配列には、公開されたストリームの 各加入者に対応するオブジェクトが含まれます。

パブリッシャーでビデオ画質のイベントを受信する

ビデオ画質イベントにも興味がある場合は、このハンドラを実装してください:

publisher.VideoQualityChanged += (sender, args) =>
{
    Console.WriteLine($"Publisher video quality changed: {args.Reason}");
};

パブリッシャーでのネットワーク状態変化イベントの受信

パブリッシャーのネットワーク状態変化イベントを受け取るには Publisher.NetworkConditionChanged イベントを開催する:

publisher.NetworkConditionChanged += (sender, args) =>
{
    Console.WriteLine($"Publisher network condition: {args.MediaLinkStats.Transport.Condition}");
    Console.WriteLine($"Reason: {args.MediaLinkStats.Transport.NetworkConditionReason}");
};

このイベントは、パブリッシャーのネットワーク状態に著しい変化が検出された際に発生します。これには、トランスポートメトリクスを含む現在のメディアリンク統計情報が含まれます。

加入者統計の有効化

に対応するイベントハンドラを設定する。 Subscriber.AudioStatsUpdated そして Subscriber.VideoStatsUpdated:

subscriber.VideoStatsUpdated += (sender, stats) =>
{
    Console.WriteLine($"Video bytes received: {stats.BytesReceived}");
};

subscriber.AudioStatsUpdated += (sender, stats) =>
{
    Console.WriteLine($"Audio packets received: {stats.PacketsReceived}");
};

subscriber.MediaLinkStatsUpdated += (sender, args) =>
{
    Console.WriteLine($"Local downlink bandwidth: {args.MediaLinkStats.Transport.ConnectionEstimatedBandwidth} bps");
    if (args.MediaLinkStats.RemotePublisherTransport != null)
    {
        Console.WriteLine($"Remote publisher uplink bandwidth: {args.MediaLinkStats.RemotePublisherTransport.ConnectionEstimatedBandwidth} bps");
    }
    Console.WriteLine($"Degradation source: {args.MediaLinkStats.NetworkDegradationSource}");
};

加入者のビデオ品質イベントの受信

ビデオ画質イベントにも興味がある場合は、このハンドラを実装してください:

subscriber.VideoQualityChanged += (sender, args) =>
{
    Console.WriteLine($"Subscriber video quality event: {args.Reason}");
};

加入者側でのネットワーク状態変化イベントの受信

サブスクライバーのネットワーク条件変更イベントを受信するには、次のようにサブスクライブする。 Subscriber.NetworkConditionChanged イベントを開催する:

subscriber.NetworkConditionChanged += (sender, args) =>
{
    Console.WriteLine($"Local network condition: {args.MediaLinkStats.Transport.Condition}");
    Console.WriteLine($"Remote publisher network condition: {args.MediaLinkStats.RemotePublisherTransport.Condition}");
    Console.WriteLine($"Degradation source: {args.MediaLinkStats.NetworkDegradationSource}");
};

このイベントは、加入者またはリモートパブリッシャーのネットワーク状態に著しい変化が検出された際に発生します。これには、ローカルおよびリモートのトランスポートメトリクスや品質低下の原因を含む、現在のメディアリンク統計情報が含まれます。

統計データ構造

このセクションでは、Windows Video SDK オーディオ/ビデオ統計 API が提供する構造体とフィールドの概要を説明します。すべての Video SDK プラットフォームが同じ統計情報セットを公開していますが、各プラットフォームで個々のフィールドの構造や名前の付け方に若干の違いがある場合があります。これらの違いは、基本的なメトリクスの違いではなく、プラットフォーム固有の SDK の設計規約を反映しています。

利用可能な統計とそれが表すものについてのプラットフォームに依存しない説明については、以下を参照のこと。 顧客の観測可能性の概要.

TransportStats

トランスポート・レベルのメトリクスを表します。

  • ConnectionEstimatedBandwidth - 推定利用可能接続帯域幅(bps)
  • Condition - 現在のネットワーク・コンディション・スコアNetworkCondition.Unknown, NetworkCondition.Critical, NetworkCondition.Warning, NetworkCondition.Fair, NetworkCondition.Goodあるいは NetworkCondition.Excellent)
  • NetworkConditionReason - ネットワーク状況に影響を与える主な理由NetworkReason.None, NetworkReason.Unknown, NetworkReason.Bandwidthあるいは NetworkReason.PacketLoss)

Publisher.AudioNetworkStats

パブリッシャーのオーディオトラックに関する統計を提供します。

  • ConnectionId - 加入者接続ID(中継のみ)
  • SubscriberId - 加入者ID(中継のみ)
  • PacketsLost - 失われたオーディオパケットの合計
  • PacketsSent - 送信されたオーディオ・パケットの合計
  • BytesSent - 送信されたオーディオ・バイトの合計
  • Timestamp - 統計が収集されたタイムスタンプ (ms)
  • StartTime - 累計開始のタイムスタンプ(ms)

Publisher.VideoNetworkStats

パブリッシャーのビデオトラックに関する統計を提供します。

  • ConnectionId - 加入者接続ID(中継のみ)
  • SubscriberId - 加入者ID(中継のみ)
  • PacketsLost - ビデオパケットの損失
  • PacketsSent - ビデオパケット送信
  • BytesSent - ビデオ・バイトの送信
  • Timestamp - 統計が収集されたタイムスタンプ
  • StartTime - 累積集計開始のタイムスタンプ
  • VideoLayers - サイマルキャスト/SVCレイヤーのリスト(VideoLayerStats)

Publisher.VideoLayerStats

単一のサイマルキャストまたはSVCビデオレイヤーを表す。

  • Width - 符号化フレーム幅
  • Height - エンコードされたフレームの高さ
  • EncodedFrameRate - エンコード・フレーム/秒
  • Bitrate - レイヤービットレート(bps)
  • TotalBitrate - RTPオーバーヘッドを含むビットレート(bps)
  • ScalabilityMode - SVC/スケーラビリティの説明(例:「L3T3)
  • QualityLimitationReason - 品質低下の理由
  • Codec - このレイヤーに使用されているコーデック

Publisher.PublisherMediaLinkStats

パブリッシャー接続のトランスポートレベルの統計情報を提供します。

  • Transport - この出版社の輸送統計 TransportStats)

Subscriber.AudioNetworkStatsEventArgs

加入者のオーディオトラックに関する統計情報を提供します。

  • PacketsLost - 失われたオーディオパケットの推定値
  • PacketsReceived - 受信したオーディオ・パケット
  • BytesReceived - 受信したオーディオ・バイト
  • Timestamp - 統計が収集されたタイムスタンプ
  • SenderStats - 送信側ネットワーク推定(オプション)

Subscriber.VideoNetworkStatsEventArgs

加入者のビデオトラックに関する統計を提供する。

  • PacketsLost - ビデオパケットの損失
  • PacketsReceived - ビデオパケット受信
  • BytesReceived - ビデオ・バイト受信
  • Timestamp - 統計が収集されたタイムスタンプ
  • SenderStats - 送信側ネットワーク推定(オプション)
  • Width - デコードされたフレーム幅
  • Height - デコードされたフレームの高さ
  • DecodedFrameRate - デコード・フレーム/秒
  • Bitrate - ビデオビットレート(bps)
  • TotalBitrate - RTPオーバーヘッドを含む総ビットレート
  • PauseCount - ビデオの一時停止数(フレームなしで5秒以上)
  • TotalPausesDuration - 全休止時間 (ms)
  • FreezeCount - WebRTCで定義されたフリーズの数
  • TotalFreezesDuration - 合計フリーズ時間(ms)
  • Codec - デコーダー・コーデック

Subscriber.SubscriberMediaLinkStats

リモートパブリッシャーのネットワークパフォーマンスの可視性を含む、サブスクライバーの接続のトランスポートレベルの統計情報を提供します。これにより、アプリケーションは、接続の問題が加入者のダウンリンクに起因するのか、パブリッシャーのアップリンクに起因するのかを診断できます。

  • Transport - この加入者のダウンリンク接続のトランスポート統計(以下を参照。 TransportStats)
  • RemotePublisherTransport - リモートパブリッシャーのアップリンク接続のトランスポート統計( TransportStats).送信側統計が有効でない場合、制限されることがある。
  • NetworkDegradationSource - ネットワーク劣化の原因があればそれを示す (NetworkDegradationSource.None, NetworkDegradationSource.Local, NetworkDegradationSource.Remoteあるいは NetworkDegradationSource.BothOrUnclear)

送信側統計

参照 送信側統計の概要.

送信側統計の有効化

送信者側の統計情報は、購読者が受け取る。送信者側の統計を受け取るには、ストリームのパブリッシャーで HasSenderStatsTrack プロパティ true パブリッシャーを構築する際に

var publisherBuilder = new Publisher.Builder()
{
    HasSenderStatsTrack = true
};

Publisher publisher = publisherBuilder.Build();

もし HasSenderStatsTrack が有効でない場合、このパブリッシャーに対して送信者統計チャンネルは発行されません。デフォルト値は false.

送信者側の統計情報の受信

パブリッシャーが送信者側の統計情報を有効にしていれば、購読者は自動的に VideoStatsUpdated そして AudioStatsUpdated イベント 前述.その SenderStats の両方のプロパティを持つ。 VideoNetworkStatsEventArgs そして AudioNetworkStatsEventArgs は2つの指標を提供する:

  • ConnectionMaxAllocatedBitrate - 接続時に推定可能な最大ビットレート
  • ConnectionEstimatedBandwidth - 接続の現在の推定帯域幅

これらのメトリクスは、オーディオとビデオのバンドルごとに計算されるため、ビデオとオーディオの両方の統計に同じ値が表示されます。

subscriber.VideoStatsUpdated += (sender, stats) =>
{
    if (stats.SenderStats != null)
    {
        Console.WriteLine($"Connection max allocated bitrate: {stats.SenderStats.ConnectionMaxAllocatedBitrate}");
        Console.WriteLine($"Connection current estimated bandwidth: {stats.SenderStats.ConnectionEstimatedBandwidth}");
    }
};

ネットワークの状態と劣化の原因

SDKは、パブリッシャーとサブスクライバーの両方に対して、コンディションのスコア、そのスコアを駆動する理由、サブスクライバーの劣化ソースを含むリアルタイムのネットワーク・コンディション・メトリクスを提供します。ネットワーク・コンディション・モデル、スコア、理由、およびそれを有効にする方法の詳細については 顧客の観測可能性の概要.

ネットワーク・コンディション・データは2つのチャンネルから入手できる:

  • 定期的な統計: メディアリンク統計イベントには、以下のトランスポートメトリクスが含まれます。 Condition そして NetworkConditionReason.購読者向けには、メディアリンクの統計も含まれる。 RemotePublisherTransport そして NetworkDegradationSource.
  • ネットワーク状態の変更イベント: ネットワークの状態に著しい変化が検出されると、パブリッシャー側とサブスクライバー側の両方で専用のイベントがトリガーされます。

以下の例では、加入者ネットワークの状態データを使用して、劣化の原因を特定する方法を示しています:

subscriber.NetworkConditionChanged += (sender, args) =>
{
    var localCondition = args.MediaLinkStats.Transport.Condition;
    var remoteCondition = args.MediaLinkStats.RemotePublisherTransport.Condition;
    var source = args.MediaLinkStats.NetworkDegradationSource;

    if (source == NetworkDegradationSource.Local)
    {
        Console.WriteLine($"Local network is degraded (condition: {localCondition})");
    }
    else if (source == NetworkDegradationSource.Remote)
    {
        Console.WriteLine($"Remote publisher network is degraded (condition: {remoteCondition})");
    }
    else if (source == NetworkDegradationSource.BothOrUnclear)
    {
        Console.WriteLine($"Degradation source unclear — local: {localCondition}, remote: {remoteCondition}");
    }
};

RTC統計レポート

WebRTCレベルの診断データについては、RTC統計APIを使用してください。パブリッシャーの低レベルのピア接続統計を取得するには、 Publisher.GetRtcStatsReport() メソッド。これにより、 メディアストリームのRTC統計レポートが提供されます。これは非同期操作です。 統計情報が利用可能になると、RtcStatsReportイベントが送信されます。 RtcStatsReportArgsオブジェクトには、 発行元:RtcStats オブジェクトには、JsonArrayOfReports プロパティが含まれています。これは、 RTC 統計レポートの JSON 配列であり、 Web ブラウザで実装されている RtcStatsReport オブジェクトの形式と類似しています(参照: Mozillaのドキュメント. こちらも参照 このW3Cドキュメント.

加入者の低レベルピア接続統計情報を取得するには、次のコマンドを使用します。 Subscriber.GetRtcStatsReport() メソッド。これにより、 メディアストリームのRTC統計レポートが提供されます。これは非同期操作です。 統計情報が利用可能になると、RtcStatsReportイベントが送信されます。 RtcStatsReportArgs このオブジェクトには、JsonArrayOfReports プロパティが含まれています。これは、 RTC 統計レポートの JSON 配列であり、その形式は Web ブラウザで実装されている RtcStatsReport オブジェクトの形式と類似しています(参照: Mozillaのドキュメント. こちらも参照 このW3Cドキュメント.

パブリッシャーのRTC統計レポートを要求する:

publisher.RtcStatsReport += (sender, args) =>
{
    foreach (var stat in args.stats)
    {
        Console.WriteLine(stat.JsonArrayOfReports); // Raw RTC JSON
    }
};

publisher.GetRtcStatsReport();