Signatur
Beschreibung
RTCStatsReport ist ein schreibgeschütztes, Map-ähnliches Objekt. Es ordnet jeder Statistik-ID (einem String) ein Statistik-Objekt zu, zum Beispiel vom Typ inbound-rtp, outbound-rtp, candidate-pair oder transport. Die Methode has() funktioniert wie Map.prototype.has(): Sie sagt Ihnen, ob es im Bericht einen Eintrag mit genau diesem Schlüssel gibt.
Gebraucht wird has() vor allem dann, wenn Sie Statistiken über Verweise verfolgen. Viele Statistik-Objekte enthalten Felder mit den IDs anderer Einträge, etwa transportId, codecId, localCandidateId oder selectedCandidatePairId. Ob der Zieleintrag im aktuellen Bericht wirklich vorhanden ist, prüfen Sie mit has(), bevor Sie ihn mit get() auslesen.
Auch beim Vergleich zweier Berichte, die zu unterschiedlichen Zeitpunkten erstellt wurden, ist has() nützlich. So finden Sie heraus, ob ein Eintrag schon im vorherigen Bericht stand. Das brauchen Sie etwa, um Bitraten aus der Differenz von bytesReceived und timestamp zu berechnen.
Die IDs werden vom Browser vergeben. Sie sind nicht standardisiert und können sich je nach Browser und Sitzung unterscheiden. Deshalb sollten Sie IDs nie fest in den Code schreiben, sondern immer aus einem Bericht oder aus Verweisfeldern übernehmen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $id Pflicht | string | Die ID des gesuchten Statistik-Objekts. Sie entspricht dem Feld id des Eintrags bzw. einem Verweisfeld wie transportId oder codecId. |
Rückgabewert
true, wenn der Bericht einen Eintrag mit der angegebenen ID enthält, sonst false.Beispiele
Codec-Verweis vor dem Zugriff prüfen
// pc ist eine bestehende RTCPeerConnection mit aktiver Verbindung
const logInboundCodecs = async (pc) => {
const report = await pc.getStats();
report.forEach((stat) => {
if (stat.type !== 'inbound-rtp') return;
if (stat.codecId && report.has(stat.codecId)) {
const codec = report.get(stat.codecId);
console.log(`${stat.kind}: ${codec.mimeType}`);
} else {
console.log(`${stat.kind}: Codec noch unbekannt`);
}
});
};
logInboundCodecs(pc);
Aktives Kandidatenpaar über den Transport ermitteln
const getSelectedPair = async (pc) => {
const report = await pc.getStats();
for (const stat of report.values()) {
if (stat.type === 'transport' && report.has(stat.selectedCandidatePairId)) {
return report.get(stat.selectedCandidatePairId);
}
}
return null;
};
const pair = await getSelectedPair(pc);
console.log(pair ? `RTT: ${pair.currentRoundTripTime} s` : 'Kein aktives Paar');
Bitrate aus zwei Berichten berechnen
let previous = null;
const sampleBitrate = async (pc) => {
const report = await pc.getStats();
report.forEach((stat) => {
if (stat.type !== 'inbound-rtp' || stat.kind !== 'video') return;
// Nur rechnen, wenn der Eintrag schon im letzten Bericht stand
if (previous?.has(stat.id)) {
const old = previous.get(stat.id);
const bits = (stat.bytesReceived - old.bytesReceived) * 8;
const seconds = (stat.timestamp - old.timestamp) / 1000;
console.log(`Video-Bitrate: ${Math.round(bits / seconds / 1000)} kbit/s`);
}
});
previous = report;
};
setInterval(() => sampleBitrate(pc), 1000);
Einfacher Test mit einer unbekannten ID
const pc = new RTCPeerConnection();
const report = await pc.getStats();
console.log(report.has('gibt-es-nicht'));
console.log([...report.keys()].every((id) => report.has(id)));
pc.close();
// Wichtig · Fallstricke
- IDs sind browserspezifisch: Das Format der IDs ist nicht festgelegt. Chrome verwendet zum Beispiel
"IT01V1234", Firefox eher UUID-artige Werte. Schreiben Sie IDs nie fest in den Code. - Momentaufnahme: Ein
RTCStatsReportändert sich nach seiner Erstellung nicht mehr. Obhas()trueliefert, gilt nur für diesen einen Bericht. Wenn Tracks oder Kandidaten hinzukommen oder wegfallen, können neue Berichte andere Einträge enthalten. - Verweisfelder können fehlen: Felder wie
codecIdoderselectedCandidatePairIdsind nicht immer gesetzt, etwa bevor die Verbindung steht.has(undefined)gibt dann einfachfalsezurück und wirft keinen Fehler. - Keine Wertprüfung:
has()prüft nur, ob der Schlüssel existiert. Ob ein bestimmtes Feld im Statistik-Objekt vorhanden ist, müssen Sie selbst prüfen, denn einzelne Metriken werden nicht von allen Browsern gleich unterstützt. - Kompatibilität: Die
Map-ähnliche Schnittstelle, alsohas(),get()undforEach(), wird von allen modernen Browsern unterstützt. Das veraltete Chrome-Format mit Rückruffunktion (getStats(callback)) liefert dagegen keinRTCStatsReport-Objekt mit dieser Methode.