2015-10-20 106 views
0

此代碼適用於Windows 7中的Firefox。它在揚聲器上播放變形的麥克風。它被javascript代碼轉換爲數字,範圍爲-1到1,音頻幅度每秒多次。它有1/3秒的延遲,但相同的硬件在運行java時速度更快,我的https://sourceforge.net/projects/jsoundcard軟件通過計時統計來調整緩衝區的使用。 OS進程線程優先級提高後,它們都會變得更快,但Java仍然快得多。 Theres沒有理由Firefox或Web Audio API應該有更多的延遲,儘管它已成爲瀏覽器中不能正常工作的標準,但HTML5(這是一個正在開發的標準)正在發生變化。 Web Audio API中是否存在調整麥克風緩衝區大小的地方?如何在Web Audio API中設置麥克風緩衝區大小以避免1/3秒的延遲(在Java中速度更快)?

var volume = .7; 
var maxMicrophoneAmplitude = 1; 
var soundFunc = function(ins, outs){ 
    var microphoneAmplitude = ins[0]; 
    var estimatedFramesPerSecond = 44100; 
    var decaySeconds = .1; 
    var decay = 1/(estimatedFramesPerSecond*decaySeconds); 
    maxMicrophoneAmplitude = Math.max(maxMicrophoneAmplitude, microphoneAmplitude)*(1-decay); 
    microphoneAmplitude/maxMicrophoneAmplitude * volume 
    outs[0] = microphoneAmplitude/maxMicrophoneAmplitude * volume; 
}; 
soundFunc.inSize = 1; 
soundFunc.outSize = 1; 
var inputNodes = {}; 
window.onload = function(){ 
    var context = new AudioContext(); 
    if(!navigator.getUserMedia && navigator['mozGetUserMedia']){ 
     navigator.getUserMedia = navigator['mozGetUserMedia']; 
    } 
    if(!navigator.getUserMedia && navigator['webkitGetUserMedia']){ 
     navigator.getUserMedia = navigator['webkitGetUserMedia']; 
    } 
    if(!navigator.getUserMedia && navigator['msGetUserMedia']){ 
     navigator.getUserMedia = navigator['msGetUserMedia']; 
    } 
    var framesPerBuffer = 1024; 
    var scriptNode = context.createScriptProcessor(framesPerBuffer, 1, 1); 
    scriptNode.onaudioprocess = function(audioProcessingEvent){ 
     var inputBuffer = audioProcessingEvent.inputBuffer; 
     var outputBuffer = audioProcessingEvent.outputBuffer; 
     var chansIn = []; 
     var chansOut = []; 
     for(var c=0; c<inputBuffer.numberOfChannels; c++){ 
      chansIn[c] = inputBuffer.getChannelData(c); 
     } 
     for(var c=0; c<outputBuffer.numberOfChannels; c++){ 
      chansOut[c] = outputBuffer.getChannelData(c); 
     } 
     var ins = new Float32Array(inputBuffer.numberOfChannels); 
     var outs = new Float32Array(outputBuffer.numberOfChannels); 
     for(var f=0; f<framesPerBuffer; f++){ 
      for(var c=0; c<inputBuffer.numberOfChannels; c++){ 
       ins[c] = chansIn[c][f]; 
      } 
      soundFunc(ins, outs); 
      for(var c=0; c<outputBuffer.numberOfChannels; c++){ 
       chansOut[c][f] = outs[c]; 
      } 
     }  
    } 
    if(navigator.getUserMedia){ 
     navigator.getUserMedia(
      {'audio':true}, 
      function(stream){ 
       var input = context.createMediaStreamSource(stream); 
       //http://stackoverflow.com/questions/22860468/html5-microphone-capture-stops-after-5-seconds-in-firefox says to save a reference to avoid sound ending after 5 seconds 
       inputNodes.mic = input; 
       input.connect(scriptNode); 
       scriptNode.connect(context.destination); 
       input.start(); 
      }, 
      function(e){ alert('Error capturing audio. e='+e); } 
     ); 
    }else alert('getUserMedia not supported in this browser.'); 
}; 

回答

0

我相信(@cwilso或許可以糾正我在這,如果我錯了),該API使用以下命令,其中樣本從節點拉到一個模型,而不是推樣本節點的節點它。這意味着您在腳本處理器中設置的緩衝區大小是延遲的來源,而不是麥克風流的輸入緩衝區大小。嘗試設置較低的緩衝區大小。

var framesPerBuffer = 256; 
var scriptNode = context.createScriptProcessor(framesPerBuffer, 1, 1); 
+0

1/3秒(300ms)似乎非常高。是的,腳本處理器的緩衝區大小是一個很大的代價 - 越小越好,雖然它需要更快的CPU(即,這是一個折衷 - 不是每個系統都可以支持256緩衝區而不會產生干擾)。 AudioWorkers將爲此提供幫助;在此之前,您確實希望使用本機Web音頻節點而不是ScriptProcessor進行儘可能多的處理。 (從Web Audio線程跳轉到主線程的速度非常慢)。我猜測由於某種原因,設備上的輸入緩衝區非常大。它在Chrome中如何? – cwilso

相關問題