Signatur
Beschreibung
Die Eigenschaft mediaSourceId eines RTCOutboundRtpStreamStats-Eintrags (Typ "outbound-rtp") ist ein String. Sie verweist auf einen anderen Eintrag im selben RTCStatsReport, und zwar vom Typ "media-source". Dieser Eintrag beschreibt die lokale Medienquelle, also den MediaStreamTrack, der dem RTCRtpSender gerade zugewiesen ist.
Nützlich ist das, wenn du Kennzahlen des Encoders und der Quelle zusammenbringen willst. Der outbound-rtp-Eintrag liefert gesendete Bytes, Pakete oder framesEncoded. Der media-source-Eintrag liefert Werte direkt von der Quelle, zum Beispiel width, height und framesPerSecond der Kamera oder audioLevel des Mikrofons. Vergleichst du beide, siehst du etwa, ob der Encoder die Auflösung aus Bandbreitengründen herunterskaliert.
Die ID ist nur innerhalb eines Berichts gültig. Löse sie deshalb immer mit report.get(id) im selben RTCStatsReport auf. Wird der Track mit RTCRtpSender.replaceTrack() ausgetauscht, kann mediaSourceId in späteren Berichten auf ein anderes Quellobjekt verweisen.
Rückgabewert
id des zugehörigen media-source-Statistikobjekts. undefined, wenn gerade kein Track am Sender hängt oder der Browser die Eigenschaft nicht unterstützt.Beispiele
Medienquelle zu jedem ausgehenden Stream auflösen
const logOutboundSources = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type !== 'outbound-rtp') return;
const source = stats.mediaSourceId ? report.get(stats.mediaSourceId) : null;
console.log(stats.kind, stats.id, '→ Quelle:', source?.trackIdentifier ?? 'keine');
});
};
logOutboundSources(peerConnection);
Herunterskalierung durch den Encoder erkennen
const checkVideoScaling = async (sender) => {
const report = await sender.getStats();
for (const stats of report.values()) {
if (stats.type !== 'outbound-rtp' || stats.kind !== 'video') continue;
const source = report.get(stats.mediaSourceId);
if (!source) continue;
console.log(`Quelle: ${source.width}x${source.height}, gesendet: ${stats.frameWidth}x${stats.frameHeight}`);
if (stats.frameWidth < source.width) {
console.warn('Encoder skaliert herunter, Grund:', stats.qualityLimitationReason);
}
}
};
const [videoSender] = peerConnection.getSenders().filter((s) => s.track?.kind === 'video');
checkVideoScaling(videoSender);
Mikrofonpegel pro Sender überwachen
const monitorMicLevel = (pc, intervalMs = 1000) => setInterval(async () => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type === 'outbound-rtp' && stats.kind === 'audio') {
const source = report.get(stats.mediaSourceId);
console.log('Pegel:', source?.audioLevel?.toFixed(3) ?? 'n/a');
}
}
}, intervalMs);
const timer = monitorMicLevel(peerConnection);
// später: clearInterval(timer);
// Wichtig · Fallstricke
- ID nur im selben Bericht gültig: Speichere keine Quellobjekte aus älteren Berichten. Löse die ID immer im aktuellen
RTCStatsReportauf. - Kann fehlen: Hängt kein Track am Sender (z. B. nach
replaceTrack(null)), fehltmediaSourceIdunter Umständen. Prüfe den Wert vorher oder nutze optionales Verketten (?.). - Simulcast: Bei Simulcast gibt es mehrere
outbound-rtp-Einträge, einen pro Encoding. Sie verweisen alle auf dieselbemediaSourceId. - Kompatibilität: Aktuelle Versionen von Chromium, Firefox und Safari unterstützen die Eigenschaft. Ältere Browser nutzten stattdessen das veraltete
trackIdmit"track"-Statistiken, die inzwischen aus der Spezifikation entfernt wurden. Die Eigenschaften dermedia-source-Einträge (width,audioLevel…) sind nicht in allen Browsern vollständig vorhanden. - Leistung:
getStats()ist asynchron und nicht kostenlos. Frage in Intervallen von etwa einer Sekunde ab, nicht pro Frame.