如何导出Web音频流的最后3s数据

时间:2016-06-09 14:16:22

标签: javascript node.js web-audio-api

问题:我正在使用网络音频API。我需要缓冲一个不间断的音频流,就像一个无线电流。当我收到通知时,我需要获取过去的3s音频数据并将其发送到服务器。我怎么能做到这一点? nodejs有一个内置缓冲区,但它似乎不是一个循环缓冲区,如果我写一个不停的流,它似乎溢出。

帮助您理解我的问题的背景: 我正在实现基于环境音频的Web身份验证方法。简而言之,我需要比较两个音频信号(一个来自客户端,一个来自锚点设备,它们都与服务器同步),如果它们足够相似,则认证请求将被服务器批准。使用Web Audio API在客户端和锚点设备上实现音频录制。

我需要管理锚点设备上的缓冲区以传输环境音频。假设锚设备一直在运行,因此流不会结束。

1 个答案:

答案 0 :(得分:0)

您可以使用ScriptProcessorNode从流中捕获音频。虽然这已被弃用,但截至目前,浏览器实际上并没有实现新的AudioWorker。

var N = 1024;
var time = 3; // Desired time of capture;
var frame_holder = [];
var time_per_frame = N / context.sampleRate;
var num_frames = Math.ceil(time / time_per_frame); // Minimum number to meet time
var script = context.createScriptProcessor(N,1,1);
script.connect(context.destination);

script.onaudioprocess = function(e) {
  var input = e.inputBuffer.getChannelData(0);
  var output = e.outputBuffer.getChannelData(0);
  var copy = new Float32Array(input.length);
  for (var n=0; n<input.length; n++) {
    output[n] = 0.0; // Null this as I guess you are capturing microphone
    copy[n] = input[n];
  }
  // Now we need to see if we have more than 3s worth of frames
  if (frame_holder.length > num_frames) {
    frame_holder = frame_holder.slice(frame_holder.length-num_frames);
  }
  // Add in the current frame
  var temp = frame_holder.slice(1); // Cut off first frame;
  frame_holder = temp.concat([copy]); // Add the latest frame
}

然后对于实际传输,您只需要将复制的帧串在一起。它比试图保留一个长阵列更容易,当然这也是可能的。