Signatur
Beschreibung
Die Eigenschaft transportId eines RTCRemoteInboundRtpStreamStats-Objekts (Statistiktyp "remote-inbound-rtp") enthält die id des RTCTransportStats-Eintrags. Dieser beschreibt den Transport (in der Regel eine DTLS/ICE-Verbindung), über den der zugehörige RTP-Stream übertragen wird.
remote-inbound-rtp-Statistiken geben an, was die Gegenseite über den Empfang deiner gesendeten Medien meldet, also Paketverlust, Jitter und Round-Trip-Time aus RTCP-Receiver-Reports. Über transportId ordnest du diese Werte der konkreten Verbindung zu. So erfährst du zum Beispiel, welches ICE-Kandidatenpaar gerade aktiv ist (selectedCandidatePairId), welche DTLS-Version und welche Cipher-Suite genutzt werden und wie viele Bytes insgesamt über den Transport gelaufen sind.
Die ID ist nur innerhalb desselben RTCStatsReport gültig. Du löst sie mit report.get(stats.transportId) auf. Bei BUNDLE, dem Standard in modernen Browsern, teilen sich alle Streams einer Verbindung meist denselben Transport und haben deshalb dieselbe transportId.
Rückgabewert
id des zugehörigen RTCTransportStats-Objekts im selben Statistikbericht. Es handelt sich um einen browserspezifischen, undurchsichtigen Bezeichner, z. B. "T01".Beispiele
Transport zu einem remote-inbound-rtp-Stream auflösen
// pc ist eine bereits verbundene RTCPeerConnection
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type !== 'remote-inbound-rtp') return;
const transport = report.get(stats.transportId);
console.log(`${stats.kind}: RTT ${stats.roundTripTime ?? '–'} s`);
console.log('Transport:', transport?.id, 'DTLS:', transport?.dtlsState);
});
Aktives ICE-Kandidatenpaar zum gesendeten Stream ermitteln
const getActivePath = async (pc) => {
const report = await pc.getStats();
const result = [];
for (const stats of report.values()) {
if (stats.type !== 'remote-inbound-rtp') continue;
const transport = report.get(stats.transportId);
const pair = transport && report.get(transport.selectedCandidatePairId);
const local = pair && report.get(pair.localCandidateId);
const remote = pair && report.get(pair.remoteCandidateId);
result.push({
kind: stats.kind,
packetsLost: stats.packetsLost,
local: local ? `${local.address}:${local.port} (${local.candidateType})` : null,
remote: remote ? `${remote.address}:${remote.port} (${remote.candidateType})` : null,
});
}
return result;
};
console.table(await getActivePath(pc));
Streams nach Transport gruppieren (BUNDLE prüfen)
const report = await pc.getStats();
const byTransport = new Map();
for (const s of report.values()) {
if (s.type === 'remote-inbound-rtp') {
const list = byTransport.get(s.transportId) ?? [];
list.push(s.kind);
byTransport.set(s.transportId, list);
}
}
console.log(Object.fromEntries(byTransport));
// Wichtig · Fallstricke
- Nur innerhalb eines Berichts gültig: IDs können sich zwischen zwei
getStats()-Aufrufen ändern, etwa nach einem ICE-Restart oder einer Neuverhandlung. Speichere sie also nicht dauerhaft, sondern löse sie jedes Mal im aktuellen Bericht auf. remote-inbound-rtp-Einträge erscheinen erst, wenn der erste RTCP-Receiver-Report der Gegenseite angekommen ist. Direkt nach dem Verbindungsaufbau fehlen sie deshalb oft.report.get(transportId)kannundefinedliefern, zum Beispiel wenn der Transport schon geschlossen ist. Nutze optionales Verketten (?.).- Den Wert nicht parsen: Das Format der ID ist nicht standardisiert und unterscheidet sich zwischen Browsern.
- Kompatibilität: Chromium, Firefox und Safari unterstützen die Eigenschaft. Ältere Versionen liefern teilweise nicht alle Felder des verknüpften
RTCTransportStats, zum BeispielselectedCandidatePairId.