Client-Beobachtbarkeit: Windows
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.
Das SDK stellt auch Netzwerkzustandsmetriken zur Verfügung, die eine umfassende Bewertung des Verbindungszustands sowohl für Herausgeber als auch für Abonnenten ermöglichen. Diese Metriken umfassen eine Bewertung des Netzwerkzustands, den Grund für diese Bewertung und - für Abonnenten - eine Verschlechterungsquelle, die angibt, welche Seite der Verbindung für die beobachteten Probleme verantwortlich ist. Siehe Netzzustand und Ursache der Verschlechterung für Einzelheiten.
Audio-, Video- und Medienlink-Statistik-API
Das Vonage Video Windows SDK sendet in regelmäßigen Abständen Audio-, Video- und Media-Link-Netzwerkstatistiken 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-StatistikenPublisher.VideoStatsUpdated- Video-Statistiken auf VerlagsseitePublisher.MediaLinkStatsUpdated- verlagsseitige Medienverbindungsstatistiken (Transportmetriken)Publisher.VideoQualityChanged- Benachrichtigung des Herausgebers über Änderungen der VideoqualitätPublisher.NetworkConditionChanged- Benachrichtigung über Änderungen der Netzbedingungen durch den VerlagSubscriber.AudioStatsUpdated- Audio-Statistiken auf der AbonnentenseiteSubscriber.VideoStatsUpdated- Video-Statistiken auf der AbonnentenseiteSubscriber.MediaLinkStatsUpdated- teilnehmerseitige Medienverbindungsstatistiken (Transportmetriken)Subscriber.VideoQualityChanged- Benachrichtigung der Abonnenten über Änderungen der VideoqualitätSubscriber.NetworkConditionChanged- Benachrichtigung über Änderungen der Teilnehmernetzbedingungen
Um sie zu empfangen, setzen Sie den entsprechenden Event-Handler auf dem Publisher oder Subscriber.
Aktivieren 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}");
}
};
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}");
}
};
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 Videoqualitätsereignissen 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}");
};
Empfang von Netzwerkzustandsereignissen auf den Publishern
Um Ereignisse zur Änderung von Netzwerkbedingungen für den Herausgeber zu erhalten, abonnieren Sie die Publisher.NetworkConditionChanged Veranstaltung:
publisher.NetworkConditionChanged += (sender, args) =>
{
Console.WriteLine($"Publisher network condition: {args.VideoStats.Transport.Condition}");
Console.WriteLine($"Reason: {args.VideoStats.Transport.NetworkConditionReason}");
};
Dieses Ereignis wird ausgelöst, wenn eine signifikante Änderung der Netzwerkbedingungen für den Herausgeber festgestellt wird. Es liefert sowohl Video- als auch Audiostatistiken, da sie denselben zugrunde liegenden Transport nutzen.
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}");
};
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}");
};
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}");
};
Empfang von Netzwerkzustandsereignissen bei den Teilnehmern
Um Ereignisse zur Änderung der Netzbedingungen für den Teilnehmer zu erhalten, abonnieren Sie die Subscriber.NetworkConditionChanged Veranstaltung:
subscriber.NetworkConditionChanged += (sender, args) =>
{
Console.WriteLine($"Local network condition: {args.VideoStats.Transport.Condition}");
Console.WriteLine($"Remote publisher network condition: {args.VideoStats.RemotePublisherTransport.Condition}");
Console.WriteLine($"Degradation source: {args.VideoStats.NetworkDegradationSource}");
};
Dieses Ereignis wird ausgelöst, wenn eine signifikante Änderung der Netzwerkbedingungen für den Teilnehmer oder den entfernten Herausgeber festgestellt wird. Es liefert sowohl Video- und Audiostatistiken als auch lokale und entfernte Transportmetriken.
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 denselben Satz an Statistiken bereitstellen, kann es geringfügige Unterschiede in der Strukturierung oder Benennung einzelner Felder auf den einzelnen Plattformen geben. Diese Unterschiede spiegeln eher plattformspezifische SDK-Designkonventionen als Unterschiede in den zugrunde liegenden Metriken wider.
Eine plattformunabhängige Erläuterung der verfügbaren Statistiken und ihrer Bedeutung finden Sie unter Übersicht über die Beobachtbarkeit der Kunden.
TransportStats
Stellt Metriken auf Transportebene dar.
ConnectionEstimatedBandwidth- Geschätzte verfügbare Verbindungsbandbreite (bps)Condition- Aktuelle Netzzustandsbewertung (NetworkCondition.Unknown,NetworkCondition.Critical,NetworkCondition.Warning,NetworkCondition.Fair,NetworkCondition.Good, oderNetworkCondition.Excellent)NetworkConditionReason- Hauptgrund für die Beeinträchtigung des Netzzustandes (NetworkReason.None,NetworkReason.Unknown,NetworkReason.Bandwidth, oderNetworkReason.PacketLoss)
Publisher.AudioNetworkStats
Liefert Statistiken über die Audiospur eines Verlags.
ConnectionId- Teilnehmerverbindungs-ID (nur weitergeleitet)SubscriberId- Teilnehmer-ID (nur weitergeleitet)PacketsLost- Insgesamt verlorene AudiopaketePacketsSent- Insgesamt gesendete AudiopaketeBytesSent- Insgesamt gesendete Audio-BytesTimestamp- Zeitstempel der Erfassung der Statistiken (ms)StartTime- Zeitstempel des Beginns der kumulativen Summen (ms)
Publisher.VideoNetworkStats
Liefert Statistiken über die Videospur eines Herausgebers.
ConnectionId- Teilnehmerverbindungs-ID (nur weitergeleitet)SubscriberId- Teilnehmer-ID (nur weitergeleitet)PacketsLost- Video-Pakete verlorenPacketsSent- Gesendete VideopaketeBytesSent- Gesendete Video-BytesTimestamp- Zeitstempel der Erfassung der StatistikenStartTime- Zeitstempel des Beginns der kumulierten SummenVideoLayers- Liste der Simulcast/SVC-Ebenen (VideoLayerStats)
Publisher.VideoLayerStats
Stellt eine einzelne Simulcast- oder SVC-Videoebene dar.
Width- Kodierte BildbreiteHeight- Kodierte RahmenhöheEncodedFrameRate- Kodierte Bilder pro SekundeBitrate- Bitrate der Schicht (bps)TotalBitrate- Bitrate einschließlich RTP-Overhead (bps)ScalabilityMode- SVC/Skalierbarkeitsbeschreibung (z. B. "L3T3")QualityLimitationReason- Grund für die QualitätsminderungCodec- Für diese Ebene verwendeter Codec
Subscriber.AudioNetworkStatsEventArgs
Liefert Statistiken über die Audiospur eines Abonnenten.
PacketsLost- Geschätzte verlorene AudiopaketePacketsReceived- Empfangene AudiopaketeBytesReceived- Empfangene Audio-BytesTimestamp- Zeitstempel der Erfassung der StatistikenSenderStats- Absenderseitige Netzbewertung (optional)
Subscriber.VideoNetworkStatsEventArgs
Liefert Statistiken über die Videospur eines Abonnenten.
PacketsLost- Video-Pakete verlorenPacketsReceived- Empfangene VideopaketeBytesReceived- Empfangene Video-BytesTimestamp- Zeitstempel der Erfassung der StatistikenSenderStats- Absenderseitige Netzbewertung (optional)Width- Dekodierte BildbreiteHeight- Dekodierte RahmenhöheDecodedFrameRate- Dekodierte Bilder pro SekundeBitrate- Video-Bitrate (bps)TotalBitrate- Gesamtbitrate einschließlich RTP-OverheadPauseCount- Numbers of video pauses (>5s ohne Frame)TotalPausesDuration- Gesamtpausendauer (ms)FreezeCount- Numbers von WebRTC-definierten EinfrierungenTotalFreezesDuration- Gesamtdauer des Einfrierens (ms)Codec- Decoder Codec
Publisher.PublisherMediaLinkStats
Liefert Statistiken auf Transportebene für die Verbindung eines Verlags.
Transport- Verkehrsstatistiken für diesen Verlag (sieheTransportStats)
Subscriber.SubscriberMediaLinkStats
Liefert Statistiken auf Transportebene für die Verbindungen eines Teilnehmers, einschließlich Einblick in die Netzwerkleistung des entfernten Herausgebers. So können Applications diagnostizieren, ob Verbindungsprobleme vom Downlink des Teilnehmers oder vom Uplink des Publishers ausgehen.
Transport- Transportstatistiken für die Downlink-Verbindung dieses Teilnehmers (sieheTransportStats)RemotePublisherTransport- Transportstatistiken für die Uplink-Verbindung des Remote Publishers (sieheTransportStats). Kann eingeschränkt sein, wenn die absenderseitigen Statistiken nicht aktiviert sind.NetworkDegradationSource- Gibt die Quelle der Netzbeeinträchtigung an, falls vorhanden (NetworkDegradationSource.None,NetworkDegradationSource.Local,NetworkDegradationSource.Remote, oderNetworkDegradationSource.BothOrUnclear)
Statistik auf der Absenderseite
Siehe die Übersicht der Absenderstatistiken.
Aktivieren der absenderseitigen Statistik
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.
Empfangen von absenderseitigen Statistiken
Wenn der Herausgeber die Absenderstatistik aktiviert hat, erhalten die Abonnenten diese automatisch über die VideoStatsUpdated und AudioStatsUpdated Veranstaltungen oben beschrieben. Die SenderStats Eigenschaft auf beiden VideoNetworkStatsEventArgs und AudioNetworkStatsEventArgs liefert zwei Metriken:
ConnectionMaxAllocatedBitrate- Die maximale Bitrate, die für die Verbindung geschätzt werden kannConnectionEstimatedBandwidth- Die aktuell geschätzte Bandbreite für die Verbindung
Diese Metriken werden pro Audio-Video-Bündel berechnet, so dass in den Video- und Audiostatistiken dieselben Werte erscheinen.
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}");
}
};
Netzzustand und Verschlechterung Quelle
Das SDK liefert sowohl für Publisher als auch für Abonnenten Echtzeit-Netzwerkzustandsmetriken, einschließlich einer Zustandsbewertung, des Grundes für diese Bewertung und einer Verschlechterungsquelle für Abonnenten. Eine vollständige Erläuterung des Netzwerkzustandsmodells, der Bewertungen, der Gründe und der Aktivierung finden Sie in der Übersicht über die Beobachtbarkeit der Kunden.
Netzzustandsdaten sind über zwei Kanäle verfügbar:
- Regelmäßige Statistiken: Die
TransportEigenschaft von Publisher- und Subscriber-Stats-Objekten umfasstConditionundNetworkConditionReason. Die Abonnentenstatistiken geben auch Aufschluss überRemotePublisherTransportundNetworkDegradationSource. Siehe Strukturen der Statistik für Einzelheiten. - Ereignisse, bei denen sich der Netzzustand ändert: Gewidmete Veranstaltungen zu beiden Herausgeber und Teilnehmer werden ausgelöst, wenn eine signifikante Änderung der Netzbedingungen festgestellt wird.
Das folgende Beispiel zeigt, wie die Daten über den Zustand des Teilnehmernetzes verwendet werden können, um die Ursache der Verschlechterung zu ermitteln:
subscriber.NetworkConditionChanged += (sender, args) =>
{
var localCondition = args.VideoStats.Transport.Condition;
var remoteCondition = args.VideoStats.RemotePublisherTransport.Condition;
var source = args.VideoStats.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-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();