Signatur
Beschreibung
Die Eigenschaft bytesReceived eines RTCTransportStats-Objekts enthält die Gesamtzahl der Payload-Bytes, die eine RTCPeerConnection seit dem Aufbau über einen bestimmten Transportweg empfangen hat. Der Wert zählt nur die Nutzdaten. Header, Padding und ICE-Verbindungsprüfungen (STUN) gehören nicht dazu.
Einträge vom Typ RTCTransportStats bekommst du über RTCPeerConnection.getStats(). Im zurückgegebenen RTCStatsReport haben sie type === "transport". Beim Bündeln aller Medien über einen Transport (Standard mit bundlePolicy: "max-bundle") gibt es in der Regel genau einen solchen Eintrag. Er fasst dann Audio, Video und Datenkanäle zusammen.
Der Wert ist ein Zähler, der nur wächst. Für Kennzahlen wie die aktuelle Empfangsbitrate liest du ihn in regelmäßigen Abständen aus. Dann teilst du die Differenz zweier Messungen durch die Differenz ihrer timestamp-Werte. So lassen sich Bandbreiten-Anzeigen, Verbindungsdiagnosen und Qualitätsüberwachung umsetzen.
Rückgabewert
unsigned long long): die Gesamtzahl der auf diesem Transport empfangenen Payload-Bytes. Kann undefined sein, wenn der Browser den Wert nicht liefert.Beispiele
Empfangene Bytes des Transports auslesen
// pc ist eine aufgebaute RTCPeerConnection
const logTransportBytes = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'transport') {
console.log(`Transport ${stats.id}: ${stats.bytesReceived} Bytes empfangen`);
}
});
};
await logTransportBytes(pc);
Empfangsbitrate periodisch berechnen
const monitorBitrate = (pc, intervalMs = 1000) => {
let last = null;
const timer = setInterval(async () => {
const report = await pc.getStats();
const transport = [...report.values()].find((s) => s.type === 'transport');
if (!transport || transport.bytesReceived === undefined) return;
if (last) {
const bytes = transport.bytesReceived - last.bytesReceived;
const seconds = (transport.timestamp - last.timestamp) / 1000;
const kbps = ((bytes * 8) / seconds / 1000).toFixed(1);
console.log(`Empfang: ${kbps} kbit/s`);
}
last = transport;
}, intervalMs);
// Funktion zum Stoppen zurückgeben
return () => clearInterval(timer);
};
const stop = monitorBitrate(pc);
// später: stop();
Gesendete und empfangene Bytes gegenüberstellen
const getTrafficSummary = async (pc) => {
const report = await pc.getStats();
const t = [...report.values()].find((s) => s.type === 'transport');
if (!t) return null;
const toMB = (b) => (b / 1024 / 1024).toFixed(2);
return {
empfangenMB: toMB(t.bytesReceived ?? 0),
gesendetMB: toMB(t.bytesSent ?? 0),
dtlsState: t.dtlsState
};
};
console.log(await getTrafficSummary(pc));
// Wichtig · Fallstricke
- Nur Payload: Header, Padding und STUN-Pakete zählen nicht mit. Der Wert ist deshalb kleiner als der tatsächliche Netzwerkverkehr. Für eine Messung auf Paketebene eignet sich
RTCIceCandidatePairStats.bytesReceiveddes aktiven Kandidatenpaars besser. - Kumulativer Zähler: Für Raten brauchst du immer zwei Messungen und die Differenz ihrer
timestamp-Werte. Ein einzelner Wert sagt nichts über die aktuelle Bandbreite aus. - Kompatibilität: Einträge vom Typ
"transport"werden von Chromium-Browsern und Safari geliefert. Firefox stellt sie nur eingeschränkt oder gar nicht bereit. Prüfe vor dem Rechnen aufundefinedund greife notfalls aufcandidate-pair- oderinbound-rtp-Statistiken zurück. - Mehrere Transporte: Ohne Bundling (
bundlePolicyungleich"max-bundle") kann es mehrere Transport-Einträge geben. Summiere sie dann oder ordne sie überidundtransportIdzu. - Performance:
getStats()ist asynchron und nicht kostenlos. Intervalle unter etwa 500 ms bringen selten Mehrwert.