Start · Sprachen · JavaScript · Referenz · RTCRtpReceiver.getContributingSources()

RTCRtpReceiver.getContributingSources()

Methode

Gibt ein Array von <code>RTCRtpContributingSource</code>-Objekten zurück, eines für jede CSRC, von der der Empfänger in den letzten 10 Sekunden RTP-Pakete erhalten hat.

seit JavaScript Baseline: Chrome 59+, Firefox 59+, Safari 12.1+, E Kategorie: webapi

Signatur

RTCRtpReceiver.prototype.getContributingSources()

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

Typ
Array<RTCRtpContributingSource>
Beschreibung
Ein Array von Objekten mit den Eigenschaften 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);
});
Anzahl CSRCs: 2 12345678 0.42 183421 87654321 0.03 183419

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);
};
Aktiver Sprecher: CSRC 12345678

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 Fall getSynchronizationSources().
  • 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.
  • audioLevel ist 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 audioLevel oder kein rtpTimestamp. Ist die Unterstützung unsicher, vorher mit 'getContributingSources' in RTCRtpReceiver.prototype prüfen.