Start · Sprachen · JavaScript · Referenz · RTCOutboundRtpStreamStats.mid

RTCOutboundRtpStreamStats.mid

Eigenschaft

String mit der Medien-ID (MID), die lokaler und entfernter Peer für den <code>RTCRtpTransceiver</code> dieses ausgehenden RTP-Streams ausgehandelt haben.

seit JavaScript Baseline: Chrome 86+, Firefox 113+, Safari 15.4+ ( Kategorie: webapi

Signatur

RTCOutboundRtpStreamStats.mid

Beschreibung

Die schreibgeschützte Eigenschaft mid eines RTCOutboundRtpStreamStats-Objekts (Statistik-Typ "outbound-rtp") enthält die Media-Stream-Identification: den Wert des SDP-Attributs a=mid: der Medienbeschreibung (m=-Zeile), zu der der ausgehende Stream gehört. Es ist derselbe Wert, den auch RTCRtpTransceiver.mid liefert.

Nützlich ist mid vor allem, wenn du Statistikeinträge einem bestimmten Transceiver zuordnen willst. Das gilt besonders dann, wenn über eine RTCPeerConnection mehrere Audio- und Video-Spuren laufen oder Simulcast aktiv ist. Bei Simulcast gibt es pro Layer (rid) einen eigenen outbound-rtp-Eintrag, und alle haben dieselbe mid.

Die MID steht erst nach abgeschlossener Aushandlung fest, also sobald setLocalDescription() bzw. setRemoteDescription() gelaufen ist. Wurde der Transceiver noch nicht ausgehandelt oder ist er gestoppt, fehlt die Eigenschaft im Statistikobjekt.

Rückgabewert

Typ
string | undefined
Beschreibung
Die ausgehandelte Medien-ID als String, z. B. "0" oder "video". Ist noch nichts ausgehandelt, fehlt die Eigenschaft (undefined).

Beispiele

MID aller ausgehenden Streams auflisten

const logOutboundMids = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === 'outbound-rtp') {
      console.log(`${stats.kind}: mid=${stats.mid}, ssrc=${stats.ssrc}`);
    }
  });
};

// Nach erfolgreicher Aushandlung aufrufen
await logOutboundMids(peerConnection);
audio: mid=0, ssrc=1234567890 video: mid=1, ssrc=987654321

Statistiken einem Transceiver zuordnen

const statsForTransceiver = async (pc, transceiver) => {
  const report = await pc.getStats();
  return [...report.values()].filter(
    (s) => s.type === 'outbound-rtp' && s.mid === transceiver.mid
  );
};

const [videoTransceiver] = peerConnection
  .getTransceivers()
  .filter((t) => t.sender.track?.kind === 'video');

const entries = await statsForTransceiver(peerConnection, videoTransceiver);
entries.forEach((s) =>
  console.log(`rid=${s.rid ?? '-'} bytesSent=${s.bytesSent}`)
);
rid=q bytesSent=102400 rid=h bytesSent=409600 rid=f bytesSent=1638400

Gesendete Bytes pro MID summieren (Simulcast)

const bytesPerMid = async (pc) => {
  const totals = new Map();
  const report = await pc.getStats();
  for (const s of report.values()) {
    if (s.type !== 'outbound-rtp' || s.mid === undefined) continue;
    totals.set(s.mid, (totals.get(s.mid) ?? 0) + s.bytesSent);
  }
  return Object.fromEntries(totals);
};

console.log(await bytesPerMid(peerConnection));
{ '0': 48213, '1': 2150400 }

// Wichtig · Fallstricke

  • Erst nach der Aushandlung verfügbar: Vor setLocalDescription()/setRemoteDescription() fehlt mid. Prüfe den Wert deshalb immer auf undefined.
  • Nicht eindeutig pro Eintrag: Bei Simulcast haben mehrere outbound-rtp-Einträge dieselbe mid. Eindeutig ist ein Eintrag erst über id oder über die Kombination aus mid und rid.
  • Kein fester Wert: Die MID ist ein beliebiger String, der im SDP-Angebot festgelegt wird (oft "0", "1" …). Verlass dich nicht auf eine bestimmte Nummerierung und zieh daraus keine Schlüsse auf die Medienart. Dafür gibt es kind.
  • Browser-Unterstützung: Chromium-Browser liefern mid schon länger. In Firefox und Safari ist die Eigenschaft erst in neueren Versionen verfügbar. Ältere Browser lassen sie weg, dann ordnest du Einträge ersatzweise über ssrc oder mediaSourceId zu.