Start · Sprachen · JavaScript · Referenz · RTCRemoteOutboundRtpStreamStats.type

RTCRemoteOutboundRtpStreamStats.type

Eigenschaft

String-Eigenschaft, die in einem WebRTC-Statistikbericht immer <code>"remote-outbound-rtp"</code> enthält und den Eintrag als Sendestatistik der Gegenseite kennzeichnet.

seit JavaScript Baseline: Chrome 88+, Firefox 68+, Safari 14.1+ (E Kategorie: webapi

Signatur

RTCRemoteOutboundRtpStreamStats.type

Beschreibung

Die Eigenschaft type eines RTCRemoteOutboundRtpStreamStats-Objekts hat immer den Wert "remote-outbound-rtp". Ein solcher Eintrag beschreibt einen RTP-Stream, den die Gegenseite sendet und der lokal empfangen wird. Die Werte stammen aus den RTCP-Sender-Reports (SR), die die Gegenstelle schickt. Aus Sicht des Remote-Peers ist das ein ausgehender Stream.

Gibt man RTCPeerConnection.getStats(), RTCRtpReceiver.getStats() oder RTCRtpSender.getStats() auf, erhält man einen RTCStatsReport. Das ist eine Map-ähnliche Sammlung aus Statistikobjekten ganz unterschiedlicher Art. Über type findet man die gewünschten Einträge und kann danach typsicher auf die passenden Felder zugreifen, zum Beispiel remoteTimestamp, reportsSent, roundTripTimeMeasurements, packetsSent oder bytesSent.

Jeder remote-outbound-rtp-Eintrag verweist über localId auf den passenden inbound-rtp-Eintrag. So lassen sich lokal empfangene Pakete mit den Paketen vergleichen, die laut Gegenseite verschickt wurden. Auf diese Weise erkennt man zum Beispiel Paketverluste oder berechnet die Round-Trip-Time aus Sicht des Senders.

Rückgabewert

Typ
string
Beschreibung
Immer der Literalwert "remote-outbound-rtp" (ein Wert des Enums RTCStatsType).

Beispiele

Remote-Outbound-Statistiken aus dem Bericht filtern

const logRemoteOutbound = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === "remote-outbound-rtp") {
      console.log(`${stats.kind}: ${stats.packetsSent} Pakete, ${stats.bytesSent} Bytes laut Gegenseite gesendet`);
    }
  });
};

// pc ist eine bestehende, verbundene RTCPeerConnection
await logRemoteOutbound(pc);
audio: 1520 Pakete, 182400 Bytes laut Gegenseite gesendet video: 4310 Pakete, 3956210 Bytes laut Gegenseite gesendet

Paketverlust per localId mit inbound-rtp abgleichen

const estimateLoss = async (pc) => {
  const report = await pc.getStats();
  const result = [];
  for (const stats of report.values()) {
    if (stats.type !== "remote-outbound-rtp") continue;
    const inbound = report.get(stats.localId); // zugehöriger inbound-rtp-Eintrag
    if (!inbound) continue;
    const lost = stats.packetsSent - inbound.packetsReceived;
    result.push({ kind: stats.kind, lost, ratio: (lost / stats.packetsSent).toFixed(3) });
  }
  return result;
};

console.table(await estimateLoss(pc));
[{ kind: "video", lost: 12, ratio: "0.003" }]

Nur für einen bestimmten Empfänger abfragen

const [receiver] = pc.getReceivers();
const report = await receiver.getStats();
const remoteOut = [...report.values()].find((s) => s.type === "remote-outbound-rtp");

if (remoteOut) {
  console.log("Typ:", remoteOut.type);
  console.log("Sender-Reports erhalten:", remoteOut.reportsSent);
} else {
  console.log("Noch kein RTCP-Sender-Report empfangen");
}
Typ: remote-outbound-rtp Sender-Reports erhalten: 17

// Wichtig · Fallstricke

  • Verzögert verfügbar: Ein remote-outbound-rtp-Eintrag erscheint erst, wenn der erste RTCP-Sender-Report der Gegenseite angekommen ist. Direkt nach dem Verbindungsaufbau kann er noch fehlen. Prüfe deshalb immer, ob er vorhanden ist.
  • Nicht verwechseln: "remote-outbound-rtp" (die Gegenseite sendet, du empfängst) ist nicht dasselbe wie "remote-inbound-rtp" (die Gegenseite empfängt deinen Stream) und auch nicht dasselbe wie die lokalen Typen "inbound-rtp" und "outbound-rtp".
  • Zeitstempel: remoteTimestamp bezieht sich auf die Uhr der Gegenseite. timestamp bezieht sich dagegen auf die lokale Uhr. Die beiden Werte darf man nicht direkt miteinander vergleichen.
  • Kompatibilität: Wird von allen aktuellen Browsern unterstützt. Ältere Chrome-Versionen vor 88 liefern diesen Typ nicht. Das veraltete, callback-basierte getStats() kennt ihn ebenfalls nicht. Verwende deshalb immer die Promise-Variante.
  • Die Eigenschaft ist nur lesbar. Der Wert wird immer mit === gegen den String verglichen. Einen Konstruktor oder eine globale Konstante dafür gibt es nicht.