Signatur
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
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
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');
// Wichtig · Fallstricke
- Frames statt Werte:
lengthzählt Frames pro Kanal, nicht alle Abtastwerte. Die Gesamtzahl der Werte istlength * numberOfChannels. - Nicht in Millisekunden: Die Zeitdauer liefert
durationin Sekunden.lengthhängt von der Abtastrate ab. - Abtastrate bei
decodeAudioData(): Die Methode rechnet die Datei auf diesampleRatedes Kontexts um. Eine Datei mit 44,1 kHz ergibt in einem Kontext mit 48 kHz deshalb einen größerenlength-Wert als in der Originaldatei. - Schreibgeschützt: Eine Zuweisung wird ignoriert, im Strict Mode löst sie einen
TypeErroraus. Für eine andere Länge muss man einen neuen Puffer anlegen und die Daten mitcopyToChannel()übertragen. - Grenzen beim Erstellen:
lengthmuss mindestens 1 sein, sonst wirft der Browser eineNotSupportedError-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 nurcreateBuffer().