Signatur
Beschreibung
Die schreibgeschützte Eigenschaft id eines RTCVideoSourceStats-Objekts ist ein String, der die Videoquelle eindeutig bezeichnet, zu der die Statistik gehört. Solche Objekte haben den type-Wert "media-source" und das Feld kind === "video". Sie beschreiben einen lokalen MediaStreamTrack, der an eine RTCPeerConnection angehängt ist, zum Beispiel mit Auflösung (width/height), frames und framesPerSecond.
Die id ist zugleich der Schlüssel des Eintrags in der Map-ähnlichen RTCStatsReport-Struktur. Mit report.get(id) kommt man also direkt an das Objekt. Außerdem verweisen andere Statistik-Objekte über diese ID auf die Quelle: Ein RTCOutboundRtpStreamStats-Eintrag enthält im Feld mediaSourceId genau diese id. So lassen sich Quelle und gesendeter RTP-Stream einander zuordnen.
Solange dasselbe Objekt überwacht wird, bleibt die ID über mehrere getStats()-Aufrufe gleich. Deshalb eignet sie sich gut, um Messwerte über die Zeit zu vergleichen, etwa um die Bildrate aus der Differenz zweier Messungen von frames und timestamp selbst zu berechnen.
Rückgabewert
RTCPeerConnection eindeutige Zeichenkette (z. B. "SV1" oder "RTCVideoSource_2"). Das Format ist nicht standardisiert.Beispiele
IDs aller Video-Quellen auslesen
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) => {
if (stats.type === 'media-source' && stats.kind === 'video') {
console.log('Video-Quelle:', stats.id, `${stats.width}x${stats.height}`);
}
});
Outbound-RTP-Stream seiner Quelle zuordnen
const logSourceForOutbound = async (pc) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type === 'outbound-rtp' && stats.kind === 'video') {
// mediaSourceId verweist auf RTCVideoSourceStats.id
const source = report.get(stats.mediaSourceId);
console.log(`RTP ${stats.ssrc} ← Quelle ${source?.id}, ${source?.framesPerSecond} fps`);
}
}
};
await logSourceForOutbound(pc);
Bildrate über die stabile ID zwischen zwei Messungen berechnen
const measureFps = async (pc, intervalMs = 1000) => {
const pick = (report) => [...report.values()]
.filter((s) => s.type === 'media-source' && s.kind === 'video');
const before = new Map(pick(await pc.getStats()).map((s) => [s.id, s]));
await new Promise((r) => setTimeout(r, intervalMs));
for (const now of pick(await pc.getStats())) {
const prev = before.get(now.id);
if (!prev) continue;
const fps = ((now.frames - prev.frames) * 1000) / (now.timestamp - prev.timestamp);
console.log(`${now.id}: ${fps.toFixed(1)} fps`);
}
};
await measureFps(pc);
// Wichtig · Fallstricke
- Format nicht festgelegt: Wie die ID aussieht, entscheidet der Browser. Sie unterscheidet sich zwischen Chrome, Firefox und Safari. Werte nie parsen und nicht fest im Code hinterlegen.
- Nur innerhalb einer Verbindung eindeutig: Die ID gilt nur für die jeweilige
RTCPeerConnection. Verschiedene Verbindungen können dieselbe ID verwenden. NachreplaceTrack()oder beim Neuaufbau der Verbindung kann ein neuer Eintrag mit neuer ID entstehen. - Nur für lokale, gesendete Tracks:
media-source-Statistiken gibt es nur für Tracks, die über einenRTCRtpSendergesendet werden. Empfangene Streams erscheinen dagegen alsinbound-rtp. - Browser-Unterstützung: Chromium-Browser unterstützen
RTCVideoSourceStatsvollständig, Safari ab Version 17. In Firefox fehlen je nach Version einzelne Felder wieframesPerSecond. Vor dem Zugriff also auftypeundkindprüfen. - Die Eigenschaft ist von
RTCStatsgeerbt und schreibgeschützt.