2013-12-16 20 views
9

ateş, ancak aşağıdaki kodda onaudio süreç değil ateş gibi görünüyor: (PasteBin)JavaScript ses API: onaudioprocess değil ben tampon almaya çalışıyorum hangi basit app inşa ediyorum

<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> 

Kod, ben Initiliazing \n done almalıyım gibi çalışırsa, sorun sadece Initiazing alıyorum ve onaudioprocess ateş değil. Ben en son krom kullanıyorum:

enter image description here

+0

'onaudioprocess' yerine' addEventListener 'kullanmayı deneyin. – Musa

+0

Ne yazık ki bunu addEventListener :(ile çalıştıramadı – Deepsy

cevap

8

onaudioprocessGainNode bir özelliği değildir, ancak ScriptProcessorNode arasında. API reference here'a bakın.

Gerçekten Web Audio API ile deneyimli değilim, ama doğru anlaşıldığı takdirde size düğüm ve hedefinizi bu etkinlikleri işlemek edebilmek için kazanmak arasına yerleştirmek gerekir:

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. Gördüğünüz gibi, akış işlendikçe konsola done yazdırıyor, ancak bu kurulumun doğruluğu hakkında hiçbir şey söyleyemem (çünkü, dediğim gibi, küçük deneyim) bu nedenle lütfen düğümler arasındaki bağlantıları iki kez kontrol edin - ve gerekiyorsa ilk parametreyi (tampon boyutunu) ayarlayın.


Not: Bir şey yapmanı istiyorum varsayarak ediyorum değişiklikler gösterirse akışı (Bu sorunuzu açık değildi). Başka bir şey yapmak istiyorsanız (örneğin, sadece analiz edin) ancak girişi değiştirmeyecekseniz, daha önce yaptığınız gibi düğümleri bağlayabilirsiniz (node ve destination) ve ScriptProcessorNode tek girişle ancak çıkış yok:

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

Ayrıca WebAudio olayını atlayıp Ses kendi timeupdate olayını kullanabilirsiniz. Yüksek çözünürlüklü bir etkinliğe (audioprocess gibi) ihtiyacınız yoksa amacınıza uygun olabilir.

timeupdate ses pozisyon değiştirildiğinde yalnızca ateş ediyor, audioprocess aksine

: o zaman aslında oynarken veya başka bir pozisyona alınız. Yaklaşık 250 ms'de bir kez ateşlendiği söylenir (bu yüzden düşük frekanslı ve dolayısıyla daha performanslı).

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

Not;
Örneğinizde, onaudioprocess işleyicisinde console.log('done') olmasını istiyorsunuz. Bu, olayın amacını yanlış anladığımı düşünmemi sağlıyor. Akışla bir şey yapılmadığında sürekli olarak ateşlenir.