Signatur
Beschreibung
Die Eigenschaft transportId eines RTCInboundRtpStreamStats-Objekts (Statistik-Typ "inbound-rtp") enthält die id des zugehörigen RTCTransportStats-Eintrags (Typ "transport"). Sie verbindet damit die Empfangsstatistik eines einzelnen RTP-Streams mit dem Transport darunter, also der DTLS/ICE-Verbindung, über die die Pakete tatsächlich ankommen.
Gebraucht wird die Eigenschaft vor allem für Diagnose und Monitoring: Über den Transport-Eintrag gelangt man zum ausgewählten ICE-Kandidatenpaar (selectedCandidatePairId) und von dort zur Umlaufzeit (currentRoundTripTime), zu den lokalen und entfernten Kandidaten sowie zum DTLS-Zustand. So lässt sich zum Beispiel feststellen, ob ein Stream mit Paketverlust über ein TURN-Relay läuft.
Die Auflösung erfolgt immer innerhalb desselben RTCStatsReport: Mit report.get(stats.transportId) holt man das zugehörige Objekt. Mit BUNDLE (heute der Standard) teilen sich alle Streams einer RTCPeerConnection meist denselben Transport, deshalb haben viele inbound-rtp-Einträge dieselbe transportId.
Rückgabewert
id des RTCTransportStats-Objekts im selben RTCStatsReport. Der Wert ist eine undurchsichtige Kennung: Man sollte ihn nicht auswerten oder zerlegen, sondern nur zum Nachschlagen verwenden.Beispiele
Transport eines eingehenden Streams nachschlagen
// pc ist eine verbundene RTCPeerConnection
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'inbound-rtp') {
const transport = report.get(stats.transportId);
console.log(`${stats.kind}-Stream ${stats.ssrc}:`,
'Transport', stats.transportId,
'DTLS-Zustand', transport?.dtlsState);
}
});
Vom Stream zum aktiven Kandidatenpaar (RTT und Relay-Erkennung)
const diagnoseInbound = async (pc) => {
const report = await pc.getStats();
const results = [];
for (const stats of report.values()) {
if (stats.type !== 'inbound-rtp') continue;
const transport = report.get(stats.transportId);
const pair = transport && report.get(transport.selectedCandidatePairId);
const local = pair && report.get(pair.localCandidateId);
results.push({
kind: stats.kind,
packetsLost: stats.packetsLost,
rttMs: pair?.currentRoundTripTime != null
? Math.round(pair.currentRoundTripTime * 1000)
: null,
viaRelay: local?.candidateType === 'relay'
});
}
return results;
};
console.table(await diagnoseInbound(pc));
Streams nach Transport gruppieren
const groupByTransport = async (pc) => {
const report = await pc.getStats();
const groups = new Map();
for (const s of report.values()) {
if (s.type !== 'inbound-rtp') continue;
const list = groups.get(s.transportId) ?? [];
list.push(`${s.kind}:${s.ssrc}`);
groups.set(s.transportId, list);
}
return Object.fromEntries(groups);
};
console.log(await groupByTransport(pc));
// Wichtig · Fallstricke
- Nur innerhalb desselben Reports gültig: Die ID dient zum Nachschlagen im selben
RTCStatsReport. Speichert man Objekte aus einem älteren Report zwischen, sind die Daten veraltet. Deshalb für jede Messung neugetStats()aufrufen. - Auf Undefined prüfen: Vor dem Verbindungsaufbau oder nach
pc.close()kannreport.get(transportId)undefinedliefern. Verwende Optional Chaining (?.). - Format der ID: Das Format ist browserabhängig, etwa
"T01"in Chrome oder eine UUID-artige Zeichenkette in Firefox. Nicht zerlegen und keine Annahmen über das Format treffen. - BUNDLE: Normalerweise teilen sich alle Streams einer Verbindung einen Transport. Mit
bundlePolicy: "max-compat"kann es mehrere Transporte geben. - Kompatibilität: Wird in allen aktuellen Browsern unterstützt. Ältere Implementierungen lieferten Statistiken über veraltete Typen wie
"ssrc"(Chrome, Legacy-Callback-API vongetStats). Dort fehlt die Eigenschaft oder heißt anders. Verwende deshalb immer die Promise-basiertegetStats().