Start · Sprachen · JavaScript · Referenz · RTCRemoteOutboundRtpStreamStats.transportId

RTCRemoteOutboundRtpStreamStats.transportId

Eigenschaft

String-ID, die auf das <code>RTCTransportStats</code>-Objekt des Transports verweist, über den dieser entfernte ausgehende RTP-Stream läuft.

seit JavaScript Chrome 106+, Firefox 68+, Safari 14.1+ (unterschie Kategorie: webapi

Signatur

RTCRemoteOutboundRtpStreamStats.transportId

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

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

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));
{ kind: 'audio', rtt: 0.042, local: '192.168.1.10:54321 (host)', remote: '203.0.113.5:3478 (srflx)' }

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));
{ T01: ['audio (SSRC 1234567)', 'video (SSRC 7654321)'] }

// Wichtig · Fallstricke

  • Die ID gilt nur innerhalb desselben RTCStatsReport. Speichere die Transport-Daten nicht über mehrere getStats()-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 transportId vorhanden ist und ob report.get() ein Ergebnis liefert (optionale Verkettung ?.).