/** * AudioWorklet 处理器 * 用于高性能实时音频采集 */ class AudioProcessor extends AudioWorkletProcessor { process(inputs, outputs, parameters) { const input = inputs[0]; if (input && input[0]) { // 获取单声道音频数据 const inputChannel = input[0]; // 转换为16位PCM格式 const pcmData = this.floatTo16BitPCM(inputChannel); // 发送到主线程 this.port.postMessage(pcmData); } // 返回true表示继续处理 return true; } /** * 将Float32Array转换为Int16Array (PCM格式) */ floatTo16BitPCM(float32Array) { const int16Array = new Int16Array(float32Array.length); for (let i = 0; i < float32Array.length; i++) { // 限制范围在 [-1, 1] const s = Math.max(-1, Math.min(1, float32Array[i])); // 转换为16位整数 int16Array[i] = s < 0 ? s * 0x8000 : s * 0x7FFF; } return int16Array; } } registerProcessor('audio-processor', AudioProcessor);