Start · Sprachen · JavaScript · Referenz · RTCOutboundRtpStreamStats.rid

RTCOutboundRtpStreamStats.rid

Eigenschaft

String mit der RTP-Stream-ID (RID), die einen ausgehenden Simulcast-Layer eindeutig kennzeichnet. Fehlt, wenn keine RID festgelegt ist.

seit JavaScript Chrome 80+, Firefox 69+, Safari 14.1+ (Baseline 20 Kategorie: webapi

Signatur

RTCOutboundRtpStreamStats.rid

Beschreibung

Die schreibgeschützte Eigenschaft rid eines RTCOutboundRtpStreamStats-Objekts enthält die RTP Stream ID (RID) des ausgehenden RTP-Streams. Die RID wird über die RTP-Header-Erweiterung urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id übertragen. Festgelegt wird sie beim Senden, meist über sendEncodings in RTCPeerConnection.addTransceiver().

Wirklich gebraucht wird die Eigenschaft vor allem bei Simulcast. Dabei schickt ein einzelner RTCRtpSender mehrere Kodierungen desselben Videos mit unterschiedlicher Auflösung oder Bitrate, zum Beispiel "q", "h" und "f". Jede Kodierung erscheint im Statistikbericht als eigener outbound-rtp-Eintrag. Mit rid ordnest du diese Einträge der jeweiligen Kodierung aus RTCRtpSender.getParameters().encodings zu.

Die Eigenschaft ist nur vorhanden, wenn für die Kodierung eine RID gesetzt wurde. Ohne Simulcast fehlt sie normalerweise ganz, der Wert ist dann undefined.

Rückgabewert

Typ
string | undefined
Beschreibung
Die RID der Kodierung, z. B. "h". undefined, wenn keine RID festgelegt ist.

Beispiele

Simulcast einrichten und RIDs in den Statistiken auslesen

const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const [track] = stream.getVideoTracks();

const transceiver = pc.addTransceiver(track, {
  direction: 'sendonly',
  sendEncodings: [
    { rid: 'q', scaleResolutionDownBy: 4 },
    { rid: 'h', scaleResolutionDownBy: 2 },
    { rid: 'f' }
  ]
});

// ... Signalisierung (Offer/Answer) mit der Gegenstelle ...

const report = await transceiver.sender.getStats();
report.forEach((stats) => {
  if (stats.type === 'outbound-rtp') {
    console.log(`RID ${stats.rid}: ${stats.frameWidth}x${stats.frameHeight}`);
  }
});
RID q: 320x180 RID h: 640x360 RID f: 1280x720

Bitrate pro Simulcast-Layer überwachen

const previous = new Map();

const logBitrates = async (sender) => {
  const report = await sender.getStats();
  for (const stats of report.values()) {
    if (stats.type !== 'outbound-rtp' || stats.kind !== 'video') continue;
    const key = stats.rid ?? 'default';
    const prev = previous.get(key);
    if (prev) {
      const bits = (stats.bytesSent - prev.bytesSent) * 8;
      const seconds = (stats.timestamp - prev.timestamp) / 1000;
      console.log(`${key}: ${Math.round(bits / seconds / 1000)} kbit/s`);
    }
    previous.set(key, stats);
  }
};

// const sender = pc.getSenders().find((s) => s.track?.kind === 'video');
// setInterval(() => logBitrates(sender), 1000);
q: 148 kbit/s h: 492 kbit/s f: 1510 kbit/s

Statistik-Eintrag der passenden Kodierung zuordnen

const findStatsForEncoding = async (sender, rid) => {
  const report = await sender.getStats();
  return [...report.values()].find(
    (s) => s.type === 'outbound-rtp' && s.rid === rid
  );
};

// const { encodings } = sender.getParameters();
// for (const enc of encodings) {
//   const stats = await findStatsForEncoding(sender, enc.rid);
//   console.log(enc.rid, enc.active, stats?.framesPerSecond);
// }
f true 30

// Wichtig · Fallstricke

  • Ohne Simulcast fehlt rid meistens. Frag deshalb mit stats.rid ?? 'default' oder Optional Chaining ab und verlass dich nicht darauf, dass ein String kommt.
  • Nach RFC 8851 darf eine RID nur alphanumerische Zeichen enthalten und höchstens 255 Zeichen lang sein. Ungültige Werte in sendEncodings führen zu einem TypeError.
  • Die RID gilt nur innerhalb eines Transceivers. Mehrere Sender können dieselbe RID verwenden. Für eine eindeutige Zuordnung nimmst du deshalb zusätzlich id, ssrc oder mid des Statistik-Eintrags.
  • Bei inaktiven Layern (active: false) oder bevor die Verbindung ausgehandelt ist, können Einträge fehlen oder veraltete Zähler haben.
  • Unterstützung: Chrome/Edge, Firefox und Safari (ab 14.1) liefern die Eigenschaft. In älteren Browsern fehlt sie teilweise, auch wenn Simulcast aktiv ist.