Start · Sprachen · JavaScript · Referenz · AudioBuffer.length

AudioBuffer.length

Eigenschaft

Schreibgeschützte Ganzzahl mit der Anzahl der Abtastrahmen (Sample-Frames) pro Kanal, die im <code>AudioBuffer</code> gespeichert sind.

seit JavaScript Baseline: alle modernen Browser (Web Audio API) Kategorie: webapi

Signatur

AudioBuffer.length

Beschreibung

Die schreibgeschützte Eigenschaft length eines AudioBuffer gibt an, wie viele Abtastrahmen (Sample-Frames) der Puffer enthält. Ein Abtastrahmen umfasst genau einen Abtastwert pro Kanal. Ein Stereo-Puffer mit length === 44100 enthält also 44.100 Werte je Kanal, insgesamt 88.200 Werte.

Der Wert entspricht der Länge jedes einzelnen Float32Array, das getChannelData() liefert. Deshalb eignet sich length als Obergrenze für Schleifen, mit denen man Samples liest, erzeugt oder verändert, etwa für Rauschgeneratoren, Hüllkurven, Normalisierung oder Wellenform-Darstellungen.

Zwischen length, sampleRate und duration gilt: duration = length / sampleRate. Die Länge wird beim Erstellen festgelegt, entweder über new AudioBuffer({ length, sampleRate, numberOfChannels }), über BaseAudioContext.createBuffer() oder durch decodeAudioData(). Danach lässt sie sich nicht mehr ändern.

Rückgabewert

Typ
number
Beschreibung
Positive Ganzzahl (unsigned long) mit der Anzahl der Abtastrahmen pro Kanal.

Beispiele

Länge, Abtastrate und Dauer vergleichen

const ctx = new AudioContext();
// 2 Sekunden Stereo bei 48 kHz
const buffer = ctx.createBuffer(2, 48000 * 2, 48000);

console.log(buffer.length);                       // Abtastrahmen pro Kanal
console.log(buffer.length / buffer.sampleRate);   // selbst berechnete Dauer
console.log(buffer.duration);                     // eingebaute Dauer
96000 2 2

Weißes Rauschen erzeugen

const ctx = new AudioContext();
const buffer = new AudioBuffer({
  numberOfChannels: 1,
  length: ctx.sampleRate, // 1 Sekunde
  sampleRate: ctx.sampleRate
});

const data = buffer.getChannelData(0);
for (let i = 0; i < buffer.length; i++) {
  data[i] = Math.random() * 2 - 1;
}

const source = new AudioBufferSourceNode(ctx, { buffer });
source.connect(ctx.destination);
source.start();

Datei dekodieren und Spitzenpegel ermitteln

const ctx = new AudioContext();

const analyse = async (url) => {
  const response = await fetch(url);
  const audio = await ctx.decodeAudioData(await response.arrayBuffer());

  let peak = 0;
  for (let ch = 0; ch < audio.numberOfChannels; ch++) {
    const samples = audio.getChannelData(ch);
    for (let i = 0; i < audio.length; i++) {
      peak = Math.max(peak, Math.abs(samples[i]));
    }
  }
  console.log(`Frames: ${audio.length}, Spitzenpegel: ${peak.toFixed(3)}`);
};

analyse('/sounds/beispiel.mp3');
Frames: 220500, Spitzenpegel: 0.981

// Wichtig · Fallstricke

  • Frames statt Werte: length zählt Frames pro Kanal, nicht alle Abtastwerte. Die Gesamtzahl der Werte ist length * numberOfChannels.
  • Nicht in Millisekunden: Die Zeitdauer liefert duration in Sekunden. length hängt von der Abtastrate ab.
  • Abtastrate bei decodeAudioData(): Die Methode rechnet die Datei auf die sampleRate des Kontexts um. Eine Datei mit 44,1 kHz ergibt in einem Kontext mit 48 kHz deshalb einen größeren length-Wert als in der Originaldatei.
  • Schreibgeschützt: Eine Zuweisung wird ignoriert, im Strict Mode löst sie einen TypeError aus. Für eine andere Länge muss man einen neuen Puffer anlegen und die Daten mit copyToChannel() übertragen.
  • Grenzen beim Erstellen: length muss mindestens 1 sein, sonst wirft der Browser eine NotSupportedError-DOMException. Sehr große Puffer belegen viel Arbeitsspeicher (4 Byte pro Wert).
  • Kompatibilität: Wird von allen modernen Browsern unterstützt. Der Konstruktor new AudioBuffer() fehlt in sehr alten Safari-Versionen. Dort funktioniert nur createBuffer().