पिछले कुछ महीनों में, WebKit का Web Audio API, वेब पर गेम और ऑडियो ऐप्लिकेशन के लिए एक बेहतरीन प्लैटफ़ॉर्म के तौर पर उभरा है. डेवलपर जैसे-जैसे इससे वाक़िफ़ होते जा रहे हैं, मुझे बार-बार मिलते-जुलते सवाल मिल रहे हैं. इस अपडेट में, अक्सर पूछे जाने वाले कुछ सवालों के जवाब दिए गए हैं. इससे आपको Web Audio API का इस्तेमाल करने में आसानी होगी.
सवाल: मेरी आवाज़ नहीं आ रही है, कृपया मेरी मदद करें!
जवाब: अगर आपने Web Audio API का इस्तेमाल पहली बार किया है, तो शुरू करने से जुड़ा ट्यूटोरियल देखें. इसके अलावा, उपयोगकर्ता के इंटरैक्शन के आधार पर ऑडियो चलाने के लिए, एरिक की रेसिपी देखें.
सवाल: मेरे पास कितने ऑडियो कॉन्टेक्स्ट होने चाहिए?
जवाब: आम तौर पर, आपको हर पेज पर एक AudioContext शामिल करना चाहिए. साथ ही, एक ऑडियो कॉन्टेक्स्ट से कई नोड कनेक्ट किए जा सकते हैं. हालांकि, एक पेज पर कई AudioContext शामिल किए जा सकते हैं, लेकिन इससे परफ़ॉर्मेंस पर असर पड़ सकता है.
सवाल: मेरे पास एक AudioBufferSourceNode है, जिसे मैंने अभी-अभी noteOn() की मदद से चलाया था. मुझे इसे फिर से चलाना है, लेकिन noteOn() से कुछ नहीं हो रहा है! मदद चाहिए!
जवाब: सोर्स नोड के खत्म होने के बाद, उसे फिर से नहीं चलाया जा सकता. बफ़र किए गए डेटा को फिर से चलाने के लिए, आपको नया AudioBufferSourceNode बनाना होगा और noteOn() को कॉल करना होगा.
सोर्स नोड को फिर से बनाने से, आपको लग सकता है कि यह तरीका सही नहीं है. हालांकि, सोर्स नोड को इस पैटर्न के लिए काफ़ी हद तक ऑप्टिमाइज़ किया जाता है. इसके अलावा, अगर आपके पास AudioBuffer का हैंडल है, तो आपको एक ही आवाज़ को फिर से चलाने के लिए, ऐसेट से दूसरा अनुरोध करने की ज़रूरत नहीं है. अगर आपको इस पैटर्न को बार-बार दोहराना पड़ता है, तो playSound(buffer) जैसे आसान हेल्पर फ़ंक्शन का इस्तेमाल करके, वीडियो चलाने की सुविधा को कैप्सूल करें.
सवाल: आवाज़ चलाने के लिए, हर बार नया सोर्स नोड बनाने की ज़रूरत क्यों होती है?
जवाब: इस आर्किटेक्चर का मकसद, ऑडियो ऐसेट को चलाने की स्थिति से अलग करना है. रिकॉर्ड प्लेयर के उदाहरण से समझें, तो बफ़र, रिकॉर्ड के जैसे होते हैं और सोर्स, प्ले-हेड के जैसे होते हैं. कई ऐप्लिकेशन में एक ही बफ़र के कई वर्शन एक साथ चलते हैं. इसलिए, यह पैटर्न ज़रूरी है.
सवाल: मैं audio और video टैग से मिले साउंड को कैसे प्रोसेस करूं?
जवाब: MediaElementAudioSourceNode पर काम चल रहा है! अगर यह सुविधा उपलब्ध है, तो यह इस तरह काम करेगी. इसमें ऑडियो टैग के ज़रिए चलाए जा रहे सैंपल में फ़िल्टर इफ़ेक्ट जोड़ा जाएगा:
<audio src="sounds/sample.wav" controls>
var audioElement = document.querySelector('audio');
var mediaSourceNode = context.createMediaElementSource(audioElement);
mediaSourceNode.connect(filter);
filter.connect(context.destination);
इस सुविधा को इस crbug में ट्रैक किया जाता है. ध्यान दें कि इस सेटअप में, mediaSourceNode.noteOn() को कॉल करने की ज़रूरत नहीं है. ऑडियो टैग, प्लेबैक को कंट्रोल करता है.
सवाल: मुझे माइक्रोफ़ोन से आवाज़ कब सुनाई देगी?
जवाब: ऑडियो इनपुट के इस हिस्से को WebRTC के हिस्से के तौर पर getUserMedia का इस्तेमाल करके लागू किया जाएगा. साथ ही, यह Web Audio API में एक खास सोर्स नोड के तौर पर उपलब्ध होगा. यह createMediaElementSource के साथ मिलकर काम करेगा.
सवाल: मैं यह कैसे देखूं कि कोई AudioSourceNode कब खत्म हुआ?
जवाब: फ़िलहाल, आपको JavaScript टाइमर का इस्तेमाल करना होगा, क्योंकि Web Audio API इस सुविधा के साथ काम नहीं करता. Web Audio API का इस्तेमाल शुरू करने से जुड़े ट्यूटोरियल का यह स्निपेट, इसका एक उदाहरण है:
// Assume source and buffer are previously defined.
source.noteOn(0);
var timer = setTimeout(function() {
console.log('playback finished');
}, buffer.duration * 1000);
Web Audio API को ज़्यादा सटीक कॉलबैक लागू करने के लिए, खुला बग मौजूद है.
सवाल: आवाज़ें लोड करने की वजह से, पूरी यूज़र इंटरफ़ेस (यूआई) थ्रेड लॉक हो जाती है और मेरा यूआई काम नहीं करता. सहायता चाहिए!**
जवाब: मुख्य थ्रेड को ब्लॉक होने से बचाने के लिए, असिंक्रोनस लोडिंग के लिए decodeAudioData एपीआई का इस्तेमाल करें. यह उदाहरण देखें.
सवाल: क्या Web Audio API का इस्तेमाल, आवाज़ों को रीयलटाइम से ज़्यादा तेज़ी से प्रोसेस करने के लिए किया जा सकता है?
जवाब: हां, इस समस्या को ठीक करने के लिए काम किया जा रहा है. कृपया हमारे साथ बने रहें!
सवाल: मैंने Web Audio API का इस्तेमाल करके एक बेहतरीन ऐप्लिकेशन बनाया है. हालांकि, जब यह ऐप्लिकेशन किसी टैब में बैकग्राउंड में चलता है, तो आवाज़ें अजीब हो जाती हैं!
जवाब: ऐसा इसलिए हो सकता है, क्योंकि आपने setTimeouts का इस्तेमाल किया है. अगर पेज बैकग्राउंड में है, तो ये अलग-अलग तरीके से काम करते हैं. आने वाले समय में, Web Audio API, वेब ऑडियो के इंटरनल टाइमर (context.currentTime एट्रिब्यूट) का इस्तेमाल करके, खास समय पर कॉलबैक कर पाएगा. ज़्यादा जानकारी के लिए, कृपया सुविधा का अनुरोध देखें.
आम तौर पर, जब आपका ऐप्लिकेशन बैकग्राउंड में चला जाता है, तो वीडियो चलाने की सुविधा बंद कर देना बेहतर होता है. Page Visibility API का इस्तेमाल करके, यह पता लगाया जा सकता है कि कोई पेज बैकग्राउंड में कब जाता है.
सवाल: Web Audio API का इस्तेमाल करके, आवाज़ की पिच कैसे बदली जा सकती है?
जवाब: सोर्स नोड पर मौजूद playbackRate को बदलें.
सवाल: क्या स्पीड में बदलाव किए बिना पिच बदली जा सकती है?
जवाब: Web Audio API में ऑडियो कॉन्टेक्स्ट में PitchNode हो सकता है, लेकिन इसे लागू करना मुश्किल है. ऐसा इसलिए है, क्योंकि ऑडियो कम्यूनिटी में पिच बदलने का कोई सीधा एल्गोरिदम नहीं है. पिच में ज़्यादा बदलाव होने पर, जानी-पहचानी तकनीकों से आर्टफ़ैक्ट बन जाते हैं. इस समस्या को हल करने के दो तरीके हैं:
- टाइम डोमेन एल्गोरिदम, जिनकी वजह से सेगमेंट की गूंज वाले आर्टफ़ैक्ट बार-बार सुनाई देते हैं.
- फ़्रीक्वेंसी डोमेन की तकनीकें, जिनकी वजह से गूंजने वाली आवाज़ के आर्टफ़ैक्ट बनते हैं.
इन तकनीकों को लागू करने के लिए, कोई नेटिव नोड उपलब्ध नहीं है. हालांकि, इन्हें JavaScriptAudioNode की मदद से लागू किया जा सकता है. यह कोड स्निपेट, शुरुआत करने के लिए मददगार हो सकता है.
सवाल: मैं अपनी पसंद की सैंपल रेट पर AudioContext कैसे बनाऊं?
जवाब: फ़िलहाल, यह सुविधा उपलब्ध नहीं है. हालांकि, हम इस पर काम कर रहे हैं. इस सुविधा के लिए किया गया अनुरोध देखें.
अगर आपका कोई और सवाल है, तो web-audio टैग का इस्तेमाल करके, उन्हें StackOverflow पर पूछें.