2016-06-09 2 views
0

Вопрос: Я использую API веб-аудио. Мне нужно буферировать непрерывный аудиопоток, например, радиопоток. и когда я получаю уведомление, мне нужно получить последние 3-х аудиоданные и отправить их на сервер. Как я могу добиться этого? У nodejs есть встроенный буфер, но он не является круговым буфером, если я пишу в него непрерывный поток, он, кажется, переполнен.как экспортировать последние 3s данные веб-аудиопотока

Справочная информация, чтобы помочь вам понять мой вопрос: Я реализую метод аутентификации на основе обычного звука. Вкратце, мне нужно сравнить два звука аудиосигнала (один от клиента и один от устройства привязки, они все время синхронизируются с сервером), если они достаточно похожи, запрос аутентификации будет одобрен сервером. Запись звука выполняется как на клиенте, так и на якоре с использованием веб-аудио 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 
} 

Тогда для фактической передачи, вам просто нужно натягивать скопированные кадры вместе. Это проще, чем пытаться сохранить один длинный массив, хотя, конечно, это также возможно.