2016-06-09 48 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 
} 

那麼對於實際的傳輸,你只需要字符串複製幀在一起。比試圖保持一個長陣列容易,但這當然也是可能的。