GateWay/public/audio-processor.js

40 lines
1.3 KiB
JavaScript
Raw Normal View History

2025-02-19 07:46:51 +08:00
class AudioProcessor extends AudioWorkletProcessor {
constructor() {
super();
this.desiredBufferSize = 20*1024; // 期望的缓冲区大小
this.buffer = new Float32Array(this.desiredBufferSize);
this.bufferIndex = 0;
}
process(inputs, outputs, parameters) {
const input = inputs[0];
const channel = input[0];
if (channel && channel.length > 0) {
// 将新数据添加到缓冲区
for (let i = 0; i < channel.length; i++) {
this.buffer[this.bufferIndex++] = channel[i];
// 当缓冲区满时,发送数据
if (this.bufferIndex >= this.desiredBufferSize) {
// 将浮点音频数据转换为16位整数
const pcmData = new Int16Array(this.desiredBufferSize);
for (let j = 0; j < this.desiredBufferSize; j++) {
pcmData[j] = Math.min(Math.max(this.buffer[j] * 32767, -32767), 32767);
}
// 发送数据到主线程
this.port.postMessage(pcmData.buffer, [pcmData.buffer]);
// 重置缓冲区
this.buffer = new Float32Array(this.desiredBufferSize);
this.bufferIndex = 0;
}
}
}
return true;
}
}
registerProcessor('audio-processor', AudioProcessor);