2016-06-09 24 views
0

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

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

我需要管理锚设备上的缓冲区以流式传输环境音频。锚设备应该始终运行,所以流不会结束。

回答

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 
} 

那么对于实际的传输,你只需要字符串复制帧在一起。比试图保持一个长阵列容易,但这当然也是可能的。