Start · Sprachen · JavaScript · Referenz · RTCVideoSourceStats.type

RTCVideoSourceStats.type

Eigenschaft

Die Eigenschaft <code>type</code> eines <code>RTCVideoSourceStats</code>-Objekts ist immer der String <code>"media-source"</code> und kennzeichnet damit Statistiken zu einer lokalen Medienquelle.

seit JavaScript Chrome 108+, Safari 14.1+, Firefox (teilweise); ni Kategorie: webapi

Signatur

RTCVideoSourceStats.type

Beschreibung

Die schreibgeschützte Eigenschaft type gehört zu jedem Statistik-Objekt, das ein RTCStatsReport enthält. Bei RTCVideoSourceStats hat sie immer den Wert "media-source". Das Objekt beschreibt eine lokale Videoquelle, etwa eine Kamera oder eine Bildschirmfreigabe, die über einen RTCRtpSender an die Gegenstelle gesendet wird.

Einen RTCStatsReport bekommt man von RTCPeerConnection.getStats() oder RTCRtpSender.getStats(). Er enthält viele Einträge unterschiedlicher Art. Mit type filtert man die gewünschten heraus. Für "media-source" teilen sich Audio- und Videoquellen denselben Typ. Unterschieden werden sie erst über die Eigenschaft kind ("video" oder "audio"). Erst nach dieser Prüfung sind videospezifische Felder wie width, height, frames und framesPerSecond sicher vorhanden.

Typische Einsatzfälle sind Qualitätsanzeigen in Videokonferenz-Anwendungen, die Überwachung der tatsächlichen Aufnahme-Auflösung und Bildrate sowie Diagnose-Werkzeuge. Mit ihnen lässt sich zum Beispiel erkennen, dass die Kamera weniger Bilder pro Sekunde liefert als angefordert.

Rückgabewert

Typ
string
Beschreibung
Immer der String "media-source" (ein Wert der Aufzählung RTCStatsType).

Beispiele

Videoquellen-Statistiken aus getStats() herausfiltern

const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
stream.getTracks().forEach((track) => pc.addTrack(track, stream));

const report = await pc.getStats();
report.forEach((stats) => {
  // Erst nach type, dann nach kind filtern
  if (stats.type === 'media-source' && stats.kind === 'video') {
    console.log(stats.type, stats.width, stats.height, stats.framesPerSecond);
  }
});
media-source 640 480 30

Bildrate der Kamera regelmäßig überwachen

const monitorVideoSource = (sender, intervalMs = 2000) => {
  const timer = setInterval(async () => {
    const report = await sender.getStats();
    for (const stats of report.values()) {
      if (stats.type !== 'media-source' || stats.kind !== 'video') continue;
      const fps = stats.framesPerSecond ?? 0;
      if (fps < 15) {
        console.warn(`Niedrige Bildrate der Quelle: ${fps} fps`);
      }
    }
  }, intervalMs);
  return () => clearInterval(timer); // Funktion zum Beenden
};

// Nutzung:
// const videoSender = pc.getSenders().find((s) => s.track?.kind === 'video');
// const stop = monitorVideoSource(videoSender);
Niedrige Bildrate der Quelle: 12 fps

Alle Statistik-Typen eines Reports zählen

const countStatsTypes = async (pc) => {
  const report = await pc.getStats();
  const counts = {};
  report.forEach(({ type }) => {
    counts[type] = (counts[type] ?? 0) + 1;
  });
  return counts;
};

console.log(await countStatsTypes(pc));
{ "media-source": 2, "outbound-rtp": 2, "codec": 2, "transport": 1, ... }

// Wichtig · Fallstricke

  • Kein eigener Typ für Video: Audio- und Videoquellen haben beide type === "media-source". Prüfe zusätzlich kind === "video", sonst liest du bei Audioquellen undefined für width, height oder framesPerSecond.
  • Nur lokale Quellen: media-source-Einträge gibt es nur für gesendete Spuren. Für empfangene Videos musst du stattdessen inbound-rtp auswerten.
  • Browser-Unterstützung: Chromium-Browser und Safari liefern media-source-Statistiken. In Firefox fehlen einige Felder oder werden erst in neueren Versionen gemeldet. Prüfe Felder deshalb immer auf undefined, zum Beispiel mit ??.
  • Die Eigenschaft ist schreibgeschützt. Ein RTCStatsReport ist eine Momentaufnahme; für aktuelle Werte musst du getStats() erneut aufrufen.
  • Der Vergleich ist ein exakter String-Vergleich: "media-source" mit Bindestrich, alles klein geschrieben.