Start · Sprachen · JavaScript · Referenz · RTCInboundRtpStreamStats.audioLevel

RTCInboundRtpStreamStats.audioLevel

Eigenschaft

Gibt den aktuellen Audiopegel des empfangenen (entfernten) Audio-Tracks als linearen Wert zwischen <code>0</code> und <code>1</code> an.

seit JavaScript WebRTC Statistics (W3C); Chromium und Safari, Fire Kategorie: webapi

Signatur

RTCInboundRtpStreamStats.audioLevel

Beschreibung

Die Eigenschaft audioLevel gehört zu den Statistiken vom Typ "inbound-rtp", die du über RTCPeerConnection.getStats() oder RTCRtpReceiver.getStats() bekommst. Sie gibt an, wie laut das Audio ist, das gerade von der Gegenstelle empfangen und abgespielt wird. Der Wert ist eine Gleitkommazahl von 0 bis 1.

Die Skala ist linear: 1.0 entspricht 0 dBov (maximaler Pegel), 0 steht für Stille, und 0.5 liegt ungefähr 6 dB unter 0 dBov. Der Wert wird über ein kurzes Zeitfenster gemittelt. Deshalb eignet er sich gut für Sprecher-Anzeigen, z. B. einen leuchtenden Rahmen um das Video der Person, die gerade spricht, oder für VU-Meter und für die Diagnose („Kommt überhaupt Ton an?“).

Die Eigenschaft gibt es nur bei Audio-Streams (kind === "audio"). Bei Video-Einträgen vom Typ inbound-rtp ist sie undefined. Wenn du einen genaueren Durchschnittspegel über einen bestimmten Zeitraum brauchst, nimm die kumulativen Werte totalAudioEnergy und totalSamplesDuration. Der Momentanwert von audioLevel ist dafür nicht gedacht.

Rückgabewert

Typ
number | undefined
Beschreibung
Linearer Pegel zwischen 0 (Stille) und 1 (0 dBov). Bei Video-Streams oder wenn der Browser die Eigenschaft nicht unterstützt: undefined.

Beispiele

Audiopegel aller empfangenen Audio-Streams auslesen

// pc ist eine bestehende, verbundene RTCPeerConnection
const logInboundAudioLevels = async (pc) => {
  const stats = await pc.getStats();
  stats.forEach((report) => {
    if (report.type === 'inbound-rtp' && report.kind === 'audio') {
      console.log(`SSRC ${report.ssrc}: Pegel ${report.audioLevel?.toFixed(3)}`);
    }
  });
};

await logInboundAudioLevels(pc);
SSRC 3735928559: Pegel 0.124

Sprecher-Anzeige per Polling

// Hebt das Video hervor, solange die Gegenstelle spricht
const SPEAKING_THRESHOLD = 0.02;

const watchSpeaker = (receiver, videoElement) => {
  const timer = setInterval(async () => {
    const stats = await receiver.getStats();
    for (const report of stats.values()) {
      if (report.type === 'inbound-rtp' && report.kind === 'audio') {
        const level = report.audioLevel ?? 0;
        videoElement.classList.toggle('speaking', level > SPEAKING_THRESHOLD);
      }
    }
  }, 200);
  return () => clearInterval(timer); // Aufräumfunktion
};

const [audioReceiver] = pc.getReceivers().filter((r) => r.track.kind === 'audio');
const stopWatching = watchSpeaker(audioReceiver, document.querySelector('#remoteVideo'));

Durchschnittspegel über ein Intervall aus totalAudioEnergy berechnen

// Genauer als der Momentanwert: RMS-Pegel zwischen zwei Messungen
const getAudioInbound = async (pc) => {
  const stats = await pc.getStats();
  return [...stats.values()].find((r) => r.type === 'inbound-rtp' && r.kind === 'audio');
};

const a = await getAudioInbound(pc);
await new Promise((resolve) => setTimeout(resolve, 1000));
const b = await getAudioInbound(pc);

const energy = b.totalAudioEnergy - a.totalAudioEnergy;
const duration = b.totalSamplesDuration - a.totalSamplesDuration;
const avgLevel = duration > 0 ? Math.sqrt(energy / duration) : 0;

console.log('Momentan:', b.audioLevel.toFixed(3), '| Mittel (1 s):', avgLevel.toFixed(3));
Momentan: 0.087 | Mittel (1 s): 0.064

// Wichtig · Fallstricke

  • Lineare Skala, keine Dezibel: Für eine Anzeige in dB rechne den Wert mit 20 * Math.log10(audioLevel) um. Bei 0 ergibt das -Infinity, also diesen Fall vorher abfangen.
  • Nur bei Audio: Prüfe immer report.kind === "audio". Bei Video-Einträgen fehlt die Eigenschaft.
  • Nur ein Momentanwert: Die Stats werden intern nur in Abständen aktualisiert. Wenn du häufiger als ungefähr alle 50–100 ms abfragst, bekommst du keine neuen Daten, verbrauchst aber trotzdem Rechenzeit. Für Durchschnittswerte totalAudioEnergy/totalSamplesDuration verwenden.
  • Stumm ist nicht gleich 0: Wenn Pakete fehlen oder der Track stummgeschaltet ist, kann der Wert fehlen oder auf dem letzten Stand stehen bleiben. Werte außerdem packetsReceived aus.
  • Browser-Kompatibilität: Wird in Chromium-Browsern und Safari unterstützt. In Firefox ist die Unterstützung je nach Version eingeschränkt. Deshalb defensiv mit ?? 0 bzw. ?. zugreifen. Als Alternative, die überall funktioniert, kannst du den Pegel mit einem AnalyserNode der Web Audio API messen.
  • Datenschutz: Pegelwerte verraten, wann jemand spricht. Übertrage sie nicht unnötig an Server oder Dritte.