首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在javascript中使用audioWorklet和AudioWorkletProcessor录制音频?

如何在javascript中使用audioWorklet和AudioWorkletProcessor录制音频?
EN

Stack Overflow用户
提问于 2019-06-14 06:25:52
回答 1查看 1.7K关注 0票数 1

我有下面的逻辑来记录(在AudioContext中设置samplerate = 16000,单通道记录,只考虑一个通道)

  1. 我从AudioWorklet中设置了一个参数AudioWorklet,根据这个参数,AudioWorkletProcessor将开始将数据放入缓冲区,如下所示
代码语言:javascript
复制
  process(inputs, outputs, parameters) {
    const isRecordingValues = parameters.isRecording;
    //taking first input
    var input0 = inputs[0];
    var inputChannel = input0[0];
    if (isRecordingValues.length ===1){
      const shouldRecord = isRecordingValues[0] === 1;
      if (!shouldRecord && !this._isBufferEmpty()) {

        this._flush();
        this._recordingStopped();
      }

      if (shouldRecord) {
            this._appendToBuffer(inputChannel);
      }

    }
    return true;
  }

}

_appendToBuffer如下所示:

代码语言:javascript
复制
  _appendToBuffer(value) {
    if (this._isBufferFull()) {
      this._flush();
    }

    // Here _buffer is of type Float32Array 
    this._buffer.set(value, this._bytesWritten);
    this._bytesWritten += value.length;
  }
  1. 在_flush方法中,我将_buffer的内容发送到AudioWorklet,如下所示:
代码语言:javascript
复制
    var blob = this._exportWAV(buffer, this._bytesWritten);
    this.port.postMessage({
      eventType: 'data',
      audioBuffer: blob 
    });

这里的缓冲区包含-1.0到1.0之间的值。

  1. 我以ArrayBuffer对象的形式接收ArrayBuffer中的数据,并将其作为Wave下载。无论文件的大小如何,我都可以在Windows中打开该文件,而不会出错,但它的持续时间不到一秒,播放结束。

我相信我在process方法中做错了什么,在缓冲区中记录的数据格式不正确。

我在这里做错什么了?

EN

回答 1

Stack Overflow用户

发布于 2019-06-24 06:11:58

我将_flush方法更改如下:

代码语言:javascript
复制
_flush() {

  let buffer = this._buffer;
  if (this._bytesWritten < this._bufferSize) {
    buffer = buffer.slice(0, this._bytesWritten);
  }
  this.port.postMessage({
    eventType: 'data',
    audioBuffer: buffer
  });

  this._initBuffer();}

因此,我将直接将缓冲区发送到AudioWorklet。当我在AudioWorklet中接收到这个缓冲区时,我将它作为Blob发送到Flask应用程序,如下所示

代码语言:javascript
复制
const audioData = e.data.audioBuffer.buffer;
socket.emit( 'my event', {
   blob : new Blob([audioData], { type: 'audio/wav' })
});

这给了我简单的浮点数,在-1.0到1.0之间可以在Flask应用程序中使用。然后,我将这些浮点数转换为以下功能

代码语言:javascript
复制
def convert(raw_floats):
   data = raw_floats
   floats = array.array('f', data)
   samples = [int(sample * 32767)
           for sample in floats]
   raw_ints = struct.pack("<%dh" % len(samples), *samples)
   return raw_ints

我将这些raw_ints保存到WAVE文件,这是可在中播放的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56592566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档