Signatur
Beschreibung
Die Eigenschaft trackIdentifier des Wörterbuchs RTCVideoSourceStats ist ein String. Sie enthält denselben Wert wie das Attribut id des MediaStreamTrack, der als Videoquelle an einen RTCRtpSender übergeben wurde. Statistikobjekte vom Typ "media-source" mit kind === "video" lassen sich so eindeutig einem lokalen Track zuordnen, etwa der Kamera oder einer Bildschirmfreigabe.
In der Praxis braucht man das, wenn eine Verbindung mehrere Videotracks sendet, zum Beispiel Kamera und Bildschirm gleichzeitig. Über trackIdentifier findet man in einem RTCStatsReport die Quellstatistiken wie width, height, frames und framesPerSecond zum passenden Track. Diese Werte kann man dann in der Oberfläche anzeigen oder für die Überwachung auswerten.
Die Eigenschaft ist schreibgeschützt. Sie gehört zu einem einfachen Datenobjekt, das von RTCPeerConnection.getStats() oder RTCRtpSender.getStats() geliefert wird. Das Objekt aktualisiert sich nicht selbst: Für neue Werte muss man getStats() erneut aufrufen.
Rückgabewert
id des zugehörigen MediaStreamTrack. Sie hat oft die Form einer UUID, z. B. "3f2a…".Beispiele
Videoquellen-Statistiken auflisten
const listVideoSources = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'media-source' && stats.kind === 'video') {
console.log(`Track ${stats.trackIdentifier}: ${stats.width}x${stats.height} @ ${stats.framesPerSecond} fps`);
}
});
};
// Aufruf mit einer bestehenden RTCPeerConnection
await listVideoSources(pc);
Statistik einem bestimmten Kamera-Track zuordnen
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const [cameraTrack] = stream.getVideoTracks();
const pc = new RTCPeerConnection();
pc.addTrack(cameraTrack, stream);
const getSourceStatsForTrack = async (track) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type === 'media-source' && stats.trackIdentifier === track.id) {
return stats;
}
}
return null;
};
const camStats = await getSourceStatsForTrack(cameraTrack);
console.log(camStats?.trackIdentifier === cameraTrack.id);
Kamera und Bildschirmfreigabe regelmäßig überwachen
const labels = new Map(); // track.id -> Bezeichnung
const addLabeledTrack = (pc, track, stream, label) => {
labels.set(track.id, label);
pc.addTrack(track, stream);
};
const monitor = (pc) => setInterval(async () => {
const report = await pc.getStats();
for (const s of report.values()) {
if (s.type === 'media-source' && s.kind === 'video') {
const label = labels.get(s.trackIdentifier) ?? 'unbekannt';
console.log(`${label}: ${s.frames ?? 0} Frames insgesamt`);
}
}
}, 2000);
// Wichtig · Fallstricke
- Nicht zu verwechseln mit
id:stats.idist die ID des Statistikobjekts im Report.trackIdentifierist dagegen die ID desMediaStreamTrack. - Nur lokale Quellen:
RTCVideoSourceStatsgibt es nur für gesendete Tracks. Auf der Empfängerseite heißt die entsprechende EigenschaftRTCInboundRtpStreamStats.trackIdentifier. - Track ersetzen: Nach
RTCRtpSender.replaceTrack()erscheint ein neuesmedia-source-Objekt mit demtrackIdentifierdes neuen Tracks. Zwischengespeicherte Zuordnungen sollten daher aktualisiert werden. - Filtern: Immer auf
type === "media-source"undkind === "video"prüfen, denn Audioquellen (RTCAudioSourceStats) haben dieselbe Eigenschaft. - Kompatibilität: Wird von Chromium-Browsern und Firefox unterstützt. In Safari fehlen teilweise einzelne Felder. Deshalb optionale Verkettung (
?.) verwenden und einen Ersatzwert vorsehen.