将Web Audio API麦克风数据流式传输到nodewebkit上的磁盘

Seb*_*Seb 5 stream wav node.js node-webkit web-audio-api

我正在开发一个nodewebkit应用程序,该应用程序使用Web Audio API记录麦克风数据并将其保存到磁盘.

我已经使用了RecordRTC框架,但是随着录制的进行,它没有提供将数据流式传输到磁盘的方法(考虑到录制时间可能超过一小时,这是必要的).

我似乎无法找到使用其他方法将数据流式传输到磁盘的好方法.如果有一个正确的方法来做到这一点,我会很感激有关正确的工具是什么的提示.

但是,我现在的非工作解决方案是:

  1. 使用WebAudio API创建ScriptProcessorNode以访问PCM数据
  2. 创建一个可读的流缓冲区(使用流缓冲区模块)并将其传递给fileWriter(使用wav模块创建)
  3. 在onaudioprocess事件中将该数据转换为16位整数,并将它们添加到可读流中,以便可以编写它们

这没有用,因为ReadableStreamBuffer一次只向fileWriter传输20个字节,而不是因为某些原因而排队来自麦克风的所有字节.

var wav = require('wav');
var streamBuffers = require("stream-buffers");

function convertFloat32ToInt16(buffer) {
  var l = buffer.length;
  var buf = new Int16Array(l);
  while (l--) {
    buf[l] = Math.min(1, buffer[l])*0x7FFF;
  }
  return buf.buffer;
}

var filePath = utils.getCwd() + '/recordings/demo.wav';
var fileWriter = new wav.FileWriter( filePath, {
  channels: 1,
  sampleRate: 48000,
  bitDepth: 16
});

var myReadableStreamBuffer = new streamBuffers.ReadableStreamBuffer({
    frequency:  0,        // in milliseconds.
    chunkSize: 2048        // in bytes.
});

myReadableStreamBuffer.pipe(fileWriter);

source.connect(scriptNode);
scriptNode.connect(context.destination);

scriptNode.onaudioprocess = function(e) {
    var arrayBuffer = convertFloat32ToInt16(e.inputBuffer.getChannelData(0));
    myReadableStreamBuffer.put(arrayBuffer);
    // close  myReadableStreamBuffer and  run fileWriter.end() when recording is done
};
Run Code Online (Sandbox Code Playgroud)