javascript - 将音频缓冲区发送到扬声器

标签 javascript websocket audiocontext audio-worklet

这就是我想做的:

  1. 将麦克风音频发送到 AudioWorketProcessor(有效)
  2. 使用 WebSockets 将结果从 AudioWorkletProcessor 发送到服务器(有效)
  3. 通过 WebSocket 接收回数据(有效)
  4. 将数据发送到计算机的扬声器(如何操作?)

一切正常,只是我不知道如何实现#4。这就是我所拥有的,一些事情被简化以保持对问题的关注:

//1.设置音频上下文的代码。将麦克风连接到工作集

    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);
            });
        }
    );

//2. AudioWorklet处理器。将音频发送到 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);
  }

关于javascript - 将音频缓冲区发送到扬声器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62271985/

相关文章:

javascript - 无法使用javascript将数据添加到firebase实时数据库中

node.js - nginx 和 socket.io 解决方法

javascript - 如何从日期字符串格式获取日期对象

javascript - 从 HTML Canvas 获取像素的颜色而不使用 getImageData()?

javascript - 在最少的运行中有效地查找并返回多个值的数组位置

nginx - 使用 RTMP 并通过 WebSocket 分发

go - 通过消息关闭 Websocket 连接

javascript - AudioContext() 的多个来源

javascript - 网络音频 api 卷积器似乎没有输出零

即使在创建 onclick 时,Safari AudioContext 也会暂停