BaseAudioContext: createBuffer()-Methode

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2021.

Die createBuffer()-Methode der Schnittstelle BaseAudioContext wird verwendet, um ein neues, leeres AudioBuffer-Objekt zu erstellen. Dieses kann dann mit Daten gefüllt und über einen AudioBufferSourceNode abgespielt werden.

Für weitere Details über Audio-Puffer schauen Sie sich die AudioBuffer-Referenzseite an.

Hinweis:>createBuffer() konnte früher komprimierte Daten verarbeiten und dekodierte Samples zurückgeben, aber diese Fähigkeit wurde aus der Spezifikation entfernt, da die gesamte Dekodierung im Haupt-Thread durchgeführt wurde, was die Ausführung anderer Codes blockierte. Die asynchrone Methode decodeAudioData() übernimmt diese Aufgabe – sie nimmt komprimierte Audiodaten, wie eine MP3-Datei, und gibt direkt ein AudioBuffer zurück, das Sie dann über einen AudioBufferSourceNode abspielen können. Für einfache Anwendungsfälle wie das Abspielen eines MP3s sollten Sie decodeAudioData() verwenden.

Für eine ausführliche Erklärung, wie Audio-Puffer funktionieren, einschließlich der Funktion der Parameter, lesen Sie Audio-Puffer: Frames, Samples und Kanäle aus unserem Leitfaden zu den Grundkonzepten.

Syntax

js
createBuffer(numOfChannels, length, sampleRate)

Parameter

numOfChannels

Ein Integer, der die Anzahl der Kanäle darstellt, die dieser Puffer haben soll. Der Standardwert ist 1, und alle Benutzeragenten müssen mindestens 32 Kanäle unterstützen.

length

Ein Integer, der die Größe des Puffers in Sample-Frames darstellt (wobei jeder Sample-Frame die Größe eines Samples in Bytes multipliziert mit numOfChannels ist). Um die length für eine bestimmte Anzahl an Sekunden Audio zu bestimmen, verwenden Sie numSeconds * sampleRate.

sampleRate

Die Abtastrate der linearen Audiodaten in Sample-Frames pro Sekunde. Alle Browser müssen Abtastraten im Bereich von mindestens 8.000 Hz bis 96.000 Hz unterstützen.

Rückgabewert

Ein AudioBuffer, das basierend auf den angegebenen Optionen konfiguriert ist.

Ausnahmen

NotSupportedError DOMException

Wirft einen Fehler, wenn eine oder mehrere Optionen negativ oder anderweitig ungültig sind (wie numberOfChannels, das höher ist als unterstützt, oder eine sampleRate außerhalb des Nominalbereichs).

RangeError

Wirft einen Fehler, wenn nicht genügend Speicher verfügbar ist, um den Puffer zuzuweisen.

Beispiele

Zuerst ein paar einfache, triviale Beispiele, um zu erklären, wie die Parameter verwendet werden:

js
const audioCtx = new AudioContext();
const buffer = audioCtx.createBuffer(2, 22050, 44100);

Wenn Sie diesen Aufruf verwenden, erhalten Sie einen Stereopuffer (zwei Kanäle), der, wenn er in einem AudioContext bei 44100 Hz (sehr üblich, die meisten normalen Soundkarten arbeiten mit dieser Rate) abgespielt wird, 0,5 Sekunden dauert: 22050 Frames / 44100 Hz = 0,5 Sekunden.

js
const audioCtx = new AudioContext();
const buffer = audioCtx.createBuffer(1, 22050, 22050);

Wenn Sie diesen Aufruf verwenden, erhalten Sie einen Monopuffer (ein Kanal), der, wenn er in einem AudioContext bei 44100 Hz abgespielt wird, automatisch auf 44100 Hz neu abgetastet wird (und daher 44100 Frames ergibt) und 1,0 Sekunde dauert: 44100 Frames / 44100 Hz = 1 Sekunde.

Hinweis: Audio-Neuabtastung ist sehr ähnlich zur Bildgrößenänderung: Wenn Sie ein 16 x 16 Bild haben und es auf ein 32 x 32 Gebiet vergrößern möchten, ändern (neuabtasten) Sie die Größe. Das Ergebnis hat weniger Qualität (es kann unscharf oder kantig sein, abhängig vom Vergrößerungsalgorithmus), aber es funktioniert, und das vergrößerte Bild nimmt weniger Platz ein. Neuabgetastetes Audio ist genau dasselbe – Sie sparen Platz, aber in der Praxis können Sie hohe Frequenzinhalte (Höhenklang) nicht richtig reproduzieren.

Schauen wir uns nun ein komplexeres createBuffer()-Beispiel an, in dem wir einen Dreisekunden-Puffer erstellen, ihn mit Weißem Rauschen füllen und dann über einen AudioBufferSourceNode abspielen. Die Kommentare sollten klar erklären, was vor sich geht. Sie können den Code auch live ausführen oder den Quellcode ansehen.

js
const audioCtx = new AudioContext();

// Create an empty three-second stereo buffer at the sample rate of the AudioContext
const myArrayBuffer = audioCtx.createBuffer(
  2,
  audioCtx.sampleRate * 3,
  audioCtx.sampleRate,
);

// Fill the buffer with white noise;
// just random values between -1.0 and 1.0
for (let channel = 0; channel < myArrayBuffer.numberOfChannels; channel++) {
  // This gives us the actual ArrayBuffer that contains the data
  const nowBuffering = myArrayBuffer.getChannelData(channel);
  for (let i = 0; i < myArrayBuffer.length; i++) {
    // Math.random() is in [0; 1.0]
    // audio needs to be in [-1.0; 1.0]
    nowBuffering[i] = Math.random() * 2 - 1;
  }
}

// Get an AudioBufferSourceNode.
// This is the AudioNode to use when we want to play an AudioBuffer
const source = audioCtx.createBufferSource();
// set the buffer in the AudioBufferSourceNode
source.buffer = myArrayBuffer;
// connect the AudioBufferSourceNode to the
// destination so we can hear the sound
source.connect(audioCtx.destination);
// start the source playing
source.start();

Spezifikationen

Specification
Web Audio API
# dom-baseaudiocontext-createbuffer

Browser-Kompatibilität

Siehe auch