AudioContext.createScriptProcessor() æ¹æ³
Deprecated
Avoid using this feature in new projects. This feature may be a candidate for removal from web standards or browsers. >
AudioContext æ¥å£ç createScriptProcessor() æ¹æ³å建ä¸ä¸ª ScriptProcessorNodeï¼ç¨äºç´æ¥ä½¿ç¨ JavaScript å¤çé³é¢ã
夿³¨ï¼æ¤ç¹æ§å·²è¢« AudioWorklet å AudioWorkletNode æ¥å£æ¿ä»£ã
è¯æ³
createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels)
åæ°
bufferSize-
ä»¥éæ ·å¸§ä¸ºåä½çç¼å²åºå¤§å°ãå ·ä½æ¥è®²ï¼ç¼å²åºå¤§å°å¿ é¡»æ¯ä¸é¢è¿äºå¼å½ä¸çæä¸ä¸ªï¼256ã512ã1024ã2048ã4096ã8192ã16384ãå¦ææªæä¾åæ°ï¼æè åæ°ä¸º 0ï¼ååå½åç¯å¢æåéçç¼å²åºå¤§å°ï¼åå¼ä¸º 2 ç广¬¡æ¹çä¸ä¸ªå¸¸æ°ï¼å ¶å¨è¯¥ç»ç¹çæ´ä¸ªçå½å¨æä¸é½ä¸åï¼ã
该å弿§å¶ç
audioprocessäºä»¶è¢«åæ´¾çé¢çï¼ä»¥åæ¯ä¸æ¬¡è°ç¨å¤å°éæ ·å¸§è¢«å¤çãæ´å°çbufferSizeæå³çæ´ä½çå»¶è¿ãèæ´å¤§çå¼åå¯ä»¥é¿å é³é¢çä¸æåæ éãæ¨èä¸è¦ç»å®å ·ä½çç¼å²åºå¤§å°ï¼è®©ç³»ç»èªå·±éä¸ä¸ªå¥½ç弿¥å¹³è¡¡å»¶è¿åé³é¢è´¨éã numberOfInputChannels-
æ´æ°ï¼ç¨äºæå®è¾å ¥ç»ç¹ç声éçæ°éï¼é»è®¤å¼ä¸º 2 䏿é«å¯å 32ã
numberOfOutputChannels-
æ´æ°ï¼ç¨äºæå®è¾åºç»ç¹ç声éçæ°éï¼é»è®¤å¼ä¸º 2 䏿é«å¯å 32ã
è¦åï¼Webkitï¼çæ¬ 31ï¼è¦æ±è°ç¨è¿ä¸ªæ¹æ³çæ¶åå¿
é¡»ä¼ å
¥ä¸ä¸ªææç bufferSizeã
夿³¨ï¼åæ¶å° numberOfInputChannelsãnumberOfOutputChannels è®¾ç½®ä¸ºé¶æ¯æ æçã
è¿åå¼
示ä¾
>使ç¨èæ¬å¤ç卿·»å ç½åªé³
ä¸é¢ç示ä¾å±ç¤ºäºå¦ä½ä½¿ç¨ ScriptProcessorNode è·åéè¿ AudioContext.decodeAudioData() å è½½çé³è½¨å¹¶å¯¹å
¶è¿è¡å¤çï¼ä¸ºè¾å
¥é³è½¨çæ¯ä¸ªé³é¢æ ·æ¬æ·»å ä¸ç¹ç½åªå£°ï¼ç¶åéè¿ AudioDestinationNode è¿è¡ææ¾ã
å¯¹äºæ¯ä¸ªééåæ¯ä¸ªéæ ·å¸§ï¼èæ¬èç¹ç audioprocess äºä»¶å¤çå¨é½ä¼ä½¿ç¨ç¸å
³ç audioProcessingEvent æ¥å¾ªç¯å¤çè¾å
¥ç¼å²åºçæ¯ä¸ªééåæ¯ä¸ªééä¸çæ¯ä¸ªæ ·æ¬ï¼å¹¶æ·»å å°éç½åªå£°ï¼ç¶åå°ç»æè®¾ç½®ä¸ºæ¯ç§æ
åµä¸çè¾åºæ ·æ¬ã
夿³¨ï¼ä½ å¯ä»¥å¨çº¿è¿è¡å®æ´ç示ä¾ï¼ææ¥çæºä»£ç ã
const myScript = document.querySelector("script");
const myPre = document.querySelector("pre");
const playButton = document.querySelector("button");
// å建 AudioContext ä¸ç¼å²æº
let audioCtx;
async function init() {
audioCtx = new AudioContext();
const source = audioCtx.createBufferSource();
// å建ä¸ä¸ªç¼å²åºå¤§å°ï¼bufferSizeï¼ä¸º 4096ã
// åä¸è¾å
¥åè¾åºééç ScriptProcessorNode
const scriptNode = audioCtx.createScriptProcessor(4096, 1, 1);
// ä½¿ç¨ fetch() å decodeAudioData() æ¥å è½½é³è½¨
try {
const response = await fetch("viper.ogg");
const arrayBuffer = await response.arrayBuffer();
source.buffer = await audioCtx.decodeAudioData(arrayBuffer);
} catch (err) {
console.error(
`Unable to fetch the audio file: ${name} Error: ${err.message}`,
);
}
// åç»ç¹æ·»å ä¸ä¸ªç¨äºå¤çé³é¢äºä»¶ç彿°
scriptNode.addEventListener("audioprocess", (audioProcessingEvent) => {
// è¿éçè¾å
¥ç¼å²åºå³ä¸ºæä»¬å颿å è½½çææ²
let inputBuffer = audioProcessingEvent.inputBuffer;
// è¾åºç¼å²åºåä¼å
å«å°è¦è¢«ä¿®æ¹ãææ¾çéæ ·
let outputBuffer = audioProcessingEvent.outputBuffer;
// å¨è¾åºééé´å¾ªç¯ï¼å¨æ¬ä¾ä¸ï¼è¾åºééä»
æä¸ä¸ªï¼
for (let channel = 0; channel < outputBuffer.numberOfChannels; channel++) {
let inputData = inputBuffer.getChannelData(channel);
let outputData = outputBuffer.getChannelData(channel);
// 循ç¯è¿ä»£ 4096 ç»éæ ·
for (let sample = 0; sample < inputBuffer.length; sample++) {
// 让è¾åºçåäºè¾å
¥
outputData[sample] = inputData[sample];
// ååå
¶ä¸å ä¸äºåªé³
outputData[sample] += (Math.random() * 2 - 1) * 0.1;
}
}
});
source.connect(scriptNode);
scriptNode.connect(audioCtx.destination);
source.start();
// å½ç¼å²æºåæ¢ææ¾çæ¶åï¼æå¼ä¸åçè¿æ¥
source.addEventListener("ended", () => {
source.disconnect(scriptNode);
scriptNode.disconnect(audioCtx.destination);
});
}
// è¿æ¥ææ¾æé®
playButton.addEventListener("click", () => {
if (!audioCtx) {
init();
}
});
è§è
| è§è |
|---|
| Web Audio API > # dom-baseaudiocontext-createscriptprocessor > |