Start · Sprachen · JavaScript · Referenz · AudioContext.baseLatency

AudioContext.baseLatency

Eigenschaft

Schreibgeschützte Eigenschaft, die in Sekunden angibt, wie viel Verarbeitungslatenz der <code>AudioContext</code> intern verursacht, bis Audio an das Audio-Subsystem übergeben wird.

seit JavaScript Baseline 2024: Chrome 58+, Firefox 70+, Safari 14. Kategorie: webapi

Signatur

AudioContext.baseLatency

Beschreibung

baseLatency liefert eine Gleitkommazahl in Sekunden. Sie gibt an, welche Verzögerung der AudioContext selbst verursacht, wenn er Audio vom AudioDestinationNode an das Audio-Subsystem des Betriebssystems weitergibt. Diese Latenz entsteht vor allem durch die interne Pufferung des Audio-Graphen (meist Vielfache von 128 Sample-Frames pro Render-Quantum).

Der Wert hängt stark von der Option latencyHint ab, die du beim Konstruktor new AudioContext({ latencyHint }) übergibst. Mit "interactive" (Standard) bekommst du die kleinstmögliche Latenz, "playback" nimmt mehr Latenz in Kauf und spart dafür Energie, "balanced" liegt dazwischen. Du kannst auch einen Zahlenwert in Sekunden als Wunsch angeben, der Browser muss sich aber nicht daran halten.

Brauchbar ist die Eigenschaft bei interaktiven Anwendungen wie Synthesizern, Rhythmusspielen oder Live-Monitoring. Dort musst du die Verzögerung kennen, um Audio mit visuellen Ereignissen oder Benutzereingaben abzustimmen. Für die gesamte Ausgabelatenz addierst du outputLatency dazu. Dieser Wert enthält zusätzlich die Verzögerung des Betriebssystems und der Hardware.

Rückgabewert

Typ
number
Beschreibung
Verarbeitungslatenz des Kontexts in Sekunden als double, z. B. 0.005333 (≈ 256 Frames bei 48 kHz). Ist schreibgeschützt.

Beispiele

Latenz je nach latencyHint vergleichen

const hints = ['interactive', 'balanced', 'playback'];

for (const latencyHint of hints) {
  const ctx = new AudioContext({ latencyHint });
  console.log(`${latencyHint}: ${(ctx.baseLatency * 1000).toFixed(2)} ms`);
  await ctx.close();
}
interactive: 5.33 ms balanced: 10.67 ms playback: 21.33 ms (Werte je nach Browser, Betriebssystem und Hardware unterschiedlich)

Gesamte Ausgabelatenz berechnen

const ctx = new AudioContext({ latencyHint: 'interactive' });

const getTotalLatency = (context) => {
  const base = context.baseLatency ?? 0;
  const output = context.outputLatency ?? 0; // nicht überall verfügbar
  return base + output;
};

console.log(`Gesamt: ${(getTotalLatency(ctx) * 1000).toFixed(1)} ms`);
Gesamt: 25.3 ms

Visuelles Feedback mit dem Ton synchronisieren

const ctx = new AudioContext();
const button = document.querySelector('#drum');
const pad = document.querySelector('#pad');

button.addEventListener('click', async () => {
  if (ctx.state === 'suspended') await ctx.resume();

  const osc = ctx.createOscillator();
  osc.connect(ctx.destination);
  const start = ctx.currentTime + 0.05;
  osc.start(start);
  osc.stop(start + 0.1);

  // Ab jetzt vergehen 50 ms geplanter Vorlauf plus die Latenz des Kontexts
  const delayMs = (0.05 + ctx.baseLatency + (ctx.outputLatency ?? 0)) * 1000;
  setTimeout(() => pad.classList.add('flash'), delayMs);
  setTimeout(() => pad.classList.remove('flash'), delayMs + 100);
});

// Wichtig · Fallstricke

  • Nur bei AudioContext: OfflineAudioContext hat diese Eigenschaft nicht, weil dort nicht in Echtzeit gerendert wird.
  • Nicht die ganze Latenz: baseLatency enthält keine Verzögerung durch Betriebssystem, Treiber oder Bluetooth-Kopfhörer. Dafür gibt es outputLatency. Bei Bluetooth kann dieser Wert mehrere hundert Millisekunden betragen.
  • latencyHint ist nur ein Wunsch: Der Browser rundet auf Werte, die die Hardware unterstützt. Lies deshalb immer baseLatency aus, statt dich auf den angeforderten Wert zu verlassen.
  • Kompatibilität: Ältere Safari-Versionen (vor 14.1) und das veraltete webkitAudioContext kennen die Eigenschaft nicht, sie liefern dann undefined. Plane deshalb einen Ersatzwert ein, z. B. mit ctx.baseLatency ?? 0.
  • Einige Browser setzen den Wert zum Schutz vor Fingerprinting absichtlich auf eine gröbere Genauigkeit.