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
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 dielength
für eine bestimmte Anzahl an Sekunden Audio zu bestimmen, verwenden SienumSeconds * 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 einesampleRate
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:
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.
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.
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 |