Start · Sprachen · JavaScript · Referenz · RTCAudioSourceStats.type

RTCAudioSourceStats.type

Eigenschaft

Die schreibgeschützte Eigenschaft <code>type</code> eines <code>RTCAudioSourceStats</code>-Objekts enthält immer den String <code>"media-source"</code>.

seit JavaScript Baseline: Chrome/Edge 115+, Firefox 115+, Safari 1 Kategorie: webapi

Signatur

RTCAudioSourceStats.type

Beschreibung

Die Eigenschaft type gibt an, zu welcher Art von Statistik ein Eintrag im RTCStatsReport gehört. Bei RTCAudioSourceStats hat sie immer den Wert "media-source". Der Eintrag beschreibt eine Audioquelle, also einen MediaStreamTrack vom Typ audio, der über einen RTCRtpSender an eine RTCPeerConnection angehängt ist.

Ein RTCStatsReport ist eine Map-ähnliche Sammlung, die viele verschiedene Statistik-Objekte enthält, etwa "outbound-rtp", "inbound-rtp", "candidate-pair" oder eben "media-source". Mit type filtert man die gewünschten Einträge heraus. Den Wert "media-source" haben allerdings auch Video-Quellen (RTCVideoSourceStats). Audio und Video unterscheidet man deshalb zusätzlich über die Eigenschaft kind ("audio" bzw. "video").

Typische Anwendungsfälle sind die Pegelanzeige des eigenen Mikrofons über audioLevel und totalAudioEnergy sowie die Diagnose von Echounterdrückung (echoReturnLoss, echoReturnLossEnhancement).

Rückgabewert

Typ
string
Beschreibung
Immer "media-source" (ein Wert der Aufzählung RTCStatsType).

Beispiele

Audioquellen-Statistiken aus dem Report filtern

const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
stream.getTracks().forEach((track) => pc.addTrack(track, stream));

const report = await pc.getStats();
report.forEach((stats) => {
  // type allein reicht nicht – auch Videoquellen sind "media-source"
  if (stats.type === "media-source" && stats.kind === "audio") {
    console.log(stats.type, stats.trackIdentifier, stats.audioLevel);
  }
});
media-source 3f2a9c1e-... 0.0123

Mikrofonpegel regelmäßig abfragen

const getAudioSourceStats = async (sender) => {
  const report = await sender.getStats();
  return [...report.values()].find(
    (s) => s.type === "media-source" && s.kind === "audio"
  );
};

const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const sender = pc.addTrack(stream.getAudioTracks()[0], stream);

const timer = setInterval(async () => {
  const stats = await getAudioSourceStats(sender);
  if (stats) {
    console.log(`Pegel: ${(stats.audioLevel ?? 0).toFixed(3)}`);
  }
}, 1000);

// Später aufräumen
setTimeout(() => {
  clearInterval(timer);
  pc.close();
}, 10000);
Pegel: 0.012 Pegel: 0.245 ...

Report nach type gruppieren

const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
pc.addTrack(stream.getAudioTracks()[0], stream);

const report = await pc.getStats();
const counts = {};
for (const stats of report.values()) {
  counts[stats.type] = (counts[stats.type] ?? 0) + 1;
}
console.log(counts);
{ "media-source": 1, ... }

// Wichtig · Fallstricke

  • Nicht eindeutig: "media-source" steht sowohl für RTCAudioSourceStats als auch für RTCVideoSourceStats. Prüfen Sie zusätzlich kind === "audio".
  • Einträge vom Typ "media-source" gibt es nur für lokal gesendete Tracks. Für empfangenes Audio sind die "inbound-rtp"-Statistiken zuständig.
  • Die Eigenschaft ist schreibgeschützt. Welche Zusatzfelder (audioLevel, echoReturnLoss usw.) vorhanden sind, ist je nach Browser verschieden. Fragen Sie sie deshalb defensiv ab, z. B. mit ??.
  • Ältere Browser haben stattdessen die veralteten Typen "track" bzw. RTCMediaStreamTrackStats geliefert. Wer ältere Versionen unterstützen muss, braucht eine Rückfallebene.
  • Rufen Sie getStats() nicht zu oft auf, denn jeder Aufruf erstellt einen vollständigen Report. Ein Abstand von etwa einer Sekunde ist üblich.