Signatur
Beschreibung
Die Eigenschaft id des Wörterbuchs RTCInboundRtpStreamStats enthält einen String, der das überwachte Objekt – hier einen eingehenden RTP-Stream – eindeutig kennzeichnet. Sie wird von RTCStats geerbt und kommt deshalb in jedem Statistikobjekt vor, das RTCPeerConnection.getStats() liefert.
Der Wert ist zugleich der Schlüssel, unter dem das Objekt in der Map-artigen Struktur RTCStatsReport abgelegt ist. Mit report.get(id) kommt man also direkt an einen bestimmten Eintrag. Andere Statistikobjekte verweisen über Felder wie codecId, transportId oder remoteId auf solche IDs. So lassen sich die Einträge miteinander verknüpfen.
Wichtig für die Praxis: Der Browser vergibt die id für dasselbe überwachte Objekt bei allen getStats()-Aufrufen gleich. Deshalb eignet sie sich gut, um Messwerte über die Zeit zu vergleichen, etwa um aus bytesReceived die aktuelle Bitrate zu berechnen.
Rückgabewert
"IT01V1234567" (Chrome) oder "{a1b2c3d4-...}" (Firefox). Das Format ist nicht festgelegt.Beispiele
IDs aller eingehenden RTP-Streams auflisten
// pc ist eine verbundene RTCPeerConnection
const listInboundIds = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'inbound-rtp') {
console.log(`${stats.kind}: ${stats.id}`);
}
});
};
await listInboundIds(pc);
Bitrate über die stabile id berechnen
const previous = new Map();
const measureBitrate = async (pc) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type !== 'inbound-rtp') continue;
const prev = previous.get(stats.id);
if (prev) {
const bytes = stats.bytesReceived - prev.bytesReceived;
const ms = stats.timestamp - prev.timestamp;
const kbps = Math.round((bytes * 8) / ms);
console.log(`${stats.kind} (${stats.id}): ${kbps} kbit/s`);
}
previous.set(stats.id, stats);
}
};
setInterval(() => measureBitrate(pc), 1000);
Verknüpften Codec über die id nachschlagen
const report = await pc.getStats();
const inbound = [...report.values()].find(
(s) => s.type === 'inbound-rtp' && s.kind === 'video'
);
// report.get() erwartet genau eine solche id
const codec = inbound?.codecId ? report.get(inbound.codecId) : undefined;
console.log(inbound.id, '→', codec?.mimeType);
console.log(report.get(inbound.id) === inbound);
// Wichtig · Fallstricke
- Format nicht festgelegt: Das Format der
idhängt vom Browser ab und kann sich zwischen Versionen ändern. Die ID also nicht zerlegen und nicht darauf setzen, dass bestimmte Präfixe wieITvorkommen. Zum Filtern immertype === 'inbound-rtp'verwenden. - Nur für eine Verbindung eindeutig: Die ID gilt nur innerhalb derselben
RTCPeerConnection. Bei mehreren Verbindungen können gleiche IDs vorkommen. Wer Daten zusammenführt, sollte deshalb die Verbindung mit in den Schlüssel aufnehmen. - Wird ein Stream beendet und neu ausgehandelt, etwa nach einer Neuverhandlung mit neuer SSRC, kann eine neue
identstehen. Alte Einträge in eigenen Zwischenspeichern sollten entfernt werden. - Die Eigenschaft kann nur gelesen werden. Sie hat keinen Bezug zu
MediaStreamTrack.idoderMediaStream.id. Dafür gibt es in manchen BrowserntrackIdentifier. - Kompatibilität: Alle modernen Browser unterstützen die Eigenschaft. Welche anderen Felder in
RTCInboundRtpStreamStatsvorhanden sind, unterscheidet sich teilweise.