scriptNode.onaudioprocess 已弃用,有其他选择吗?

dev*_*per 6 javascript audio buffer html5-audio audiocontext

我想在说话时获取音频缓冲区,我用这个方法来检测它,但是我收到消息这个方法 onaudioprocess 已被弃用并且不会被触发,是否有任何替代方法并举例说明。

audioContext = new AudioContext({ sampleRate: 16000 });
scriptNode = (audioContext.createScriptProcessor || audioContext.createJavaScriptNode).call(audioContext, 1024, 1, 1);
scriptNode.onaudioprocess = function (audioEvent) {
  if (recording) {
    input = audioEvent.inputBuffer.getChannelData(0);
    // convert float audio data to 16-bit PCM
    var buffer = new ArrayBuffer(input.length * 2);
    var output = new DataView(buffer);
    for (var i = 0, offset = 0; i < input.length; i++, offset += 2) {
      var s = Math.max(-1, Math.min(1, input[i]));
      output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7fff, true);
    }
    ws.send(buffer);
  }
};
Run Code Online (Sandbox Code Playgroud)

Emi*_*ier 3

使用MediaStream Recording APIMediaDevices.getUserMedia()方法,您可以从麦克风流式传输音频并将其流式传输到录音机中。然后,每当记录器上触发事件时,记录器就可以通过 WebSocket 发送Blob对象ondataavailable

下面的函数创建一个流并将其传递给一个MediaRecorder实例。该实例将录制您的麦克风音频并能够将其发送到您的 WebSocket。返回的实例MediaRecorder来控制记录器。

async function streamMicrophoneAudioToSocket(ws) {
  let stream;
  const constraints = { video: false, audio: true };

  try {
    stream = await navigator.mediaDevices.getUserMedia(constraints);
  } catch (error) {
    throw new Error(`
      MediaDevices.getUserMedia() threw an error. 
      Stream did not open.
      ${error.name} - 
      ${error.message}
    `);
  }

  const recorder = new MediaRecorder(stream);

  recorder.addEventListener('dataavailable', ({ data }) => {
    ws.send(data);
  });

  recorder.start();
  return recorder;
});
Run Code Online (Sandbox Code Playgroud)

这样,如果您愿意,也可以通过调用录音机上的方法来停止录音。stop()

(async () => {
  const ws = new WebSocket('ws://yoururl.com');
  const recorder = await streamMicrophoneAudioToSocket(ws);

  document.addEventListener('click', event => {
    recorder.stop();
  });
}());
Run Code Online (Sandbox Code Playgroud)