Signatur
Beschreibung
Die Eigenschaft transportId eines RTCOutboundRtpStreamStats-Objekts (Statistiktyp "outbound-rtp") enthält die id des Statistikobjekts vom Typ "transport" (RTCTransportStats). Dieses Objekt beschreibt den DTLS/ICE-Transport, über den die RTP-Pakete dieses Streams tatsächlich verschickt werden.
Das RTCStatsReport aus RTCPeerConnection.getStats() oder RTCRtpSender.getStats() ist eine Map, deren Schlüssel die Statistik-IDs sind. Mit report.get(stats.transportId) kommt man also direkt vom Stream zum Transport und von dort weiter über selectedCandidatePairId zum aktiven ICE-Kandidatenpaar. So lassen sich zum Beispiel Roundtrip-Zeit, verfügbare Sendebandbreite oder die verwendete Netzwerkverbindung (relay, host, srflx) einem bestimmten Sende-Stream zuordnen.
Die Eigenschaft wird vor allem in Monitoring- und Diagnose-Werkzeugen gebraucht. Beim üblichen bundlePolicy: "max-bundle" teilen sich alle Streams einen einzigen Transport und damit dieselbe transportId. Ohne Bundling kann jeder Medientyp einen eigenen Transport haben.
Rückgabewert
id des zugehörigen RTCTransportStats-Eintrags im selben RTCStatsReport. Der Wert ist nur innerhalb dieser Verbindung aussagekräftig. Sein Format hängt vom Browser ab, z. B. "T01" oder eine UUID.Beispiele
transportId aller ausgehenden Streams auslesen
const logOutboundTransports = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'outbound-rtp') {
console.log(`${stats.kind} (SSRC ${stats.ssrc}) → Transport ${stats.transportId}`);
}
});
};
// pc ist eine bestehende, verbundene RTCPeerConnection
await logOutboundTransports(pc);
Vom Sende-Stream zum aktiven Kandidatenpaar navigieren
const getSenderNetworkInfo = async (sender) => {
const report = await sender.getStats();
const outbound = [...report.values()].find((s) => s.type === 'outbound-rtp');
if (!outbound?.transportId) return null;
const transport = report.get(outbound.transportId);
const pair = transport?.selectedCandidatePairId
? report.get(transport.selectedCandidatePairId)
: null;
const local = pair ? report.get(pair.localCandidateId) : null;
return {
dtlsState: transport?.dtlsState,
rttMs: pair?.currentRoundTripTime != null ? pair.currentRoundTripTime * 1000 : null,
availableOutgoingBitrate: pair?.availableOutgoingBitrate,
candidateType: local?.candidateType
};
};
const [videoSender] = pc.getSenders().filter((s) => s.track?.kind === 'video');
console.log(await getSenderNetworkInfo(videoSender));
Prüfen, ob alle Streams gebündelt über einen Transport laufen
const isBundled = async (pc) => {
const report = await pc.getStats();
const ids = new Set(
[...report.values()]
.filter((s) => s.type === 'outbound-rtp')
.map((s) => s.transportId)
);
return ids.size <= 1;
};
console.log('Gebündelt:', await isBundled(pc));
// Wichtig · Fallstricke
- Nur im selben Report auflösen: Die ID verweist auf einen Eintrag im selben
RTCStatsReport. Eine ID aus einem älteren Report kann in einem neuen Report fehlen, etwa nach einem ICE-Restart oder einer Neuverhandlung. - Kann fehlen: Solange die Verbindung noch nicht aufgebaut ist oder für den Sender kein Transport zugewiesen wurde, ist der Transport-Eintrag womöglich nicht vorhanden. Prüfe deshalb immer, ob
report.get()undefinedliefert. - ID-Format nicht auswerten: Das Format der ID ist nicht standardisiert und unterscheidet sich je nach Browser. Verwende den Wert nur als Schlüssel und lies keine Bedeutung daraus ab.
- Kompatibilität: Wird von allen aktuellen Browsern mit WebRTC-Unterstützung angeboten. Ältere Versionen lieferten Statistiken teils in einem veralteten, callback-basierten Format (Chrome) oder ohne vollständige Verknüpfungen. Prüfe die Eigenschaft deshalb vorher, z. B. mit
'transportId' in stats. - Geteilter Transport: Bei
max-bundlegelten Werte wiebytesSentdes Transports für alle Streams zusammen, nicht für einen einzelnen Stream.