2013-12-16 9 views
9

मैं जिसमें मैं बफर प्राप्त करने के लिए कोशिश कर रहा हूँ एक सरल एप्लिकेशन बनाने रहा हूँ निकाल दिया, लेकिन यह है कि निम्नलिखित कोड में onaudio प्रक्रिया फायरिंग नहीं है लगता है: (PasteBin)जावास्क्रिप्ट ऑडियो एपीआई: 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 मिलना चाहिए, समस्या यह है कि मुझे केवल इनिटियाज़िंग और ऑनयूडियोप्रोसेस नहीं मिल रहा है। मैं नवीनतम क्रोम का उपयोग कर रहा:

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 प्रिंट कर रहा है क्योंकि स्ट्रीम संसाधित हो रही है, लेकिन मैं इस सेटअप की शुद्धता के बारे में कुछ नहीं कह सकता (क्योंकि मैंने कहा, थोड़ा अनुभव) इसलिए कृपया नोड्स के बीच कनेक्शन को दोबारा जांचें - और यदि आवश्यक हो पहले पैरामीटर (बफर आकार) समायोजित करें।


नोट: मैं तुम्हें कुछ करना चाहता हूँ संभालने रहा है कि बदलती जाती है धारा (यह अपने प्रश्न में स्पष्ट नहीं था)। यदि आप कुछ और करना चाहते हैं (उदाहरण के लिए, बस इसका विश्लेषण करें) लेकिन इनपुट को नहीं बदलेगा, तो आप नोड्स को कनेक्ट कर सकते हैं जैसे आपने पहले (node और destination) और ScriptProcessorNode को एक इनपुट के साथ बनाया लेकिन कोई आउटपुट नहीं:

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 एमएस में एक बार आग लगने के लिए कहा जाता है (इसलिए यह कम आवृत्ति है और इस प्रकार अधिक प्रदर्शनकारी)।

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

पी.एस.
अपने उदाहरण में, आप onaudioprocess हैंडलर में console.log('done') चाहते हैं। इससे मुझे लगता है कि आप घटना के उद्देश्य को गलत समझते हैं। इसे लगातार निकाल दिया जाता है, न कि स्ट्रीम के साथ कुछ किया जाता है।

संबंधित मुद्दे