2013-12-16 12 views
9

を解雇したが、次のコードでonaudioプロセスが発射されていないようです:(PasteBinJavascriptのオーディオAPI:onaudioprocessない私は、バッファを取得しようとしているという簡単なアプリケーションを構築しています

<script> 
var audio_context; 
var recorder; 
window.onload = function init() { 
    try { 
     window.AudioContext = window.AudioContext || window.webkitAudioContext; 
     navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia; 
     window.URL = window.URL || window.webkitURL; 
     audio_context = new AudioContext; 
     } catch (e) { 
     console.log(e); 
    } 
    navigator.getUserMedia({audio: true}, startUserMedia); 
    function startUserMedia(stream) { 
     console.log('Initializing'); 
     var input = audio_context.createMediaStreamSource(stream); 
     input.connect(audio_context.destination); 
     var node = input.context.createGain(4096, 2, 2); 
     node.onaudioprocess = function(e){ 
      console.log('done'); 
     } 
     node.connect(audio_context.destination); 
    } 
}; 
</script> 

コードが正しく動作するようにするには、Initiliazing \n doneを取得する必要があります。問題は、イニシアチブしか得られず、onaudioprocessが起動しないということです。

enter image description here

+0

'onaudioprocess'の代わりに' addEventListener'を試してください。 – Musa

+0

悲しいことに、私はaddEventListenerで動作させることができませんでした: – Deepsy

答えて

8

onaudioprocessGainNodeのプロパティではありませんが、ScriptProcessorNodeの:私は、最新のクロムを使用しています。 API reference hereを参照してください。

私は実際にウェブオーディオAPIを経験していないんだけど、私が正しく理解している場合、あなたは、これらのイベントを処理できるようにするには、ノードと目的地を得るあなたの間に挿入する必要があります。

var node = input.context.createGain(4096, 2, 2); 
var processor = input.context.createScriptProcessor(4096,1,1); 

processor.onaudioprocess = function(e){ 
    console.log('done'); 
} 

node.connect(processor); 
processor.connect(audio_context.destination); 

Example at jsFiddleを。ご覧のように、ストリームが処理されるときにコンソールにdoneという文字が表示されますが、このセットアップの正確さについては何も言えません(経験はほとんどありません)ので、ノード間の接続を確認してください最初のパラメータ(バッファサイズ)を調整します。


注:私はあなたがその変更ストリーム(それはあなたの質問に明確ではありませんでした)何かをしたいと仮定しています。あなたは他の人に(例えば、それを分析するだけで)入力を変更したくない場合は、前と同じようにノードを接続して(nodedestinationScriptProcessorNodeを作成し、入力が1つで、出力はありません

var node = input.context.createGain(4096, 2, 2); 
node.connect(audio_context.destination); 

var processor = input.context.createScriptProcessor(4096,1,0); 

processor.onaudioprocess = function(e){ 
    console.log('done'); 
} 

node.connect(processor); 
3

またWebAudioイベントをバイパスし、音声自身のtimeupdateイベントを使用することができます。高解像度のイベント(例:audioprocess)が必要ない場合は、目的に合っている可能性があります。 audioprocessとは対照的に

timeupdateオーディオ位置がを変更した場合にのみ、を発射されています。それは実際にプレイしているか、別の位置をシークするとき。それは約250ミリ秒で1回発射すると言われています(それで低周波なので、よりパフォーマンスが良いです)。

function startUserMedia(stream) { 
    stream.ontimeupdate = function() { 
     console.log(stream.currentTime); 
    }; 
    /* … */ 
} 

P.S.
例では、onaudioprocessハンドラのconsole.log('done')にします。それは私がイベントの目的を誤解していると思うようになります。それはストリームで何かが行われた後ではなく、連続的に発射されます。

関連する問題