Signatur
Beschreibung
Die Methode getContributingSources() eines RTCRtpReceiver liefert Informationen über die beitragenden Quellen (Contributing Sources, CSRC) eines eingehenden RTP-Stroms. Eine CSRC entsteht, wenn ein Mixer, etwa eine MCU in einer Videokonferenz, mehrere Quellen zu einem Strom zusammenführt. Jede ursprüngliche Quelle bekommt dabei ihren CSRC-Bezeichner, und dieser steht im RTP-Header.
Jedes zurückgegebene Objekt enthält source (den 32-Bit-CSRC-Bezeichner), timestamp (Zeitpunkt des letzten Pakets als DOMHighResTimeStamp), rtpTimestamp und optional audioLevel (Werte von 0,0 bis 1,0, linear skaliert). Berücksichtigt werden nur Quellen, von denen in den letzten 10 Sekunden Pakete angekommen sind.
Typische Einsatzfälle sind Anzeigen für den „aktiven Sprecher“ in Konferenzen über einen Mixer und Pegelanzeigen für einzelne Teilnehmer. Die Methode liefert immer nur eine Momentaufnahme. Wer Werte fortlaufend braucht, fragt sie regelmäßig ab, zum Beispiel mit setInterval oder requestAnimationFrame. Für die direkte Quelle des Stroms (SSRC) gibt es die verwandte Methode getSynchronizationSources().
Rückgabewert
source, timestamp, rtpTimestamp und optional audioLevel. Das Array ist leer, wenn der Strom keine CSRCs enthält, zum Beispiel bei einer direkten Peer-to-Peer-Verbindung ohne Mixer.Beispiele
Beitragende Quellen eines Audio-Empfängers auslesen
const pc = new RTCPeerConnection();
pc.addEventListener('track', ({ receiver, track }) => {
if (track.kind !== 'audio') return;
// Nach kurzer Zeit eine Momentaufnahme erstellen
setTimeout(() => {
const sources = receiver.getContributingSources();
console.log(`Anzahl CSRCs: ${sources.length}`);
sources.forEach(({ source, audioLevel, timestamp }) => {
console.log(source, audioLevel ?? 'kein Pegel', Math.round(timestamp));
});
}, 2000);
});
Aktiven Sprecher in einer Mixer-Konferenz ermitteln
const findActiveSpeaker = (receiver, threshold = 0.1) => {
const sources = receiver.getContributingSources()
.filter((s) => typeof s.audioLevel === 'number' && s.audioLevel >= threshold);
if (sources.length === 0) return null;
return sources.reduce((a, b) => (b.audioLevel > a.audioLevel ? b : a)).source;
};
const watchSpeaker = (pc) => {
const audioReceiver = pc.getReceivers().find((r) => r.track.kind === 'audio');
if (!audioReceiver) return;
return setInterval(() => {
const speaker = findActiveSpeaker(audioReceiver);
console.log(speaker ? `Aktiver Sprecher: CSRC ${speaker}` : 'Niemand spricht');
}, 500);
};
Pegelanzeige mit requestAnimationFrame
const renderLevels = (receiver, container) => {
const loop = () => {
const items = receiver.getContributingSources().map(({ source, audioLevel = 0 }) =>
`${source}: ${'█'.repeat(Math.round(audioLevel * 20))}`
);
container.textContent = items.join('\n') || 'Keine beitragenden Quellen';
requestAnimationFrame(loop);
};
requestAnimationFrame(loop);
};
// Aufruf: renderLevels(audioReceiver, document.querySelector('#levels'));
// Wichtig · Fallstricke
- Häufig ein leeres Array: In einfachen Peer-to-Peer-Verbindungen oder bei SFUs, die Pakete nur weiterleiten, enthalten die RTP-Pakete keine CSRCs. Die Methode gibt dann
[]zurück. Die Quelle der Pakete liefert in diesem FallgetSynchronizationSources(). - 10-Sekunden-Fenster: Eine Quelle, von der seit mehr als 10 Sekunden kein Paket mehr gekommen ist, taucht nicht mehr auf. Das Ergebnis ist nur eine Momentaufnahme und aktualisiert sich nicht selbst.
audioLevelist optional: Der Wert ist nur bei Audio-Empfängern vorhanden, und nur wenn der Sender die RTP-Header-Erweiterung für Pegel beitragender Quellen (RFC 6465) aushandelt. Der Wert ist linear, nicht in dBov. 1,0 entspricht 0 dBov.- Nicht zu oft abfragen: Wer die Methode bei jedem Frame aufruft, verursacht unnötige Last. Für eine Sprecheranzeige genügen meist 100 bis 500 ms Abstand.
- Browser-Unterstützung: Die Methode wird in aktuellen Chromium-Browsern, Firefox und Safari unterstützt. Ältere Versionen liefern teilweise kein
audioLeveloder keinrtpTimestamp. Ist die Unterstützung unsicher, vorher mit'getContributingSources' in RTCRtpReceiver.prototypeprüfen.