AudioWorkletProcessor
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit April 2021 browserübergreifend verfügbar.
Die AudioWorkletProcessor-Schnittstelle der Web Audio API repräsentiert den Audioverarbeitungscode hinter einem benutzerdefinierten AudioWorkletNode. Sie befindet sich im AudioWorkletGlobalScope und wird im Rendering-Thread der Web Audio API ausgeführt. Ein darauf basierender AudioWorkletNode wird dagegen im Hauptthread ausgeführt.
Konstruktor
Hinweis:
AudioWorkletProcessor und davon abgeleitete Klassen können nicht direkt durch benutzerseitigen Code instanziiert werden. Stattdessen werden ihre Instanzen ausschließlich intern erstellt, wenn ein zugehöriger AudioWorkletNode erzeugt wird. Der Konstruktor der abgeleiteten Klasse wird mit einem Optionsobjekt aufgerufen, sodass Sie eigene Initialisierungsschritte ausführen können. Einzelheiten finden Sie auf der Seite zum Konstruktor.
AudioWorkletProcessor()-
Erstellt eine neue Instanz eines
AudioWorkletProcessor-Objekts.
Instanzeigenschaften
portSchreibgeschützt-
Gibt einen
MessagePortzurück, der für die bidirektionale Kommunikation zwischen dem Prozessor und dem zugehörigenAudioWorkletNodeverwendet wird. Das andere Ende ist über die Eigenschaftportdes Nodes verfügbar.
Instanzmethoden
Die AudioWorkletProcessor-Schnittstelle definiert keine eigenen Methoden. Sie müssen jedoch eine Methode process() bereitstellen, die zur Verarbeitung des Audiostreams aufgerufen wird.
Ereignisse
Die AudioWorkletProcessor-Schnittstelle reagiert auf keine Ereignisse.
Hinweise zur Verwendung
>Abgeleitete Klassen
Um benutzerdefinierten Audioverarbeitungscode zu definieren, müssen Sie eine Klasse von der AudioWorkletProcessor-Schnittstelle ableiten. Obwohl die Methode process nicht auf der Schnittstelle definiert ist, muss die abgeleitete Klasse sie bereitstellen. Diese Methode wird für jeden Block von 128 Sample-Frames aufgerufen und erhält Eingabe- und Ausgabearrays sowie die berechneten Werte benutzerdefinierter AudioParams (falls vorhanden) als Parameter. Sie können die Eingaben und Audioparameterwerte verwenden, um das Ausgabearray zu füllen, das standardmäßig Stille enthält.
Wenn Sie für Ihren Node benutzerdefinierte AudioParams benötigen, können Sie optional eine parameterDescriptors-Eigenschaft als statischen Getter für den Prozessor bereitstellen. Das zurückgegebene Array von Objekten auf Grundlage von AudioParamDescriptor wird intern verwendet, um die AudioParams bei der Instanziierung des AudioWorkletNode zu erstellen.
Die resultierenden AudioParams befinden sich in der Eigenschaft parameters des Nodes und können mit Standardmethoden wie linearRampToValueAtTime automatisiert werden. Ihre berechneten Werte werden an die Methode process() des Prozessors übergeben, damit Sie die Ausgabe des Nodes entsprechend gestalten können.
Audio verarbeiten
Ein möglicher Ablauf zum Erstellen eines benutzerdefinierten Audioverarbeitungsmechanismus ist:
-
Erstellen Sie eine separate Datei.
-
Gehen Sie in dieser Datei wie folgt vor:
- Leiten Sie eine Klasse von
AudioWorkletProcessorab (siehe den Abschnitt „Abgeleitete Klassen“) und implementieren Sie darin Ihre eigene Methodeprocess(). - Registrieren Sie den Prozessor mit der Methode
AudioWorkletGlobalScope.registerProcessor().
- Leiten Sie eine Klasse von
-
Laden Sie die Datei mit der Methode
addModule()über die EigenschaftaudioWorkletIhres Audiokontexts. -
Erstellen Sie einen
AudioWorkletNode, der auf dem Prozessor basiert. Der Prozessor wird intern vomAudioWorkletNode-Konstruktor instanziiert. -
Verbinden Sie den Node mit den anderen Nodes.
Beispiele
Im folgenden Beispiel erstellen wir einen benutzerdefinierten AudioWorkletNode, der weißes Rauschen ausgibt.
Zuerst müssen wir einen benutzerdefinierten AudioWorkletProcessor definieren, der weißes Rauschen ausgibt, und ihn registrieren. Beachten Sie, dass dies in einer separaten Datei erfolgen sollte.
// white-noise-processor.js
class WhiteNoiseProcessor extends AudioWorkletProcessor {
process(inputs, outputs, parameters) {
const output = outputs[0];
output.forEach((channel) => {
for (let i = 0; i < channel.length; i++) {
channel[i] = Math.random() * 2 - 1;
}
});
return true;
}
}
registerProcessor("white-noise-processor", WhiteNoiseProcessor);
Anschließend laden wir den Prozessor in unserer Hauptskriptdatei, erstellen eine Instanz von AudioWorkletNode, der wir den Namen des Prozessors übergeben, und verbinden den Node dann mit einem Audiographen.
const audioContext = new AudioContext();
await audioContext.audioWorklet.addModule("white-noise-processor.js");
const whiteNoiseNode = new AudioWorkletNode(
audioContext,
"white-noise-processor",
);
whiteNoiseNode.connect(audioContext.destination);
Spezifikationen
| Spezifikation |
|---|
| Web Audio API> # AudioWorkletProcessor> |