Das Vonage Video SDK stellt detaillierte Metriken zur Stream-Qualität über eine High-Level-Statistik-API zur Verfügung, die für die meisten Anwendungsfälle empfohlen wird und die Audio-, Video-, Netzwerk- und Absenderstatistiken in einer einheitlichen, sitzungsspezifischen Form bereitstellt, die über Peer-Verbindungsübergänge hinweg stabil bleibt. Für fortgeschrittenes Debugging bietet das SDK auch Zugriff auf den rohen WebRTC-Statistikbericht, der unverarbeitete Peer-Verbindungsdaten wiedergibt.

Audio- und Videostatistik-API

Das Vonage Video Windows SDK sendet regelmäßig Audio- und Videonetzwerkstatistiken sowohl für Publisher als auch für Subscriber. Dazu gehören die Anzahl der Pakete, Bitraten, Daten zur Bildrate, Pausen-/Freeze-Metriken, Codec-Informationen und optionale senderseitige Netzwerkschätzungen.

Statistiken werden über die folgenden Ereignisse geliefert:

  • Publisher.AudioStatsUpdated - verlagsseitige Audio-Statistiken
  • Publisher.VideoStatsUpdated - Video-Statistiken auf Verlagsseite
  • Publisher.VideoQualityChanged - Benachrichtigung des Herausgebers über Änderungen der Videoqualität
  • Subscriber.AudioStatsUpdated - Audio-Statistiken auf der Abonnentenseite
  • Subscriber.VideoStatsUpdated - Video-Statistiken auf der Abonnentenseite
  • Publisher.VideoQualityChanged - Benachrichtigung der Abonnenten über Änderungen der Videoqualität

Um sie zu empfangen, setzen Sie den entsprechenden Event-Handler auf dem Publisher oder Subscriber.

Freigabe von Statistiken für Verleger

Setzen Sie die entsprechenden Ereignisbehandler für Publisher.AudioStatsUpdated und 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}");
    }
};

Diese Ereignisse werden in regelmäßigen Abständen gesendet, um Audio- und Videostatistiken für den Herausgeber zu melden. Die Ereignisbehandler für diese Ereignisse werden in einem Array von AudioNetworkStats und VideoNetzwerkStatistiken Jeder Methode werden zwei Objekte übergeben: der Herausgeber und ein Array von stats Objekten. Für einen Verleger in einer gerouteten Sitzung (einer, die die OpenTok Medien-Router), enthält das Array ein Objekt, das die Statistiken für den einzelnen Audio- oder Video-Medienstrom, der an den Vonage Video Media Router gesendet wird. Bei einer weitergeleiteten Sitzung enthält das Array ein Objekt für jeden Teilnehmer des des veröffentlichten Streams.

Empfang von Ereignissen in Videoqualität bei den Herausgebern

Wenn Sie auch an Videoqualitätsereignissen interessiert sind, implementieren Sie diesen Handler:

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

Aktivieren von Statistiken für Abonnenten

Setzen Sie die entsprechenden Ereignisbehandler für Subscriber.AudioStatsUpdated und Subscriber.VideoStatsUpdated:

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

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

Empfang von Videoqualitätsereignissen bei den Abonnenten

Wenn Sie auch an Videoqualitätsereignissen interessiert sind, implementieren Sie diesen Handler:

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

Statistik-Datenstrukturen

In diesem Abschnitt werden die Strukturen und Felder beschrieben, die von der Windows Video SDK-Audio- und Videostatistik-API bereitgestellt werden. Während alle Video SDK-Plattformen die gleichen Statistiken bereitstellen, kann es geringfügige Unterschiede in der Strukturierung oder Benennung einzelner Felder geben. Diese Unterschiede spiegeln eher plattformspezifische SDK-Designkonventionen als Unterschiede in den zugrunde liegenden Metriken wider.

TransportStats

Stellt eine Bandbreitenabschätzung auf Transportebene dar.

  • ConnectionEstimatedBandwidth - Geschätzte verfügbare Bandbreite der Aufwärtsstrecke (bps)

Publisher.AudioNetworkStats

Liefert Statistiken über die Audiospur eines Verlags.

  • ConnectionId - Teilnehmerverbindungs-ID (nur weitergeleitet)
  • SubscriberId - Teilnehmer-ID (nur weitergeleitet)
  • PacketsLost - Insgesamt verlorene Audiopakete
  • PacketsSent - Insgesamt gesendete Audiopakete
  • BytesSent - Insgesamt gesendete Audio-Bytes
  • Timestamp - Zeitstempel der Erfassung der Statistiken (ms)
  • StartTime - Zeitstempel des Beginns der kumulativen Summen (ms)
  • Transport - Statistiken auf Transportebene (TransportStats)

Publisher.VideoNetworkStats

Liefert Statistiken über die Videospur eines Herausgebers.

  • ConnectionId - Teilnehmerverbindungs-ID (nur weitergeleitet)
  • SubscriberId - Teilnehmer-ID (nur weitergeleitet)
  • PacketsLost - Video-Pakete verloren
  • PacketsSent - Gesendete Videopakete
  • BytesSent - Gesendete Video-Bytes
  • Timestamp - Zeitstempel der Erfassung der Statistiken
  • StartTime - Zeitstempel des Beginns der kumulierten Summen
  • VideoLayers - Liste der Simulcast/SVC-Ebenen (VideoLayerStats)
  • Transport - Statistiken auf Transportebene

Publisher.VideoLayerStats

