Start · Sprachen · JavaScript · Referenz · RTCOutboundRtpStreamStats.mediaSourceId

RTCOutboundRtpStreamStats.mediaSourceId

Eigenschaft

Liefert die <code>id</code> des <code>RTCAudioSourceStats</code>- bzw. <code>RTCVideoSourceStats</code>-Objekts des Tracks, der gerade an den Sender dieses ausgehenden RTP-Streams angehängt ist.

seit JavaScript Chrome 80+, Firefox 115+, Safari 14.1+ Kategorie: webapi

Signatur

RTCOutboundRtpStreamStats.mediaSourceId

Beschreibung

Die Eigenschaft mediaSourceId eines RTCOutboundRtpStreamStats-Eintrags (Typ "outbound-rtp") ist ein String. Sie verweist auf einen anderen Eintrag im selben RTCStatsReport, und zwar vom Typ "media-source". Dieser Eintrag beschreibt die lokale Medienquelle, also den MediaStreamTrack, der dem RTCRtpSender gerade zugewiesen ist.

Nützlich ist das, wenn du Kennzahlen des Encoders und der Quelle zusammenbringen willst. Der outbound-rtp-Eintrag liefert gesendete Bytes, Pakete oder framesEncoded. Der media-source-Eintrag liefert Werte direkt von der Quelle, zum Beispiel width, height und framesPerSecond der Kamera oder audioLevel des Mikrofons. Vergleichst du beide, siehst du etwa, ob der Encoder die Auflösung aus Bandbreitengründen herunterskaliert.

Die ID ist nur innerhalb eines Berichts gültig. Löse sie deshalb immer mit report.get(id) im selben RTCStatsReport auf. Wird der Track mit RTCRtpSender.replaceTrack() ausgetauscht, kann mediaSourceId in späteren Berichten auf ein anderes Quellobjekt verweisen.

Rückgabewert

Typ
string | undefined
Beschreibung
Die id des zugehörigen media-source-Statistikobjekts. undefined, wenn gerade kein Track am Sender hängt oder der Browser die Eigenschaft nicht unterstützt.

Beispiele

Medienquelle zu jedem ausgehenden Stream auflösen

const logOutboundSources = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type !== 'outbound-rtp') return;
    const source = stats.mediaSourceId ? report.get(stats.mediaSourceId) : null;
    console.log(stats.kind, stats.id, '→ Quelle:', source?.trackIdentifier ?? 'keine');
  });
};

logOutboundSources(peerConnection);
video OT01V12345 → Quelle: 3f2a9c1e-… audio OT01A67890 → Quelle: 8b1d44e0-…

Herunterskalierung durch den Encoder erkennen

const checkVideoScaling = async (sender) => {
  const report = await sender.getStats();
  for (const stats of report.values()) {
    if (stats.type !== 'outbound-rtp' || stats.kind !== 'video') continue;
    const source = report.get(stats.mediaSourceId);
    if (!source) continue;
    console.log(`Quelle: ${source.width}x${source.height}, gesendet: ${stats.frameWidth}x${stats.frameHeight}`);
    if (stats.frameWidth < source.width) {
      console.warn('Encoder skaliert herunter, Grund:', stats.qualityLimitationReason);
    }
  }
};

const [videoSender] = peerConnection.getSenders().filter((s) => s.track?.kind === 'video');
checkVideoScaling(videoSender);
Quelle: 1280x720, gesendet: 640x360 Encoder skaliert herunter, Grund: bandwidth

Mikrofonpegel pro Sender überwachen

const monitorMicLevel = (pc, intervalMs = 1000) => setInterval(async () => {
  const report = await pc.getStats();
  for (const stats of report.values()) {
    if (stats.type === 'outbound-rtp' && stats.kind === 'audio') {
      const source = report.get(stats.mediaSourceId);
      console.log('Pegel:', source?.audioLevel?.toFixed(3) ?? 'n/a');
    }
  }
}, intervalMs);

const timer = monitorMicLevel(peerConnection);
// später: clearInterval(timer);
Pegel: 0.042 Pegel: 0.187

// Wichtig · Fallstricke

  • ID nur im selben Bericht gültig: Speichere keine Quellobjekte aus älteren Berichten. Löse die ID immer im aktuellen RTCStatsReport auf.
  • Kann fehlen: Hängt kein Track am Sender (z. B. nach replaceTrack(null)), fehlt mediaSourceId unter Umständen. Prüfe den Wert vorher oder nutze optionales Verketten (?.).
  • Simulcast: Bei Simulcast gibt es mehrere outbound-rtp-Einträge, einen pro Encoding. Sie verweisen alle auf dieselbe mediaSourceId.
  • Kompatibilität: Aktuelle Versionen von Chromium, Firefox und Safari unterstützen die Eigenschaft. Ältere Browser nutzten stattdessen das veraltete trackId mit "track"-Statistiken, die inzwischen aus der Spezifikation entfernt wurden. Die Eigenschaften der media-source-Einträge (width, audioLevel …) sind nicht in allen Browsern vollständig vorhanden.
  • Leistung: getStats() ist asynchron und nicht kostenlos. Frage in Intervallen von etwa einer Sekunde ab, nicht pro Frame.