2014-06-21 17 views
7

Mikrofon girişini işlemek için ScriptProcessorNode'un onaudioprocess geriçağırımını kullanıyorum. MediaStreamSourceNode'u ScriptProcessorNode'a bağlayarak, ham ses verilerini onaudioprocess geri arama işlevi içinde alabilirim. Bununla birlikte, yaklaşık 30 saniye sonra (bu, 10 ila 35 sn arasında değişir), tarayıcı onaudioprocess çağırmayı durdurur. Aşağıdaki kodda, console.log çıkışı ('>>') her zaman yaklaşık 30 saniye sonra durur. Ben, bu sorunu gözlemlediğimiz (log 30 saniye sonra durur.) Chrome: onaudioprocess bir süre sonra aramayı durdurur

var ctx = new AudioContext(); 
var BUFFER_LENGTH = 4096; 
console.log('Buffer length is + ' + BUFFER_LENGTH); 
navigator.webkitGetUserMedia({audio: true}, function (stream) { 
    var mediaStreamSource = ctx.createMediaStreamSource(stream); 
    var scriptProcessor = ctx.createScriptProcessor(BUFFER_LENGTH, 1, 1); 
    scriptProcessor.onaudioprocess = function (e) { 
     console.log('>>'); 
    }; 
    scriptProcessor.connect(ctx.destination); 
}, function(e) { 
    console.error('Unable to get audio input source.'); 
}); 

Tüm olası BUFFER_LENGTH (256, 512, 1024, 2048, 4096, 8192, 16384) çalıştı, ancak durum değişmedi en son Chrome Sürüm (Sürüm 35.0.1916.153) ve Canary (Sürüm 37.0.2060.3 kanarya) Herhangi bir geçici çözüm bilen var mı?

+0

Boş bir e.outputbuffers'ınızı kendi iş süreçlerinizi geri aradığınızda döndürmeniz gerekip gerekmediğini merak ediyorum. Boş arabellekleri görme konusunda 30 saniye sonra Chrome, pil/işlem gücünü korumak ve geri aramayı kapatmak isteyebilir. – notthetup

+0

Teşekkürler, inputBuffer'ı buudioprocess içindeki outputBuffer'a kopyalamayı denedim. Ama sorunu çözmedi. Heres kodu: var source = e.inputBuffer.getChannelData (0); var dest = e.outputBuffer.getChannelData (0); dest.set (kaynak); – kuu

cevap

23

Bu, komut işlemcisi nesnesinin çöp toplamaya alışması gibi görünüyor. Genel değişkende kaydetmeyi deneyin ve sorunun giderilip giderilmediğini görün.

+0

Teşekkür ederim Chris. Dediğiniz gibi, ScriptProcessorNode'un global bir değişkene kaydedilmesi bu sorunu çözdü. Ama sanırım bu davranış (hala bağlı bir düğümü toplayan çöpün) düzeltilmesi gerekiyor. Bu zaten bir hata olarak dosyalandı mı? – kuu

+1

Doğru hatırlıyorsam, AudioContext hedefi Script işlemcisine bir başvuru sağlamaz. Bu yüzden ScriptProcessor'un çöp toplama işlemi burada gerçekten uygun, çünkü hiçbir şeyin buna bir atıfta bulunmadığı. –

+0

Bu sorunla ilgili göründüğü açık bir hata buldum: https://bugs.webkit.org/show_bug.cgi?id=112521 Geçtiğimiz yıl bir yama önerildi gibi görünüyor, ancak henüz değil kabul edilmiş. – kuu