पिछले कुछ महीनों में, WebKit 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()
को कॉल करने की ज़रूरत नहीं है. ऑडियो टैग, वीडियो चलाने की सुविधा को कंट्रोल करता है.
सवाल: मुझे माइक्रोफ़ोन से आवाज़ कब सुनाई देगी?
जवाब: इसके ऑडियो इनपुट वाले हिस्से को getUserMedia
का इस्तेमाल करके, WebRTC के हिस्से के तौर पर लागू किया जाएगा. साथ ही, यह 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);
वेब ऑडियो एपीआई को ज़्यादा सटीक कॉलबैक लागू करने के लिए, एक बग मौजूद है.
सवाल: लोड होने की आवाज़ों की वजह से, पूरा यूज़र इंटरफ़ेस (यूआई) थ्रेड लॉक हो जाता है और मेरा यूआई काम नहीं करता. मदद चाहिए!**
जवाब: मुख्य थ्रेड को ब्लॉक होने से बचाने के लिए, असाइनमेंट को अलग-अलग समय पर लोड करने के लिए decodeAudioData
एपीआई का इस्तेमाल करें. यह उदाहरण देखें.
सवाल: क्या वेब ऑडियो एपीआई का इस्तेमाल, रीयल टाइम से ज़्यादा तेज़ी से आवाज़ों को प्रोसेस करने के लिए किया जा सकता है?
जवाब: हां, हम इस समस्या को ठीक करने की कोशिश कर रहे हैं. कृपया हमारे साथ बने रहें!
सवाल: मैंने एक बेहतरीन वेब ऑडियो एपीआई ऐप्लिकेशन बनाया है. हालांकि, जब भी वह टैब बैकग्राउंड में चला जाता है, तो आवाज़ें अजीब हो जाती हैं!
जवाब: ऐसा इसलिए हो सकता है, क्योंकि setTimeouts
का इस्तेमाल किया जा रहा है. यह पेज बैकग्राउंड में होने पर अलग तरह से काम करता है. आने वाले समय में, Web Audio API, वेब ऑडियो के इंटरनल टाइमर (context.currentTime
एट्रिब्यूट) का इस्तेमाल करके, तय समय पर कॉलबैक कर पाएगा. ज़्यादा जानकारी के लिए, कृपया इस सुविधा के लिए किया गया अनुरोध देखें.
आम तौर पर, जब आपका ऐप्लिकेशन बैकग्राउंड में चला जाता है, तो वीडियो चलाना बंद कर देना अच्छा होता है. Page Visibility API का इस्तेमाल करके, यह पता लगाया जा सकता है कि कोई पेज बैकग्राउंड में कब चला जाता है.
सवाल: मैं वेब ऑडियो एपीआई का इस्तेमाल करके, किसी आवाज़ की पिच कैसे बदलूं?
जवाब: सोर्स नोड पर playbackRate
बदलें.
सवाल: क्या रफ़्तार में बदलाव किए बिना पिच बदली जा सकती है?
जवाब: Web Audio API में ऑडियो कॉन्टेक्स्ट में PitchNode हो सकता है, लेकिन इसे लागू करना मुश्किल है. ऐसा इसलिए है, क्योंकि ऑडियो कम्यूनिटी में पिच बदलने का कोई आसान तरीका नहीं है. आम तौर पर इस्तेमाल होने वाली तकनीकों से आर्टफ़ैक्ट बनते हैं. खास तौर पर, उन मामलों में जहां पिच में ज़्यादा बदलाव होता है. इस समस्या को हल करने के दो तरीके हैं:
- टाइम डोमेन एल्गोरिदम, जिनकी वजह से सेगमेंट में बार-बार गड़बड़ियां होती हैं.
- फ़्रीक्वेंसी डोमेन तकनीकें, जिनकी वजह से आवाज़ में गड़बड़ी होती है.
हालांकि, इन तकनीकों को लागू करने के लिए कोई नेटिव नोड नहीं है, लेकिन JavaScriptAudioNode
की मदद से ऐसा किया जा सकता है. इस कोड स्निपेट से आपको शुरुआत करने में मदद मिल सकती है.
सवाल: मैं अपनी पसंद के सैंपल रेट पर AudioContext कैसे बनाऊं?
जवाब: फ़िलहाल, ऐसा नहीं किया जा सकता. हालांकि, हम इस पर काम कर रहे हैं. इस सुविधा का अनुरोध देखें.
अगर आपका कोई और सवाल है, तो web-audio टैग का इस्तेमाल करके, StackOverflow पर बेझिझक सवाल पूछें.