Javascript 向扬声器发送音频缓冲区
以下是我想做的:Javascript 向扬声器发送音频缓冲区,javascript,websocket,audiocontext,audio-worklet,Javascript,Websocket,Audiocontext,Audio Worklet,以下是我想做的: 将麦克风音频发送至AudioWorketProcessor(works) 使用WebSocket(works)将结果从AudioWorkletProcessor发送到服务器 通过WebSocket接收回数据(works) 将数据发送到计算机的扬声器(如何操作?) 除了我不知道如何实施之外,一切都正常。以下是我所做的,简化了一些事情以保持对问题的关注: //一,。设置音频上下文的代码。将麦克风连接到工作集 const audioContext = new AudioCon
const audioContext = new AudioContext({ sampleRate: 8000 });
audioContext.audioWorklet.addModule('/common/recorderworkletprocess.js').then(
function () {
const recorder = new AudioWorkletNode(audioContext, 'recorder-worklet');
let constraints = { audio: true };
navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
const microphone = audioContext.createMediaStreamSource(stream);
microphone.connect(recorder);
recorder.connect(audioContext.destination);
});
}
);
//二,。AudioWorkletProcessor。将音频发送到WebSocket,WebSocket将音频作为二进制文件发送到服务器:
class RecorderWorkletProcessor extends AudioWorkletProcessor {
constructor() {
super();
}
process(inputs) {
const inputChannel = inputs[0][0]; //inputChannel Float32Array(128)
socket.send(inputChannel); // sent as byte[512]
return true;
}
}
registerProcessor('recorder-worklet', RecorderWorkletProcessor);
//3和4。最后,服务器发送回与接收到的数据完全相同的数据。WebSocket将其转换为ArrayBuffer(512)。在这里,我想尽一切努力将其作为音频输出到计算机的扬声器:
socket.messageReceived = function (evt) {
// evt.data contains an ArrayBuffer with length of 512
// I want this to be played on the computer's speakers. How to do this?
}
任何指导都将不胜感激。好的,我相信我能回答我的问题。这是不健全的,但它提供了我需要知道的
socket.messageReceived = function (evt) {
// evt.data contains an ArrayBuffer with length of 512
// I want this to be played on the computer's speakers. How to do this?
let fArr = new Float32Array(evt.data);
let.buf = audioContext.createBuffer(1, 128, 8000);
buf.copyToChannel(fArr, 0);
let player = audioContext.createBufferSource();
player.buffer = buf;
player.connect(audioContext.destination);
player.start(0);
}
嘿,我正试图重现一个类似的情况,但我一直无法访问AudioWorkletProcessor中的WebSocket。在您的代码中有进程(输入){const inputChannel=inputs[0][0];//inputChannel Float32Array(128)socket.send(inputChannel);//作为字节[512]发送返回true;}您是如何访问socket.send的?每当我试图从AudioWorkletProcessor类中启动一个新的WebSocket实例时,我总是遇到一个错误,即WebSocket没有定义。这只是一个标准的WebSocket连接。只需获取一个连接并确保它在范围内。我遇到的问题是获取AudioWorkletProcessor范围内的WebSocket连接。我不断收到WebSocket未在AudioWorkletProcessor.process中定义的错误。如果我尝试在AudioWorkletProcessor类中定义它,或者如果我尝试使用options.processorOptions传递WebSocket连接,它会说它无法克隆。如果你不介意我问你,你能展示一下你用来让websocket在你的AudioWorkletProcessor中工作的代码吗?谢谢。我试过你的例子,我有一个问题。声音是机器人的。你也遇到过这个问题吗?我觉得这和缓冲有关。我试着直接从worklet播放,和从socket播放没有区别。不,我没有经历过。