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

我正在研究使用Web Audio APIlogging麦克风数据并将其保存到磁盘的nodewebkit应用程序。

我已经使用了RecordRTC框架,但是它并没有公开将数据stream式传输到磁盘的方法(logging可能超过一个小时,这是必要的)。

我似乎无法find使用其他方法将数据stream式传输到磁盘的好方法。 如果有一个合适的方法来做到这一点,我将不胜感激这个工作的适当工具是什么。

然而,我现在的非工作解决scheme是:

  1. 使用WebAudio API创build一个ScriptProcessorNode来访问PCM数据
  2. 创build一个可读的stream缓冲区(使用stream缓冲区模块)并将其传送到一个fileWriter(由wav模块制作)
  3. 将onaudioprocess事件中的数据转换为16位整数,并将它们添加到可读stream中,以便可以将其写入

这是行不通的,因为ReadableStreamBuffer一次仅传送20个字节到fileWriter,而不是由于某种原因排队来自麦克风的所有字节。

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