Stellt eine einzelne Simulcast- oder SVC-Videoebene dar.

  • Width - Kodierte Bildbreite
  • Height - Kodierte Rahmenhöhe
  • EncodedFrameRate - Kodierte Bilder pro Sekunde
  • Bitrate - Bitrate der Schicht (bps)
  • TotalBitrate - Bitrate einschließlich RTP-Overhead (bps)
  • ScalabilityMode - SVC/Skalierbarkeitsbeschreibung (z. B. "L3T3")
  • QualityLimitationReason - Grund für die Qualitätsminderung
  • Codec - Für diese Ebene verwendeter Codec

Subscriber.AudioNetworkStatsEventArgs

Liefert Statistiken über die Audiospur eines Abonnenten.

  • PacketsLost - Geschätzte verlorene Audiopakete
  • PacketsReceived - Empfangene Audiopakete
  • BytesReceived - Empfangene Audio-Bytes
  • Timestamp - Zeitstempel der Erfassung der Statistiken
  • SenderStats - Absenderseitige Netzbewertung (optional)

Subscriber.VideoNetworkStatsEventArgs

Liefert Statistiken über die Videospur eines Abonnenten.

  • PacketsLost - Video-Pakete verloren
  • PacketsReceived - Empfangene Videopakete
  • BytesReceived - Empfangene Video-Bytes
  • Timestamp - Zeitstempel der Erfassung der Statistiken
  • SenderStats - Absenderseitige Netzbewertung (optional)
  • Width - Dekodierte Bildbreite
  • Height - Dekodierte Rahmenhöhe
  • DecodedFrameRate - Dekodierte Bilder pro Sekunde
  • Bitrate - Video-Bitrate (bps)
  • TotalBitrate - Gesamtbitrate einschließlich RTP-Overhead
  • PauseCount - Numbers of video pauses (>5s ohne Frame)
  • TotalPausesDuration - Gesamtpausendauer (ms)
  • FreezeCount - Numbers von WebRTC-definierten Einfrierungen
  • TotalFreezesDuration - Gesamtdauer des Einfrierens (ms)
  • Codec - Decoder Codec

Statistik auf der Absenderseite

Siehe die Übersicht der Absenderstatistiken.

Aktivieren von Statistiken auf der Absenderseite

Senderstatistiken werden von den Abonnenten empfangen. Um absenderseitige Statistiken zu erhalten, aktivieren Sie sie für den Herausgeber des Streams, indem Sie die Option HasSenderStatsTrack Eigenschaft zu true bei der Erstellung des Verlags:

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

Publisher publisher = publisherBuilder.Build();

Wenn HasSenderStatsTrack nicht aktiviert ist, wird kein Absenderstatistikkanal für diesen Verlag veröffentlicht. Der Standardwert ist false.

Abonnieren von Statistiken auf der Absenderseite

Abonnenten erhalten nur dann automatisch Absenderstatistiken, wenn der Herausgeber diese aktiviert hat und der Abonnent einen Listener für Netzwerkstatistik-Ereignisse registriert hat.

Empfang von Statistikereignissen

Die absenderseitigen Statistiken werden über die VideoStatsUpdated und AudioStatsUpdated Ereignisse für Video und Audio. Die SenderStats Klasse, die sowohl in VideoNetworkStatsEventArgs und AudioNetworkStatsEventArgsbietet zwei Eigenschaften:

  • ConnectionMaxAllocatedBitrate - Die maximale Bitrate, die für die Verbindung geschätzt werden kann

  • ConnectionEstimatedBandwidth - Die aktuell geschätzte Bandbreite für die Verbindung

Diese beiden Metriken werden pro Audio-Video-Bündel berechnet, so dass sowohl in der Video- als auch in der Audiostatistik die gleichen Werte erscheinen. Da sie den Transport und nicht einzelne Tracks widerspiegeln, werden die Metriken sowohl für Audio als auch für Video verwendet.

Innerhalb der Statistik-Ereignishandler können Sie auf die absenderseitigen Metriken über die optionale SenderStats Eigentum:

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}");
    }
    else
    {
        Console.WriteLine("Sender stats not available yet.");
    }
};

Der gleiche Ansatz gilt für Audiostatistiken mit der Option AudioStatsUpdated Veranstaltung.

RTC-Statistikbericht

Um eine Low-Level-Peer-Verbindungsstatistik für Verlage zu erhalten, verwenden Sie die Publisher.GetRtcStatsReport() Methode. Sie liefert RTC-Statistikberichte für den Medienstrom. Dies ist ein asynchroner Vorgang. Wenn die Statistiken verfügbar sind, wird das Ereignis RtcStatsReport gesendet. Die RtcStatsReportArgs Objekt enthält ein Array von PublisherRtcStats Objekte, die eine JsonArrayOfReports Eigenschaft. Dies ist ein JSON-Array mit RTC-Statistikberichten, die dem Format des in Webbrowsern implementierten RtcStatsReport-Objekts ähnlich sind (siehe diese Mozilla-Dokumente).

Um eine Low-Level-Peer-Verbindungsstatistik eines Teilnehmers zu erhalten, verwenden Sie die Subscriber.GetRtcStatsReport() Methode. Dies liefert einen RTC-Statistikbericht für den Medienstrom.

Dies ist ein asynchroner Vorgang. Wenn die Statistiken verfügbar sind, wird das Ereignis RtcStatsReport gesendet. Die RtcStatsReportArgs Objekt enthält eine JsonArrayOfReports Eigenschaft. Dies ist ein JSON-Array mit RTC-Statistikberichten, die dem Format des in Webbrowsern implementierten RtcStatsReport-Objekts ähnlich sind (siehe diese Mozilla-Dokumente).

Siehe auch diese W3C-Dokumentation.

Anfordern eines RTC-Statistikberichts für einen Verlag:

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

publisher.GetRtcStatsReport();