Signatur
Beschreibung
Die schreibgeschützte Eigenschaft id des Wörterbuchs RTCAudioSourceStats enthält einen String. Er kennzeichnet die Audioquelle – also den lokalen MediaStreamTrack, der an einen RTCRtpSender angehängt ist –, zu der dieses Statistik-Objekt gehört. Die ID dient zugleich als Schlüssel in der Map-artigen Struktur RTCStatsReport.
Im Alltag braucht man die id vor allem, um Statistiken miteinander zu verknüpfen. Ein outbound-rtp-Eintrag (RTCOutboundRtpStreamStats) verweist über seine Eigenschaft mediaSourceId auf die id des passenden media-source-Eintrags. So lassen sich zum Beispiel Eingangspegel (audioLevel) und gesendete Bytes einem Stream zuordnen.
Die ID bleibt über mehrere Aufrufe von getStats() hinweg für dieselbe Quelle stabil. Deshalb eignet sie sich, um Messwerte über die Zeit zu verfolgen, etwa zur Berechnung von Deltas zwischen zwei Abfragen. Das Format ist dagegen nicht festgelegt und hängt vom Browser ab. Man darf die ID also nur als undurchsichtigen Bezeichner verwenden.
Rückgabewert
RTCStatsReport, z. B. "SA1" in Chrome. Das Format ist browserabhängig.Beispiele
IDs aller Audioquellen auslesen
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const pc = new RTCPeerConnection();
stream.getTracks().forEach((track) => pc.addTrack(track, stream));
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'media-source' && stats.kind === 'audio') {
console.log('Audioquelle:', stats.id, 'Pegel:', stats.audioLevel);
}
});
outbound-rtp über mediaSourceId mit der Audioquelle verknüpfen
const logAudioSend = async (pc) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type === 'outbound-rtp' && stats.kind === 'audio') {
// Direkter Zugriff über die id als Map-Schlüssel
const source = report.get(stats.mediaSourceId);
console.log(`Quelle ${source?.id}: Pegel ${source?.audioLevel}, gesendet ${stats.bytesSent} Bytes`);
}
}
};
await logAudioSend(pc);
Energie-Deltas pro Quelle über die Zeit verfolgen
const previous = new Map();
setInterval(async () => {
const report = await pc.getStats();
report.forEach((s) => {
if (s.type !== 'media-source' || s.kind !== 'audio') return;
const prev = previous.get(s.id);
if (prev) {
const delta = s.totalAudioEnergy - prev.totalAudioEnergy;
console.log(`${s.id}: Energie-Zuwachs ${delta.toFixed(4)}`);
}
previous.set(s.id, s);
});
}, 1000);
// Wichtig · Fallstricke
- Das Format der ID ist nicht standardisiert. Nicht parsen und nicht davon ausgehen, dass sie zwischen Browsern oder Sitzungen gleich ist.
- Die ID ist nur innerhalb derselben
RTCPeerConnectioneindeutig. Wer mehrere Verbindungen überwacht, sollte sie zusätzlich nach Verbindung trennen. - Einträge vom Typ
media-sourcegibt es nur für lokale Tracks, die an einen Sender angehängt sind. Für empfangene Audiodaten nutzt maninbound-rtp. - Kompatibilität: Chromium-Browser und Safari liefern
RTCAudioSourceStats. Firefox kennt diesen Statistiktyp derzeit nicht. Daher vor dem Zugriff immerstats.typeundstats.kindprüfen. - Die Eigenschaft ist schreibgeschützt. Die Statistik-Objekte sind Momentaufnahmen und werden nicht automatisch aktualisiert.