Отправить AudioBuffer на динамик

Вот что я хочу сделать:

  1. Отправить звук с микрофона в AudioWorketProcessor (работает)
  2. Отправить результаты из AudioWorkletProcessor на сервер с помощью WebSockets (работает)
  3. Получать данные через WebSockets (работает)
  4. Отправлять данные на динамики компьютера (как это сделать?)

Все работает, за исключением того, что я не знаю, как реализовать №4. Вот что у меня есть, некоторые вещи упрощены, чтобы сосредоточиться на проблеме:

// 1. Код для настройки звукового контекста. Подключает микрофон к worklet

    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. AudioWorkletProcessor. Отправляет звук в 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?
  }

Любое руководство будет оценено.

1 ответ

Решение

Хорошо, я думаю, что смогу ответить на свой вопрос. Это не надежно, но дает то, что мне нужно знать.

  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);
  }
Другие вопросы по тегам