Start · Sprachen · JavaScript · Referenz · RTCInboundRtpStreamStats.transportId

RTCInboundRtpStreamStats.transportId

Eigenschaft

String, der das <code>RTCTransportStats</code>-Objekt des Transports eindeutig identifiziert, über den dieser eingehende RTP-Stream empfangen wird.

seit JavaScript Baseline: Chrome, Edge, Firefox, Safari (neuere Ve Kategorie: webapi

Signatur

RTCInboundRtpStreamStats.transportId

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

Typ
string
Beschreibung
Die 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);
  }
});
video-Stream 123456789: Transport T01 DTLS-Zustand connected audio-Stream 987654321: Transport T01 DTLS-Zustand connected

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));
[{ kind: 'audio', packetsLost: 3, rttMs: 42, viaRelay: false }, ...]

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));
{ T01: ['audio:987654321', 'video:123456789'] }

// 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 neu getStats() aufrufen.
  • Auf Undefined prüfen: Vor dem Verbindungsaufbau oder nach pc.close() kann report.get(transportId) undefined liefern. 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 von getStats). Dort fehlt die Eigenschaft oder heißt anders. Verwende deshalb immer die Promise-basierte getStats().