Signatur
Beschreibung
Die Eigenschaft transportId eines RTCRemoteOutboundRtpStreamStats-Eintrags (Typ "remote-outbound-rtp") enthält einen String. Er identifiziert eindeutig das RTCTransportStats-Objekt (Typ "transport") im selben RTCStatsReport. Dieses Objekt beschreibt den Transport, über den der RTP-Stream übertragen wird, also in der Regel eine DTLS/ICE-Verbindung.
Die Remote-Outbound-Statistiken bilden ab, was die Gegenstelle über ihren sendenden Stream per RTCP-Sender-Reports meldet. Mit transportId ordnest du diese Daten dem lokalen Transport zu. Darüber kommst du an Informationen wie den DTLS-Zustand, das ausgewählte ICE-Kandidatenpaar (selectedCandidatePairId) oder die insgesamt übertragenen Bytes.
In der Praxis dient die Eigenschaft zum Verknüpfen von Statistiken. Der Wert eignet sich als Schlüssel für report.get(id). So baust du Diagnose-Dashboards, die von einem Medien-Stream bis zum genutzten Netzwerkpfad (Kandidatenpaar, lokale und entfernte Kandidaten) durchnavigieren.
Rückgabewert
id des zugehörigen RTCTransportStats-Objekts im selben RTCStatsReport. Nur lesbar.Beispiele
Transport zu Remote-Outbound-Stats ermitteln
// pc ist eine verbundene RTCPeerConnection
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'remote-outbound-rtp') {
const transport = report.get(stats.transportId);
console.log(`${stats.kind}: Transport ${stats.transportId}`,
transport?.dtlsState);
}
});
Vom Stream zum genutzten ICE-Kandidatenpaar
const getNetworkPath = async (pc) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type !== 'remote-outbound-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);
return {
kind: stats.kind,
rtt: pair?.currentRoundTripTime,
local: local && `${local.address}:${local.port} (${local.candidateType})`,
remote: remote && `${remote.address}:${remote.port} (${remote.candidateType})`
};
}
return null;
};
console.log(await getNetworkPath(pc));
Streams nach Transport gruppieren
const report = await pc.getStats();
const byTransport = new Map();
for (const s of report.values()) {
if (s.type === 'remote-outbound-rtp' && s.transportId) {
const list = byTransport.get(s.transportId) ?? [];
list.push(`${s.kind} (SSRC ${s.ssrc})`);
byTransport.set(s.transportId, list);
}
}
console.log(Object.fromEntries(byTransport));
// Wichtig · Fallstricke
- Die ID gilt nur innerhalb desselben
RTCStatsReport. Speichere die Transport-Daten nicht über mehreregetStats()-Aufrufe hinweg in der Annahme, das Objekt sei unverändert. Lies sie bei jedem Report neu aus. - Die ID-Strings (etwa
"T01") sind browserspezifisch und undurchsichtig. Werte ihr Format nicht aus. remote-outbound-rtp-Einträge entstehen erst, wenn RTCP-Sender-Reports der Gegenstelle eingegangen sind. Direkt nach dem Verbindungsaufbau können sie fehlen.- Bei aktivem BUNDLE (Standard) verweisen alle Streams auf denselben Transport.
- Die Browser unterstützen die Remote-Stats unterschiedlich vollständig. Prüfe daher, ob
transportIdvorhanden ist und obreport.get()ein Ergebnis liefert (optionale Verkettung?.).