Start · Sprachen · JavaScript · Referenz · OfflineAudioContext.length

OfflineAudioContext.length

Eigenschaft

Nur lesbare Ganzzahl: die Länge des Render-Puffers eines <code>OfflineAudioContext</code> in Sample-Frames (pro Kanal).

seit JavaScript Baseline: alle modernen Browser (seit 2021) Kategorie: webapi

Signatur

OfflineAudioContext.length

Beschreibung

Die schreibgeschützte Eigenschaft length gibt an, wie viele Sample-Frames der OfflineAudioContext beim Rendern erzeugt. Der Wert entspricht genau dem Argument length, das beim Konstruktor angegeben wurde. Er gilt pro Kanal, zählt also Frames und nicht einzelne Samples über alle Kanäle hinweg.

Die Dauer in Sekunden erhalten Sie mit length / sampleRate. Mit der Eigenschaft können Sie z. B. einen Fortschrittsbalken berechnen (currentTime * sampleRate / length), Zeitpunkte für suspend() festlegen oder prüfen, ob ein geplanter Ton überhaupt noch in den Render-Zeitraum fällt.

Der AudioBuffer, den startRendering() liefert, hat dieselbe length wie der Kontext. Sie ist auch dann schon verfügbar, wenn das Rendern noch gar nicht begonnen hat.

Rückgabewert

Typ
number
Beschreibung
Positive Ganzzahl (unsigned long): Anzahl der Sample-Frames im Render-Puffer.

Beispiele

Länge und Dauer auslesen

const ctx = new OfflineAudioContext({
  numberOfChannels: 2,
  length: 44100 * 3, // 3 Sekunden
  sampleRate: 44100,
});

console.log(ctx.length);
console.log(`${ctx.length / ctx.sampleRate} s`);
132300 3 s

Ton rendern und Pufferlänge vergleichen

const renderTone = async () => {
  const ctx = new OfflineAudioContext(1, 48000, 48000);
  const osc = new OscillatorNode(ctx, { frequency: 440 });
  osc.connect(ctx.destination);
  osc.start();
  osc.stop(ctx.length / ctx.sampleRate);

  const buffer = await ctx.startRendering();
  console.log(buffer.length === ctx.length, buffer.duration);
};

renderTone();
true 1

Fortschritt beim Rendern mit suspend() anzeigen

const renderWithProgress = async () => {
  const ctx = new OfflineAudioContext(2, 44100 * 10, 44100);
  const osc = new OscillatorNode(ctx);
  osc.connect(ctx.destination);
  osc.start();

  const totalSeconds = ctx.length / ctx.sampleRate;
  for (let t = 2; t < totalSeconds; t += 2) {
    ctx.suspend(t).then(() => {
      const percent = Math.round((ctx.currentTime * ctx.sampleRate / ctx.length) * 100);
      console.log(`Fortschritt: ${percent} %`);
      ctx.resume();
    });
  }

  await ctx.startRendering();
  console.log('Fertig');
};

renderWithProgress();
Fortschritt: 20 % Fortschritt: 40 % Fortschritt: 60 % Fortschritt: 80 % Fertig

// Wichtig · Fallstricke

  • Schreibgeschützt: Zuweisungen wie ctx.length = 1000 werden ignoriert (im Strict Mode gibt es einen TypeError). Die Länge lässt sich nach dem Erzeugen nicht mehr ändern. Für eine andere Länge brauchen Sie einen neuen Kontext.
  • Frames statt Bytes: Der Speicherbedarf beträgt ungefähr length × numberOfChannels × 4 Byte (Float32). Sehr lange Puffer können viel Arbeitsspeicher belegen.
  • Wenn im Konstruktor length 0 ist, wirft er einen NotSupportedError. Mit der Kurzform new OfflineAudioContext(channels, length, sampleRate) kommen auch ältere Browser zurecht.
  • Kompatibilität: Safari hat die Eigenschaft erst ab Version 14.1 unterstützt, ältere WebKit-Versionen nur mit Präfix (webkitOfflineAudioContext). Falls sie fehlt, können Sie die Länge über renderedBuffer.length ermitteln.