Web Audio: Migrate from ScriptProcessor to AudioWorklet
// script.js
button . onclick = async ( ) => {
const microphoneStream = await navigator . mediaDevices . getUserMedia ( {
audio : true ,
} ) ;
const context = new AudioContext ( ) ;
const source = context . createMediaStreamSource ( microphoneStream ) ;
const scriptProcessor = context . createScriptProcessor ( 1024 ) ;
scriptProcessor . onaudioprocess = ( { inputBuffer, outputBuffer } ) => {
const inputData = inputBuffer . getChannelData ( 0 ) ;
outputBuffer . copyToChannel ( inputData , 0 ) ;
} ;
source . connect ( scriptProcessor ) . connect ( context . destination ) ;
} ;
// script.js
button . onclick = async ( ) => {
const microphoneStream = await navigator . mediaDevices . getUserMedia ( {
audio : true ,
} ) ;
const context = new AudioContext ( ) ;
const source = context . createMediaStreamSource ( microphoneStream ) ;
await context . audioWorklet . addModule ( "worklet-processor.js" ) ;
const worklet = new AudioWorkletNode ( context , "worklet-processor" ) ;
source . connect ( worklet ) . connect ( context . destination ) ;
} ;
// worklet-processor.js
class WorkletProcessor extends AudioWorkletProcessor {
process ( [ input ] , [ output ] ) {
input [ 0 ] . forEach ( ( sample , i ) => output [ 0 ] [ i ] = sample ) ;
return true ;
}
}
registerProcessor ( "worklet-processor" , WorkletProcessor ) ;
- const scriptProcessor = context.createScriptProcessor(1024);
- scriptProcessor.onaudioprocess = ({ inputBuffer, outputBuffer }) => {
- const inputData = inputBuffer.getChannelData(0);
- outputBuffer.copyToChannel(inputData, 0);
- };
+ await context.audioWorklet.addModule("worklet-processor.js");
+ const worklet = new AudioWorkletNode(context, "worklet-processor");
- source.connect(scriptProcessor).connect(context.destination);
+ source.connect(worklet).connect(context.destination);
+ // worklet-processor.js
+ class WorkletProcessor extends AudioWorkletProcessor {
+ process([input], [output]) {
+ input[0].forEach((sample, i) => output[0][i] = sample);
+ return true;
+ }
+ }
+
+ registerProcessor("worklet-processor", WorkletProcessor);