वेब ऑडियो के बारे में अक्सर पूछे जाने वाले सवाल

बोरिस स्मस

पिछले कुछ महीनों में, WebKit Web Audio API वेब पर गेम और ऑडियो ऐप्लिकेशन के लिए एक आकर्षक प्लैटफ़ॉर्म के रूप में सामने आया है. जब डेवलपर इसे समझते हैं, तो मुझे अक्सर ऐसे ही सवाल मिलते रहते हैं. इस क्विक अपडेट में, अक्सर पूछे जाने वाले कुछ सवालों के जवाब देने की कोशिश की गई है. इससे, Web Audio API के साथ आपके अनुभव को बेहतर बनाने में मदद मिलेगी.

सवाल: मदद करो, मैं आवाज़ नहीं निकाल सकता!

जवाब: अगर आपने Web Audio API का इस्तेमाल करना शुरू नहीं किया है, तो शुरुआत करने का ट्यूटोरियल देखें या उपयोगकर्ता के इंटरैक्शन के हिसाब से ऑडियो चलाने की एरिक की रेसिपी देखें.

सवाल. मेरे पास कितने ऑडियो कॉन्टेक्स्ट होने चाहिए?

जवाब: आम तौर पर, आपको हर पेज के लिए एक 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);

इस क्रबग में यह सुविधा ट्रैक की जाती है. ध्यान दें कि इस सेटअप में, 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);

Web Audio API को ज़्यादा सटीक कॉलबैक लागू करने के लिए, एक ओपन बग है.

सवाल: साउंड लोड होने पर, पूरा यूज़र इंटरफ़ेस (यूआई) थ्रेड लॉक हो जाता है और मेरा यूज़र इंटरफ़ेस (यूआई) काम करना बंद कर देता है. मदद करें!**

जवाब: मुख्य थ्रेड को ब्लॉक होने से बचाने के लिए, एसिंक्रोनस लोडिंग के लिए decodeAudioData API का इस्तेमाल करें. यह उदाहरण देखें.

सवाल: क्या वेब ऑडियो एपीआई का इस्तेमाल, रीयल टाइम से ज़्यादा तेज़ी से आवाज़ों को प्रोसेस करने के लिए किया जा सकता है?

जवाब: हां, एक समाधान पर काम किया जा रहा है. कृपया हमारे साथ बने रहें!

सवाल: मैंने एक शानदार Web Audio API ऐप्लिकेशन बनाया है, लेकिन जब भी वह टैब बैकग्राउंड में चल रहा होता है, तो वह सुनने में अजीब लगता है!

जवाब: ऐसा शायद इसलिए है, क्योंकि setTimeouts का इस्तेमाल किया जा रहा है. पेज के बैकग्राउंड में चलने पर, ये अलग तरीके से काम करते हैं. आने वाले समय में Web Audio API, वेब ऑडियो के इंटरनल टाइमर (context.currentTime एट्रिब्यूट) का इस्तेमाल करके, किसी खास समय पर कॉलबैक कर पाएगा. ज़्यादा जानकारी के लिए, कृपया सुविधा का यह अनुरोध देखें.

आम तौर पर, जब आपका ऐप्लिकेशन बैकग्राउंड में चला जाता है, तब वीडियो चलाना बंद करना बेहतर रहता है. पेज विज़िबिलिटी एपीआई का इस्तेमाल करके, यह पता लगाया जा सकता है कि कोई पेज कब बैकग्राउंड में चलेगा.

सवाल: Web Audio API का इस्तेमाल करके, आवाज़ की पिच में बदलाव कैसे किया जा सकता है?

A: सोर्स नोड पर playbackRate बदलें.

सवाल: क्या स्पीड बदले बिना पिच को बदला जा सकता है?

जवाब: Web Audio API के ऑडियो के लिए, pinpointNode मौजूद हो सकता है, लेकिन इसे लागू करना मुश्किल है. ऐसा इसलिए है, क्योंकि ऑडियो कम्यूनिटी में पिच शिफ़्ट करने वाला कोई आसान एल्गोरिदम नहीं है. जानी-पहचानी तकनीकों से आर्टफ़ैक्ट बनाए जाते हैं. खास तौर पर, ऐसे मामलों में जहां पिच में बदलाव ज़्यादा होता है. इस समस्या से निपटने के लिए दो तरह के तरीके हैं:

  • टाइम डोमेन एल्गोरिदम की वजह से, दोहराए जाने वाले सेगमेंट, आर्टफ़ैक्ट की तरह दिखते हैं.
  • फ़्रीक्वेंसी डोमेन तकनीक, जो रेवर्बेरेंट साउंड आर्टफ़ैक्ट का कारण बनती है.

हालांकि, इन तकनीकों को इस्तेमाल करने के लिए कोई नेटिव नोड नहीं है, लेकिन JavaScriptAudioNode से ऐसा किया जा सकता है. यह कोड स्निपेट एक शुरुआती पॉइंट के तौर पर काम कर सकता है.

सवाल: मैं अपनी पसंद के सैंपल रेट पर ऑडियो कॉन्टेक्स्ट कैसे बनाऊं?

जवाब: फ़िलहाल, इसके लिए कोई सहायता उपलब्ध नहीं है, लेकिन हम इस पर काम कर रहे हैं. सुविधा का यह अनुरोध देखें.

अगर आपका कोई और सवाल है, तो web-audio टैग का इस्तेमाल करके StackOverflow पर उनसे सवाल पूछें.