Signatur
Beschreibung
Die Eigenschaft bytesSent des Wörterbuchs RTCTransportStats enthält eine ganze Zahl. Sie gibt an, wie viele Nutzdatenbytes insgesamt über den Transport einer RTCPeerConnection gesendet wurden. Gezählt wird ab dem Aufbau des Transports. Header, Padding und ICE-Verbindungsprüfungen (STUN) zählen nicht dazu.
Ein Statistik-Objekt vom Typ "transport" erhältst du über RTCPeerConnection.getStats(). Das gelieferte RTCStatsReport ist eine Map-ähnliche Sammlung. Darin suchst du die Einträge, bei denen type === "transport" gilt. Weil ein Transport meist alle Medien- und Datenkanäle bündelt, zeigt bytesSent den gesamten ausgehenden Datenverkehr der Verbindung.
Typische Einsatzfälle sind die Messung der Upload-Bandbreite, Diagnose-Dashboards und Verbindungsqualitäts-Anzeigen in Videokonferenz-Apps. Dafür vergleichst du zwei Messungen und teilst die Byte-Differenz durch die Zeitdifferenz aus timestamp.
Rückgabewert
unsigned long long): die Summe aller bisher über diesen Transport gesendeten Nutzdatenbytes. Der Wert kann undefined sein, wenn der Browser die Eigenschaft nicht liefert.Beispiele
Gesendete Bytes des Transports auslesen
// pc ist eine bestehende, verbundene RTCPeerConnection
const logBytesSent = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'transport') {
console.log(`Transport ${stats.id}: ${stats.bytesSent} Bytes gesendet`);
}
});
};
await logBytesSent(pc);
Upload-Bitrate in kbit/s messen
const getTransport = async (pc) => {
const report = await pc.getStats();
return [...report.values()].find((s) => s.type === 'transport');
};
let previous = await getTransport(pc);
const timer = setInterval(async () => {
const current = await getTransport(pc);
if (!current || !previous) return;
const bytes = current.bytesSent - previous.bytesSent;
const seconds = (current.timestamp - previous.timestamp) / 1000;
const kbps = ((bytes * 8) / seconds / 1000).toFixed(1);
console.log(`Upload: ${kbps} kbit/s`);
previous = current;
}, 1000);
// Beim Beenden aufräumen
pc.addEventListener('connectionstatechange', () => {
if (pc.connectionState === 'closed') clearInterval(timer);
});
Gesendete und empfangene Bytes vergleichen
const summary = async (pc) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type !== 'transport') continue;
const mb = (n) => ((n ?? 0) / 1024 / 1024).toFixed(2);
console.log(`Gesendet: ${mb(stats.bytesSent)} MB, empfangen: ${mb(stats.bytesReceived)} MB`);
}
};
await summary(pc);
// Wichtig · Fallstricke
- Kumulativer Zähler:
bytesSentzählt immer weiter hoch. Für eine Bitrate brauchst du die Differenz zweier Messungen, geteilt durch die Differenz dertimestamp-Werte (in Millisekunden). - Nur Nutzdaten: Header von IP, UDP, SRTP und DTLS sowie STUN-Prüfungen zählen nicht mit. Die tatsächlich übertragene Datenmenge auf dem Netzwerk ist deshalb größer.
- Bündelung: Mit
bundlePolicy: "max-bundle"(Standard in modernen Browsern) gibt es meist nur einen Transport. Ohne Bündelung können mehreretransport-Einträge vorkommen. Deren Werte musst du bei Bedarf selbst addieren. - Kompatibilität: Die Unterstützung ist in aktuellen Versionen von Chromium, Firefox und Safari vorhanden. Ältere Browser liefern den Eintrag vom Typ
transportoder die Eigenschaft eventuell nicht. Prüfe den Wert deshalb vorher aufundefined. getStats()ist asynchron und nicht kostenlos. Frage die Statistiken nicht häufiger als etwa einmal pro Sekunde ab.