Signatur
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
"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);
}
});
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);
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));
// Wichtig · Fallstricke
- Kein eigener Typ für Video: Audio- und Videoquellen haben beide
type === "media-source". Prüfe zusätzlichkind === "video", sonst liest du bei Audioquellenundefinedfürwidth,heightoderframesPerSecond. - Nur lokale Quellen:
media-source-Einträge gibt es nur für gesendete Spuren. Für empfangene Videos musst du stattdesseninbound-rtpauswerten. - 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 aufundefined, zum Beispiel mit??. - Die Eigenschaft ist schreibgeschützt. Ein
RTCStatsReportist eine Momentaufnahme; für aktuelle Werte musst dugetStats()erneut aufrufen. - Der Vergleich ist ein exakter String-Vergleich:
"media-source"mit Bindestrich, alles klein geschrieben.