Start · Sprachen · JavaScript · Referenz · RTCOutboundRtpStreamStats.type

RTCOutboundRtpStreamStats.type

Eigenschaft

Kennzeichnet ein Statistik-Objekt als ausgehenden RTP-Stream; der Wert ist immer der String <code>"outbound-rtp"</code>.

seit JavaScript Baseline: Chrome, Edge, Firefox, Safari (WebRTC St Kategorie: webapi

Signatur

RTCOutboundRtpStreamStats.type

Beschreibung

Die Eigenschaft type des Wörterbuchs RTCOutboundRtpStreamStats ist ein schreibgeschützter String mit dem festen Wert "outbound-rtp". Sie stammt aus dem Basis-Wörterbuch RTCStats. Jeder Eintrag in einem RTCStatsReport hat eine type-Eigenschaft, über die sich die Art der Statistik bestimmen lässt.

Ein RTCStatsReport ist eine Map-ähnliche Sammlung und enthält viele verschiedene Statistiktypen, etwa "inbound-rtp", "candidate-pair", "codec" oder "transport". Mit type === "outbound-rtp" filtert man genau die Einträge heraus, die einen gesendeten RTP-Stream beschreiben. Dazu gehören Kennzahlen wie bytesSent, packetsSent, framesEncoded, qualityLimitationReason oder targetBitrate.

Man braucht diese Eigenschaft vor allem für Monitoring-Dashboards, zur Messung der Senderate oder zur Fehlersuche bei schlechter Upload-Qualität. Pro gesendeter Spur (Audio oder Video) und bei Simulcast pro Ebene (rid) gibt es einen eigenen outbound-rtp-Eintrag.

Rückgabewert

Typ
string
Beschreibung
Immer der String "outbound-rtp", ein Wert der Aufzählung RTCStatsType.

Beispiele

Ausgehende RTP-Statistiken aus einem Report filtern

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

// pc ist eine bestehende, verbundene RTCPeerConnection
await logOutboundStats(pc);
audio: 1520 Pakete, 182400 Bytes gesendet video: 3410 Pakete, 3120550 Bytes gesendet

Senderate (kbit/s) für Video periodisch berechnen

let lastBytes = 0;
let lastTimestamp = 0;

const measureBitrate = async (sender) => {
  const report = await sender.getStats();
  for (const stats of report.values()) {
    if (stats.type !== "outbound-rtp") continue;
    if (lastTimestamp) {
      const bits = (stats.bytesSent - lastBytes) * 8;
      const seconds = (stats.timestamp - lastTimestamp) / 1000;
      console.log(`Bitrate: ${(bits / seconds / 1000).toFixed(1)} kbit/s`);
    }
    lastBytes = stats.bytesSent;
    lastTimestamp = stats.timestamp;
  }
};

const videoSender = pc.getSenders().find((s) => s.track?.kind === "video");
setInterval(() => measureBitrate(videoSender), 1000);
Bitrate: 1248.3 kbit/s

Qualitätsbegrenzung bei Simulcast-Ebenen erkennen

const checkQualityLimits = async (pc) => {
  const report = await pc.getStats();
  const outbound = [...report.values()].filter(
    (s) => s.type === "outbound-rtp" && s.kind === "video"
  );
  for (const layer of outbound) {
    console.log(layer.rid ?? "(ohne rid)", layer.frameWidth, "x", layer.frameHeight, "–", layer.qualityLimitationReason);
  }
};

await checkQualityLimits(pc);
q 320 x 180 – none h 640 x 360 – none f 1280 x 720 – bandwidth

// Wichtig · Fallstricke

  • Nicht mit "remote-outbound-rtp" verwechseln: Dieser Typ beschreibt, was die Gegenseite laut RTCP-Sender-Reports gesendet hat (RTCRemoteOutboundRtpStreamStats). Die Gegenseite eurer eigenen outbound-rtp-Streams ist dagegen "remote-inbound-rtp" (dort stehen z. B. roundTripTime und packetsLost).
  • Die Eigenschaft ist schreibgeschützt und immer vorhanden. Die meisten anderen Felder können dagegen fehlen, etwa bei Audio- im Vergleich zu Videostreams oder je nach Browser. Vor dem Rechnen besser auf undefined prüfen.
  • Ältere Browser (Chrome vor Version 79, frühe Firefox-Versionen) lieferten zum Teil veraltete Felder wie isRemote oder den Legacy-Callback von getStats(). Deshalb immer die Promise-Variante nutzen.
  • Bei Simulcast gibt es mehrere outbound-rtp-Einträge pro Spur. Unterscheiden lassen sie sich über rid bzw. ssrc.
  • Einen outbound-rtp-Eintrag gibt es erst, wenn tatsächlich gesendet wird, also nach erfolgreicher Aushandlung und mit einer aktiven Spur.