Client-Observability – Web
Das OpenTok Web SDK bietet Funktionen für den Zugriff auf Echtzeit-Netzwerk- und Medienstatistiken in einer Videositzung. Diese Funktionen liefern detaillierte Kennzahlen zur Stream-Qualität – wie beispielsweise Paketverlust, empfangene Daten und Bandbreite – und können für jeden veröffentlichten oder abonnierten Stream genutzt werden.
Das OpenTok Video SDK stellt detaillierte Metriken zur Stream-Qualität über eine hochrangige Statistik-API bereit – empfohlen für die meisten Anwendungsfälle –, die Audio-, Video-, Netzwerk- und senderseitige Statistiken in einer einheitlichen, sitzungsbezogenen Form liefert, die auch bei Wechseln der Peer-Verbindungen stabil bleibt. Für die erweiterte Fehlerbehebung bietet das SDK zudem Zugriff auf den Rohdatenbericht der WebRTC-Statistiken, der unverarbeitete Daten zu Peer-Verbindungen enthält.
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.
Dieser Leitfaden umfasst die folgenden Abschnitte:
- API für Audio-, Video- und Medien-Link-Statistiken
- Überwachung der Gesprächsqualität
- Strukturen der Statistik
- Statistik auf der Absenderseite
- Netzzustand und Ursache der Verschlechterung
- RTC-Statistikbericht
API für Audio-, Video- und Medien-Link-Statistiken
Das OpenTok Web SDK übermittelt regelmäßig Audio-, Video- und Medienlink-Statistiken sowohl für Publisher als auch für Subscriber. Dazu gehören Paketanzahlen, Bitraten, Bildfrequenzdaten, Metriken zu Pausen und Standbildern, Codec-Informationen sowie Netzwerkmetriken auf Transportebene wie Bandbreitenschätzungen und Bewertungen des Netzwerkzustands.
Abrufen von Statistiken für einen Verlag
Die Verlag.getStats() Die Methode liefert Ihnen ein Array mit Objekten, die die aktuellen Audio- und Videostatistiken für den Publisher definieren. Für einen Publisher in einer gerouteten Sitzung (d. h. einer, die die OpenTok Media Router), enthält dieses Array ein Objekt, das die Statistiken für den einzelnen Audio-Video-Stream, der an den Vonage Video Media Router gesendet wird. In einer weitergeleiteten Sitzung, enthält das Array ein Objekt für jeden Teilnehmer des veröffentlichten Streams.
Der folgende Code protokolliert jede Sekunde einige Metriken für den Stream des Herausgebers:
window.setInterval(() => {
publisher.getStats((error, statsArray) => {
if (error) {
console.error(error);
return;
}
statsArray.forEach(statsContainer => {
const stats = statsContainer.stats;
const connectionId = stats.connectionId || 'routed';
console.log(`\nStats for ${connectionId}`);
if (stats.video) {
const video = stats.video;
if (video.layers && video.layers.length > 0) {
console.log(`Video layers: ${video.layers.length}`);
video.layers.forEach((layer, index) => {
console.log(` Layer ${index}: ${layer.width}x${layer.height}`);
console.log(` encodedFrameRate: ${layer.encodedFrameRate} fps`);
console.log(` bitrate: ${layer.bitrate} bps`);
console.log(` totalBitrate: ${layer.totalBitrate} bps`);
console.log(` codec: ${layer.codec}`);
console.log(` scalabilityMode: ${layer.scalabilityMode}`);
if (layer.qualityLimitationReason) {
console.log(` qualityLimitationReason: ${layer.qualityLimitationReason}`);
}
});
}
console.log('transport estimated bandwidth:', stats.mediaLink.transport.connectionEstimatedBandwidth, 'bps');
console.log('network condition:', stats.mediaLink.transport.networkCondition);
console.log('network condition reason:', stats.mediaLink.transport.networkConditionReason);
}
});
});
}, 1000);
Empfang von Ereignissen in Videoqualität bei den Herausgebern
Neben der Abfrage von Statistiken mit Publisher.getStats()können Sie sich in Echtzeit benachrichtigen lassen, wenn der Herausgeber eine bedeutsame Änderung der Videoqualität feststellt, indem Sie sich bei der videoQualityChanged Veranstaltung:
publisher.on('videoQualityChanged', ({ reason, statsContainer }) => {
console.log('Video quality change reason:', reason);
const { stats } = statsContainer;
if (stats.video && stats.video.layers) {
stats.video.layers.forEach((layer) => {
console.log(
`Resolution: ${layer.width}x${layer.height}, FPS: ${layer.frameRate}`
);
});
}
});
Empfangen von Ereignissen zu Änderungen des Netzwerkzustands auf dem Publisher
Um Ereignisse zur Änderung von Netzwerkbedingungen für den Herausgeber zu empfangen, hören Sie auf die networkConditionChanged Veranstaltung:
publisher.on('networkConditionChanged', ({ reason, statsContainer }) => {
const { stats } = statsContainer;
console.log('Network condition changed.');
console.log(`Network Condition: ${stats.mediaLink.transport.networkCondition}, Reason: ${stats.mediaLink.transport.networkConditionReason}`);
});
Dieses Ereignis wird ausgelöst, wenn eine signifikante Änderung der Netzwerkbedingungen für den Herausgeber festgestellt wird. Die statsContainer Objekt enthält die Medienverbindungsstatistiken für den betroffenen Teilnehmer. Bei weitergeleiteten Sitzungen werden nur die Statistiken für den betroffenen Teilnehmer in das Ereignis aufgenommen.
Abrufen von Statistiken für einen Teilnehmer
Die getStats() Methode eines Subscriber-Objekts liefert Ihnen Informationen über den
Stream des Abonnenten.
Der folgende Code protokolliert jede Sekunde mehrere Metriken für den Stream des Abonnenten:
window.setInterval(() => {
subscriber.getStats((error, stats) => {
if (error) {
console.error('Error getting subscriber stats: ', error.message);
return;
}
const video = stats.video;
if (video) {
console.log('video bitrate:', video.bitrate, 'bps');
console.log('video totalBitrate:', video.totalBitrate, 'bps');
console.log('decoded frame rate:', video.decodedFrameRate, 'fps');
console.log('codec:', video.codec);
console.log('res:', `${video.width}x${video.height}`);
console.log('freezeCount:', video.freezeCount);
console.log('totalFreezesDuration:', video.totalFreezesDuration, 'ms');
console.log('pauseCount:', video.pauseCount);
console.log('totalPausesDuration:', video.totalPausesDuration, 'ms');
}
});
}, 1000);
Empfang von Videoqualitätsereignissen bei den Abonnenten
Abonnenten können auf die videoQualityChanged Ereignis, um benachrichtigt zu werden, wenn signifikante Unterbrechungen oder Änderungen der Videoqualität festgestellt werden.
subscriber.on('videoQualityChanged', ({ reason, stats }) => {
if (reason === 'videoInterruption') {
console.warn('Video playback was interrupted');
if (stats.video.freezeCount > 0) {
console.log(`Freeze count: ${stats.video.freezeCount}`);
}
if (stats.video.pauseCount > 0) {
console.log(`Pause count: ${stats.video.pauseCount}`);
}
}
});
Empfang von Ereignissen zum Netzwerkstatus auf dem Teilnehmergerät
Um Ereignisse zur Änderung der Netzwerkbedingungen für den Teilnehmer zu empfangen, hören Sie auf die networkConditionChanged Veranstaltung:
subscriber.on('networkConditionChanged', ({ reason, stats }) => {
console.log('Network condition changed.');
console.log(`Degradation source: ${stats.mediaLink.networkDegradationSource}`);
if (stats.mediaLink.networkDegradationSource === 'local') {
console.log(`Network Condition: ${stats.mediaLink.transport.networkCondition}, Reason: ${stats.mediaLink.transport.networkConditionReason}`);
} else if (stats.mediaLink.networkDegradationSource === 'remote') {
console.log(`Network Condition: ${stats.mediaLink.remotePublisherTransport.networkCondition}, Reason: ${stats.mediaLink.remotePublisherTransport.networkConditionReason}`);
}
});
Dieses Ereignis wird ausgelöst, wenn für den Teilnehmer oder den entfernten Herausgeber eine signifikante Änderung der Netzbedingungen festgestellt wird. Die stats Objekt enthält die Statistik der Medienverbindung mit lokalen und entfernten Transportmetriken und der Degradationsquelle.
Bekannte Probleme
Die tatsächlichen Werte und Bedingungen, die Qualitätseinschränkungen auslösen, sind implementierungsspezifisch und können zwischen Browsern und Plattformen variieren. Zum Beispiel:
- Videostreams zur Bildschirmfreigabe werden nie ausgelöst
videoQualityChangedVeranstaltung. - Firefox unterstützt nicht
qualityLimitationReasonDaher ist diese Eigenschaft in den Statistiken des Herausgebers nicht enthalten. Auch,videoQualityChangedEreignisse mit Begründungbandwidth,cpuundotherwerden in diesem Browser nicht unterstützt. - Hardware-beschleunigte Videokodierung und spezielle Video-Encoder verhindern, dass macOS
cpuEinschränkungen.
Statistik-Datenstrukturen
In diesem Abschnitt werden die Strukturen und Eigenschaften beschrieben, die von der Web-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.
Verlagsstatistiken (stats)
Liefert Statistiken über einen Verlag.
connectionId- Die eindeutige ID der Client-Verbindung, die mit der id-Eigenschaft der DateiconnectionEigenschaft derconnectionCreatedEreignis, das das Sitzungsobjekt für den entfernten Client ausgelöst hat (nur bei weitergeleiteten Sitzungen verfügbar).subscriberId- Die eindeutige ID des Abonnenten, die mit der id-Eigenschaft der DateiSubscriberObjekt in der Anwendung des abonnierenden Clients (nur in weitergeleiteten Sitzungen verfügbar).
Verlags-Audiostatistik (stats.audio)
Liefert Statistiken über die Audiospur eines Verlags.
bytesSent- Insgesamt gesendete Audio-Bytes.packetsLost- Summe der Audiopakete, die den Teilnehmer oder Media Router nicht erreicht haben.packetsSent- Insgesamt gesendete Audiopakete.timestamp- Unix-Zeitstempel (ms), als die Statistiken erfasst wurden.
Videostatistik des Herausgebers (stats.video)
Diese Felder stellen die aktuelle Videoleistung des Herausgebers dar:
bytesSent- Insgesamt gesendete Video-Bytes.packetsLost- Gesamtzahl der Videopakete, die den Teilnehmer oder Media Router nicht erreicht haben.packetsSent- Gesamtzahl der gesendeten Videopakete.layers- Eine geordnete Liste aktiver Videocodierungsebenen von der höchsten zur niedrigsten Auflösung.
Statistik der Videoebene des Herausgebers (stats.video.layers)
Steht für eine Simulcast- oder SVC-Schicht.
width- Kodierte Breite in Pixel.height- Kodierte Höhe in Pixel.encodedFrameRate- Tatsächliche Kodierbildrate für diese Ebene.bitrate- Nutzdaten-Bitrate (bps).totalBitrate- Bitrate einschließlich RTP-Header und Padding (bps).scalabilityMode- Konfiguration der Skalierbarkeit (z. B. "L1T3" für SVC oder "L3T3" für Simulcast).codec- Für diese Ebene verwendeter Codec.qualityLimitationReason- Gibt an, warum der Encoder die Qualität angepasst hat ("Bandbreite", "CPU", "Sonstiges").
Statistiken zu Medienlinks von Herausgebern (stats.mediaLink.transport)
Die transport Objekt liefert Netzwerkschätzungsmetriken auf Peer-Verbindungsebene, die sich auf den gesamten Audio-Video-Transport und nicht auf einzelne Spuren oder Schichten beziehen.
connectionEstimatedBandwidth- Geschätzte verfügbare Uplink-Bandbreite für die Verbindung (bps).networkCondition- Aktuelle Netzzustandsbewertung ("unknown","critical","warning","fair","good", oder"excellent").networkConditionReason- Hauptgrund für die Beeinträchtigung des Netzzustandes ("none","unknown","bandwidth", oder"packetLoss").
Abonnenten-Videostatistik (stats.video)
Diese Felder beschreiben die Echtzeit-Videoempfangs- und Dekodierleistung des Teilnehmers:
bytesReceived- Insgesamt empfangene Video-Bytes.packetsLost- Gesamtzahl der Videopakete, die den Teilnehmer nicht erreicht haben.packetsReceived- Insgesamt empfangene Videopakete.timestamp- Unix-Zeitstempel (ms), als die Statistiken erfasst wurden.decodedFrameRate- Tatsächliche vom Decoder erzeugte Bildrate (fps).bitrate- Bitrate der Nutzdaten in Bits pro Sekunde.totalBitrate- Bitrate einschließlich RTP-Header und Padding (bps).codec- Für diesen Teilnehmer verwendeter Codec.pauseCount- Numbers of pauses where no frame was rendered for ≥5 seconds.totalPausesDuration- Kumulative Dauer (ms) aller Pausen.freezeCount- Numbers of short freezes (aus der WebRTC-Statistikdefinition).totalFreezesDuration- Kumulative Dauer (ms) aller Einfrierungen.
Teilnehmerseitige Schätzung auf der Absenderseite (stats.senderStats)
Diese Metriken liefern Bandbreitenschätzungen, die für die abgehende Verbindung des Absenders gemeldet werden:
connectionMaxAllocatedBitrate- Geschätzte maximale zugewiesene Bitrate für den Absender (bps).connectionEstimatedBandwidth- Aktuelle geschätzte Uplink-Bandbreite für den Absender (bps).
Statistiken zu den Medienlinks der Abonnenten (stats.mediaLink)
Die mediaLink Objekt liefert Informationen über die Transportebene und den Netzabbau für die Verbindung eines Teilnehmers. Es hat die gleiche Struktur wie das Objekt des Herausgebers mediaLink.transport für den lokalen und den Ferntransport sowie einen Indikator für die Degradationsquelle:
transport- Lokale Transportstatistiken für die Downlink-Verbindung dieses Teilnehmers (gleiche Struktur wie Publisher'sstats.mediaLink.transport). Kann eingeschränkt sein, wenn absenderseitige Statistiken und/oder Audio-Fallback deaktiviert sind.remotePublisherTransport- Transportstatistiken des Fernverlegers für die Uplink-Verbindung (gleiche Struktur wie die des Verlegers)stats.mediaLink.transport). Kann eingeschränkt sein, wenn absenderseitige Statistiken und/oder Audio-Fallback deaktiviert sind.networkDegradationSource- Zeigt an, welche Seite eine eventuelle Beeinträchtigung des Netzes verursacht hat. Mögliche Werte:"none","local","remote", oder"bothOrUnclear". Kann eingeschränkt sein, wenn absenderseitige Statistiken und/oder Audio-Fallback deaktiviert sind.
Überwachung der Gesprächsqualität
Neben den zentralen Statistik-APIs bietet OpenTok.js zusätzliche Funktionen zur Überwachung und Reaktion auf Änderungen der Anrufqualität. Diese Funktionen helfen Applications, die Leistung zu optimieren, indem sie sich an Gerätebeschränkungen und Netzwerkbedingungen anpassen.
Überwachung der CPU-Leistung
Applications können auf verschiedenen mobilen und Desktop-Geräten auf unterschiedlichen Plattformen laufen. Außerdem sind die Hardware-Spezifikationen der Geräte nicht einheitlich. Zum Beispiel können einige mobile Geräte eine bessere CPU-Leistung haben als viele Desktop-Geräte und umgekehrt.
Die große Anzahl möglicher Hardwarekonfigurationen - CPU(s), GPU, RAM, Hardware-Encoder/Decoder usw. - bedeutet, dass eine gewisse Anpassung erforderlich sein kann. Weniger leistungsfähige Geräte können so konfiguriert werden, dass sie CPU-intensive Funktionen deaktivieren, während leistungsfähigere Geräte standardmäßig ein intensiveres Erlebnis bieten können.
Erkennen von Veränderungen der CPU-Leistung
Sie können Änderungen in der CPU-Auslastung des Geräts erkennen, indem Sie die Session cpuPerformanceChanged
Ereignis. Das Ereignis enthält eine cpuPerformanceState die auf einen der folgenden Werte eingestellt ist:
'nominal'- Das Gerät kann zusätzliche Arbeit übernehmen.'fair'- Das Gerät kann weiterhin zusätzliche Arbeit übernehmen, allerdings kann sich die Akkulaufzeit verringern; bei Geräten mit Lüftern können die Lüfter zudem aktiv und hörbar werden.'serious'- Das Gerät ist gestresst, so dass es zu einer Drosselung der Ressourcen (z. B. der CPU) kommen kann.'critical'- Das Gerät ist extrem belastet; wenn es nicht entlastet wird, können Probleme auftreten.
Für weitere Einzelheiten siehe diese W3C-Spezifikation.
Optimierung einer Anwendung auf der Grundlage von Änderungen der CPU-Leistung
Als Reaktion auf dieses Ereignis kann eine Anwendung die Benutzer über den Ressourcen Ressourcenverbrauch informieren oder rechenintensive Prozesse deaktivieren, wie z. B. Videotransformatoren Zur Sitzung cpuPerformanceChanged.
Der folgende Code deaktiviert die Videoaufnahme, wenn die CPU in einen 'critical' Leistungsstatus und
aktiviert sie wieder, sobald der Zustand wieder auf 'fair' oder besser:
let isVideoDisabledByCPU = false;
session.on('cpuPerformanceChanged', (event) => {
if (event.cpuPerformanceState === 'critical') {
// The application should alert the user why their video is being disabled
publisher.publishVideo(false);
isVideoDisabledByCPU = true;
} else if (event.cpuPerformanceState === 'nominal' || event.cpuPerformanceState === 'fair') {
if (isVideoDisabledByCPU) {
publisher.publishVideo(true);
isVideoDisabledByCPU = false;
}
}
})
Mittlere Meinungsbewertung (MOS)
Die Qualität der Erfahrung, die ein Nutzer mit einem Dienst macht, kann wie folgt bewertet werden Mittlere Meinungsbewertung (MOS).
Das Bewertungssystem
MOS wird als positive Zahl ausgedrückt. Der Wert kann zwischen 1 (schlechteste Qualität) und 5 (beste Qualität) liegen:
- 5 (Ausgezeichnet) - Eine hypothetische Obergrenze für die beste Qualität, die ein Nutzer erleben kann.
- 4 (Gut) - Eine eher erreichbare Bewertung. Vonage-Nutzer können dieses Qualitätsniveau erwarten.
- 3 (mittelmäßig) - Die Qualität ist in Ordnung.
- 2 (mangelhaft) - Die Qualität ist inakzeptabel.
- 1 (Schlecht) - Die Qualität ist furchtbar.
Der Algorithmus
Die MOS-Bewertung berücksichtigt mehrere Faktoren, die sich alle auf die Benutzererfahrung auswirken (und diese beeinträchtigen können). Zu diesen Faktoren gehören unter anderem:
Zum Beispiel:
- Paketverlust - verlorene Pakete verschlechtern die Medienqualität
- Bitrate - je höher die Bitrate, desto höher die potenzielle Wiedergabetreue des Mediums
- Netzwerklatenz - Pakete, die zu spät ankommen, können verworfen werden, was zu fehlendem Ton und/oder ruckelndem Video führen kann
Optimierung einer Anwendung auf der Grundlage von Änderungen der Gesprächsqualität
Verwenden Sie den Abonnenten qualityScoreChanged Ereignis, um Änderungen der Audio- und Videoqualität zu überwachen. Die Beobachtung von Änderungen in der Medienqualität ist jedoch nicht ausreichend. Angesichts des Echtzeitcharakters von Call-Applikationen ist es auch notwendig, auf die beobachteten Änderungen zu reagieren, indem Sie Ihre Anwendung so abstimmen, dass sie kontinuierlich die beste Benutzererfahrung bietet.
Eine einfache Heuristik ist unten dargestellt. Eine Anwendung wird auf der Grundlage von Ressourcenbeschränkungen dynamisch optimiert.
// We want to know if the CPU is overloaded. If it is, then we
// can disable certain features so that the best call possible
// can still take place.
let isCpuOverloaded = false;
session.on('cpuPerformanceChanged', (event) => {
isCpuOverloaded = event.cpuPerformanceState === 'critical';
});
// We monitor for changes in call quality. This allows us to
// tune our application, taking into account multiple factors
// (inlined below)
subscriber.on('qualityScoreChanged', (event) => {
const { qualityScore } = event;
const isVideoQualityBad = qualityScore.video <= 2;
if (!isVideoQualityBad && !isCpuOverloaded) {
// Subscribe to the highest quality video since the CPU isn't taxed
// and the quality received is good
subscriber.setPreferredResolution('1280x720');
subscriber.setPreferredFrameRate(30);
}
else if (isVideoQualityBad && !isCpuOverloaded) {
// Even though the CPU isn't taxed, the video quality received is
// bad. This might be due to (hopefully) intermittent network issues, so
// we subscribe to lower quality video.
subscriber.setPreferredResolution('320x180');
subscriber.setPreferredFrameRate(7);
}
else if (isVideoQualityBad && isCpuOverloaded) {
// The video quality received is bad and the CPU is being overloaded.
// Let's disable video for now.
// We can enable video once conditions improve. See statement below.
subscriber.subscribeToVideo(false);
}
else {
// Enable video
subscriber.subscribeToVideo(true);
}
});
Einschätzung der Gesprächsqualität in einem Test vor dem Anruf
Sie können das Vonage Video verwenden Netzwerktestbibliothek für das Web Prüfen Sie, ob der Client die Veröffentlichung von Audio- und Videodaten unterstützt, und melden Sie die geschätzten MOS-Werte für Audio und Video des vom Client veröffentlichten Streams. Diese Bibliothek verwendet die Publisher.getRtcStatsReport() und Subscriber.getStats() Methoden zur Berechnung des MOS-Scores.
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 publishSenderStats Eigenschaft eingestellt auf true im OT.initPublisher anrufen:
const publisher = OT.initPublisher({
publishSenderStats: true
});
Wenn publishSenderStats nicht aktiviert ist, wird kein Absenderstatistikkanal für diesen Verlag veröffentlicht. Der Standardwert ist false.
Empfang von Statistiken auf der Absenderseite
Wenn der Herausgeber die Absenderstatistiken aktiviert hat, erhalten die Abonnenten diese automatisch über Subscriber.getStats() oben beschrieben. Die senderStats Eigenschaft des zurückgegebenen Statistikobjekts liefert zwei Metriken:
connectionMaxAllocatedBitrate- Die maximale Bitrate, die für die Verbindung geschätzt werden kann (bps)connectionEstimatedBandwidth- Die aktuell geschätzte Bandbreite für die Verbindung (bps)
Beachten Sie, dass der erste Aufruf von getStats kann aufgrund von Netzwerklatenzzeiten keine Absenderstatistiken enthalten.
subscriber.getStats((stats) => {
if (stats.senderStats) {
console.log(`Connection max allocated bitrate: ${stats.senderStats.connectionMaxAllocatedBitrate} bps`);
console.log(`Connection current estimated bandwidth: ${stats.senderStats.connectionEstimatedBandwidth} bps`);
}
});
Bekannte Probleme
In einigen Fällen, wenn die Sitzung weitergeleitet wird - oder in bestimmten gerouteten Setups mit nur zwei Teilnehmern - und der Publisher Firefox verwendet, sind aufgrund von Browsereinschränkungen möglicherweise keine absenderseitigen Statistiken verfügbar.
Netzzustand und Ursache der Verschlechterung
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 Medienverbindungsstatistiken enthalten Transportmetriken mit
connectionEstimatedBandwidth,networkConditionundnetworkConditionReason. Die Abonnentenstatistiken geben auch Aufschluss überremotePublisherTransportundnetworkDegradationSource. - 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.on('networkConditionChanged', ({ reason, stats }) => {
console.log('Network condition changed.');
console.log(`Degradation source: ${stats.mediaLink.networkDegradationSource}`);
if (stats.mediaLink.networkDegradationSource === 'local') {
console.log(`Network Condition: ${stats.mediaLink.transport.networkCondition}, Reason: ${stats.mediaLink.transport.networkConditionReason}`);
} else if (stats.mediaLink.networkDegradationSource === 'remote') {
console.log(`Network Condition: ${stats.mediaLink.remotePublisherTransport.networkCondition}, Reason: ${stats.mediaLink.remotePublisherTransport.networkConditionReason}`);
}
});
RTC-Statistikbericht
Um Low-Level-Peer-Verbindungsstatistiken für einen Publisher zu erhalten, verwenden Sie die Publisher.getRtcStatsReport() Methode. Sie gibt ein Promise zurück, das im Erfolgsfall mit einem Array von RTCStatsReport Objekte:
publisher.getRtcStatsReport()
.then(statArrays => statsArray.forEach(console.log))
.catch(console.log);
Um detaillierte Statistiken zur Peer-Verbindung eines Teilnehmers abzurufen, verwenden Sie die Methode `Subscriber.getRtcStatsReport()`. Sie gibt ein Promise zurück, das bei Erfolg mit einem RTCStatsReport Objekt für den abonnierten Stream:
subscriber.getRtcStatsReport()
.then((stats) => stats.forEach(console.log))
.catch(console.log);