Start · Sprachen · JavaScript · Referenz · RTCOutboundRtpStreamStats.remoteId

RTCOutboundRtpStreamStats.remoteId

Eigenschaft

Liefert die <code>id</code> des <code>RTCRemoteInboundRtpStreamStats</code>-Objekts, das die Empfangsstatistik des entfernten Peers für dieselbe SSRC beschreibt.

seit JavaScript Baseline 2023 (Chrome, Edge, Firefox, Safari) Kategorie: webapi

Signatur

RTCOutboundRtpStreamStats.remoteId

Beschreibung

Die Eigenschaft remoteId eines RTCOutboundRtpStreamStats-Eintrags (Typ "outbound-rtp") ist ein String. Sie verweist auf einen anderen Eintrag im selben RTCStatsReport, nämlich auf das Objekt vom Typ "remote-inbound-rtp". Dieses Objekt beschreibt, wie der RTCRtpReceiver des entfernten Peers die Medien empfängt, die dein lokaler Sender für diese SSRC schickt.

Die Daten auf der Gegenseite stammen aus RTCP-Receiver-Reports. Dazu gehören etwa packetsLost, jitter, fractionLost und roundTripTime. Mit remoteId verbindest du die lokale Sendestatistik (z. B. bytesSent, packetsSent) direkt mit der Rückmeldung der Gegenseite. So kannst du die Verbindungsqualität aus Sicht des Empfängers auswerten, ohne einen eigenen Signalisierungskanal zu brauchen.

Typische Einsatzgebiete sind Dashboards für die Anrufqualität, eine adaptive Bitratensteuerung und das Erkennen von Paketverlusten auf der Senderseite. Den verknüpften Eintrag holst du mit report.get(outbound.remoteId).

Rückgabewert

Typ
string | undefined
Beschreibung
Die id des zugehörigen RTCRemoteInboundRtpStreamStats-Eintrags im selben RTCStatsReport. Der Wert ist undefined, solange noch kein RTCP-Receiver-Report vom entfernten Peer eingegangen ist.

Beispiele

Remote-Inbound-Statistik zu einem Sender auslesen

// pc ist eine bestehende, verbundene RTCPeerConnection
const logRemoteQuality = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type !== 'outbound-rtp') return;
    const remote = stats.remoteId ? report.get(stats.remoteId) : undefined;
    if (!remote) {
      console.log(`${stats.kind}: noch kein RTCP-Report vorhanden`);
      return;
    }
    console.log(`${stats.kind}: verloren=${remote.packetsLost}, RTT=${remote.roundTripTime}s`);
  });
};

logRemoteQuality(pc);
video: verloren=3, RTT=0.042s audio: verloren=0, RTT=0.041s

Verlustrate aus Sicht des Empfängers berechnen (pro Sender)

const getLossRate = async (sender) => {
  // getStats() am RTCRtpSender liefert nur die Statistik dieses Senders
  const report = await sender.getStats();
  const outbound = [...report.values()].find((s) => s.type === 'outbound-rtp');
  const remote = outbound?.remoteId && report.get(outbound.remoteId);
  if (!remote) return null;
  const total = outbound.packetsSent;
  return total > 0 ? remote.packetsLost / total : 0;
};

const [videoSender] = pc.getSenders().filter((s) => s.track?.kind === 'video');
const rate = await getLossRate(videoSender);
console.log(rate === null ? 'Keine Daten' : `Verlust: ${(rate * 100).toFixed(2)} %`);
Verlust: 0.35 %

Bitrate drosseln, wenn die Gegenseite hohen Verlust meldet

const adaptBitrate = async (sender) => {
  const report = await sender.getStats();
  for (const stats of report.values()) {
    if (stats.type !== 'outbound-rtp' || !stats.remoteId) continue;
    const remote = report.get(stats.remoteId);
    if (remote?.fractionLost > 0.05) {
      const params = sender.getParameters();
      params.encodings.forEach((enc) => { enc.maxBitrate = 500_000; });
      await sender.setParameters(params);
      console.log('Bitrate auf 500 kbit/s begrenzt');
    }
  }
};

setInterval(() => pc.getSenders().forEach(adaptBitrate), 2000);
Bitrate auf 500 kbit/s begrenzt

// Wichtig · Fallstricke

  • Nicht sofort verfügbar: remoteId (und der verknüpfte Eintrag) erscheint erst, wenn der erste RTCP-Receiver-Report angekommen ist. Das dauert in der Regel einige Sekunden. Prüfe deshalb immer auf undefined.
  • Nur innerhalb eines Reports gültig: Die ID löst du ausschließlich im selben RTCStatsReport auf. IDs sind zwar meist über mehrere Abfragen stabil, verlasse dich aber nicht auf eine Zuordnung über Reports hinweg.
  • Nicht mit RTCInboundRtpStreamStats.remoteId verwechseln: Beim eingehenden Stream verweist remoteId auf "remote-outbound-rtp". Hier ist das Gegenstück dagegen "remote-inbound-rtp", und dessen localId zeigt zurück auf den Outbound-Eintrag.
  • Verzögerte Werte: Die Remote-Werte stammen aus RTCP und sind daher weniger aktuell als die lokalen Zähler. Achte auf timestamp, wenn du Differenzen berechnest.
  • Kompatibilität: Wird in aktuellen Versionen von Chrome, Edge, Firefox und Safari unterstützt. Ältere Browser nutzten stattdessen veraltete Statistiktypen (z. B. ssrc in Chrome) oder boten die Verknüpfung gar nicht an.