如何导出网络音频流的最后3个数据
问题描述:
问题:我正在使用网络音频API。我需要缓冲一个不间断的音频流,比如无线电流。当我收到通知时,我需要获取过去3s的音频数据并将其发送到服务器。我怎么能做到这一点? nodejs有一个内置缓冲区,但它似乎不是一个循环缓冲区,如果我写入一个不间断的流,它似乎溢出。如何导出网络音频流的最后3个数据
帮助你理解我的问题的背景: 我正在实现基于环境音频的Web认证方法。简而言之,我需要比较两段音频信号(一个来自客户端,另一个来自主设备,它们全部与服务器同步),如果它们足够相似,认证请求将被服务器批准。使用网络音频API在客户端和主播设备上实现录音。
我需要管理锚设备上的缓冲区以流式传输环境音频。锚设备应该始终运行,所以流不会结束。
答
您可以使用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
}
那么对于实际的传输,你只需要字符串复制帧在一起。比试图保持一个长阵列容易,但这当然也是可能的。