Start · Sprachen · JavaScript · Referenz · AudioPlaybackStats.maximumLatency

AudioPlaybackStats.maximumLatency

Eigenschaft

Schreibgeschützte Zahl: die höchste Ausgabelatenz in Sekunden seit dem Start des Audio-Kontexts oder seit dem letzten Aufruf von <code>resetLatency()</code>.

seit JavaScript Experimentell: bisher nur Chromium-basierte Browse Kategorie: webapi

Signatur

AudioPlaybackStats.maximumLatency

Beschreibung

Die schreibgeschützte Eigenschaft maximumLatency der Schnittstelle AudioPlaybackStats gibt die höchste Wiedergabelatenz in Sekunden an, die im Messzeitraum aufgetreten ist. Die Latenz ist die Zeit zwischen dem Moment, in dem der Audio-Graph ein Audiosignal erzeugt, und dem Moment, in dem es am Ausgabegerät hörbar wird. An das AudioPlaybackStats-Objekt kommst du über AudioContext.playbackStats.

Der Messzeitraum beginnt, sobald der AudioContext läuft. Er startet neu, wenn du AudioPlaybackStats.resetLatency() aufrufst. Danach beziehen sich minimumLatency, averageLatency und maximumLatency nur noch auf das neue Zeitfenster. So kannst du die Latenz für einzelne Abschnitte messen, zum Beispiel pro Spielrunde, pro Musikstück oder nach einem Gerätewechsel.

Brauchbar ist der Wert vor allem für Überwachung und Diagnose: in Anwendungen für Echtzeit-Audio wie Web-DAWs, Spielen, Videokonferenzen oder Musik-Lernprogrammen. Ein hoher Maximalwert bei niedrigem Durchschnitt zeigt kurze Latenzspitzen. Die entstehen oft durch Bluetooth-Kopfhörer, Last im System oder Wechsel des Ausgabegeräts. Solche Werte kannst du an eine Telemetrie melden oder damit die Synchronisation zwischen Audio und Bild nachregeln.

Rückgabewert

Typ
number
Beschreibung
Die höchste gemessene Wiedergabelatenz in Sekunden (Gleitkommazahl, z. B. 0.042 für 42 ms) seit dem Start des Kontexts oder seit dem letzten resetLatency(). Ist noch nichts gemessen, ist der Wert typischerweise 0.

Beispiele

Maximale Latenz auslesen (mit Feature-Erkennung)

const ctx = new AudioContext();

// Kurzen Ton abspielen, damit der Kontext läuft
const osc = new OscillatorNode(ctx, { frequency: 440 });
osc.connect(ctx.destination);
osc.start();
osc.stop(ctx.currentTime + 2);

setTimeout(() => {
  if (!('playbackStats' in ctx)) {
    console.log('AudioPlaybackStats wird nicht unterstützt');
    return;
  }
  const maxMs = ctx.playbackStats.maximumLatency * 1000;
  console.log(`Maximale Latenz: ${maxMs.toFixed(1)} ms`);
}, 2000);
Maximale Latenz: 42.7 ms

Latenzspitzen im Verhältnis zum Durchschnitt überwachen

const ctx = new AudioContext();

const pruefeLatenz = () => {
  const stats = ctx.playbackStats;
  if (!stats) return;

  const { averageLatency, maximumLatency } = stats;
  // Spitze deutlich über dem Durchschnitt? Dann warnen
  if (averageLatency > 0 && maximumLatency > averageLatency * 2) {
    console.warn(
      `Latenzspitze: max ${(maximumLatency * 1000).toFixed(0)} ms, ` +
      `Ø ${(averageLatency * 1000).toFixed(0)} ms`
    );
  }
};

setInterval(pruefeLatenz, 5000);
Latenzspitze: max 180 ms, Ø 45 ms

Messfenster pro Abschnitt mit resetLatency() neu starten

const ctx = new AudioContext();
const messwerte = [];

const abschnittBeenden = (name) => {
  const stats = ctx.playbackStats;
  if (!stats) return;
  messwerte.push({ name, maxMs: Math.round(stats.maximumLatency * 1000) });
  // Maximum für den nächsten Abschnitt zurücksetzen
  stats.resetLatency();
};

// z. B. am Ende jeder Spielrunde aufrufen
abschnittBeenden('Runde 1');
console.table(messwerte);
┌─────────┬───────────┬───────┐ │ (index) │ name │ maxMs │ │ 0 │ 'Runde 1' │ 51 │ └─────────┴───────────┴───────┘

// Wichtig · Fallstricke

  • Einheit: Der Wert ist in Sekunden angegeben, nicht in Millisekunden. Für die Anzeige mit 1000 multiplizieren.
  • Kompatibilität: Die API ist experimentell und bisher nur in Chromium-basierten Browsern verfügbar. Prüfe immer vorher, ob sie vorhanden ist, etwa mit 'playbackStats' in audioContext. Für den Einsatz in Produktion gibt es noch keine Unterstützung in allen Browsern.
  • Keine Echtzeitwerte: Zum Schutz vor Fingerprinting aktualisiert der Browser die Statistiken nur in größeren Abständen und nicht bei jedem Audio-Block. Für eine exakte Synchronisation einzelner Frames eignet sich der Wert deshalb nicht. Dafür gibt es AudioContext.outputLatency und getOutputTimestamp().
  • Nur ein AudioContext mit Wiedergabe hat aussagekräftige Werte. Ein OfflineAudioContext hat keine playbackStats. Ein Kontext im Zustand "suspended" (zum Beispiel wegen der Autoplay-Richtlinie) sammelt keine Messwerte.
  • resetLatency() setzt nur die Latenzwerte zurück (minimale, mittlere und maximale Latenz). Die Werte zu Aussetzern (Underruns) werden nicht zurückgesetzt.