मेरे पास जावास्क्रिप्ट में ऑडियोकॉन्टेक्स्ट() ध्वनि वस्तु है।
इसकी मात्रा 100% है। मैं इसका आयतन 10% (जहाँ आयतन = 0.1) में चलाना चाहता हूँ।
मैं इसकी मात्रा को 10% तक कैसे कम कर सकता हूं?

const aCtx = new AudioContext();
let source = aCtx.createBufferSource();
let buf;
fetch('https://dl.dropboxusercontent.com/s/knpo4d2yooe2u4h/tank_driven.wav') // can be XHR as well
  .then(resp => resp.arrayBuffer())
  .then(buf => aCtx.decodeAudioData(buf)) // can be callback as well
  .then(decoded => {
    source.buffer = buf = decoded;
    source.loop = true;
    source.connect(aCtx.destination);
    check.disabled = false;
  });

check.onchange = e => {
  if (check.checked) {
    source.start(0); // start our bufferSource
  } else {
    source.stop(0); // this destroys the buffer source
    source = aCtx.createBufferSource(); // so we need to create a new one
    source.buffer = buf;
    source.loop = true;
    source.connect(aCtx.destination);
  }
};
<label>Start Playing</label>
<input type="checkbox" id="check" disabled><br>
<br>Its volume is 100%. Please help me to reduce it to 10%.
8
Rashid 13 अप्रैल 2017, 10:38
इसलिए मैं यहां मेरे कोड को पहचानता हूं, और यदि आप उत्तर को उसकी संपूर्णता में पढ़ते हैं, तो आप उसे दूसरे स्निपेट में देखेंगे मैं एक gainNode का उपयोग करता हूं, जो आपको आउटपुट वॉल्यूम पर नियंत्रण।
 – 
Kaiido
13 अप्रैल 2017, 10:43

2 जवाब

सबसे बढ़िया उत्तर

हम वॉल्यूम को नियंत्रित करने के लिए GainNodes का उपयोग करते हैं।

var gainNode = aCtx.createGain()
gainNode.gain.value = 0.1 // 10 %
gainNode.connect(aCtx.destination)

// now instead of connecting to aCtx.destination, connect to the gainNode
source.connect(gainNode)

समाधान

const aCtx = new AudioContext();

const gainNode = aCtx.createGain();
gainNode.gain.value = 0.1; // setting it to 10%
gainNode.connect(aCtx.destination);

let source = aCtx.createBufferSource();
let buf;
fetch('https://dl.dropboxusercontent.com/s/knpo4d2yooe2u4h/tank_driven.wav') // can be XHR as well
  .then(resp => resp.arrayBuffer())
  .then(buf => aCtx.decodeAudioData(buf)) // can be callback as well
  .then(decoded => {
    source.buffer = buf = decoded;
    source.loop = true;
    source.connect(gainNode);

    check.disabled = false;
  });

check.onchange = e => {
  if (check.checked) {
    source.start(0); // start our bufferSource
  } else {
    source.stop(0); // this destroys the buffer source
    source = aCtx.createBufferSource(); // so we need to create a new one
    source.buffer = buf;
    source.loop = true;
    source.connect(gainNode);
    
  }
};
<label>Start Playing</label>
<input type="checkbox" id="check" disabled><br>
<br>Its volume is 100%. Please help me to reduce it to 10%.
14
arc 13 अप्रैल 2017, 11:03
1
शुक्रिया। ऐसा देखना चाहिए था। इससे मुझे भी दर्द होता है... अब जब मैं इसे देखता हूं।
 – 
arc
13 अप्रैल 2017, 11:07

आप उस छात्र के लिए ऑडियोकॉन्टेक्स्ट के createGain का उपयोग कर सकते हैं।

नीचे दिखाए गए रूप में,

अधिक जानकारी के लिए createGain पर चेकआउट करें।

https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/createGain

    const aCtx = new AudioContext();
    let source = aCtx.createBufferSource();
    let buf;

    var gainNode = aCtx.createGain(); // Create a gainNode reference.
    gainNode.connect(aCtx.destination); // Add context to gainNode

fetch('https://dl.dropboxusercontent.com/s/knpo4d2yooe2u4h/tank_driven.wav') // can be XHR as well
      .then(resp => resp.arrayBuffer())
      .then(buf => aCtx.decodeAudioData(buf)) // can be callback as well
      .then(decoded => {
        source.buffer = buf = decoded;
        source.loop = true;

        source.connect(gainNode);   //Connecting gain to source
        gainNode.gain.value = 1;  // 100% VOLUME RANGE OF VALUE IS 0-1

        check.disabled = false;
      });


   check.onchange = e => {
      if (check.checked) {
        source.start(0); // start our bufferSource
      } else {
        source.stop(0); // this destroys the buffer source
        source = aCtx.createBufferSource(); // so we need to create a new one
        source.buffer = buf;
        source.loop = true;

        source.connect(gainNode);   //Connecting gain to source
        gainNode.gain.value = 0.1;  // 10% VOLUME RANGE OF VALUE IS 0-1
      }
    };
0
Nadir Laskar 13 अप्रैल 2017, 11:39
2
आपको बफर स्रोत को check.onchange में भी गेननोड से कनेक्ट करने की आवश्यकता है, अन्यथा दूसरे परिवर्तन के बाद यह अब और काम नहीं करेगा
 – 
Kaiido
13 अप्रैल 2017, 10:59
1
आपको संदर्भ में गेननोड को फिर से जोड़ने की आवश्यकता नहीं है, इसे एक बार करें, उदाहरण के लिए ग्लोबल स्कोप पर। आप अभी भी बफ़र को सीधे संदर्भ के गंतव्य से जोड़ रहे हैं, यह बिल्कुल भी अच्छा नहीं है।
 – 
Kaiido
13 अप्रैल 2017, 11:09
यह केवल मात्रा में हेरफेर के लिए गेननोड का उपयोग करने के प्रदर्शन उद्देश्य के लिए है, अनुकूलन कई तरीकों से किया जा सकता है।
 – 
Nadir Laskar
13 अप्रैल 2017, 11:17
मैं अनुकूलन के बारे में बात नहीं कर रहा हूँ। आपका कोड गेननोड डेमो के दायरे में काम नहीं करता। बस इसके गेन.वैल्यू को 1 से कम पर सेट करने का प्रयास करें और आप देखेंगे कि चूंकि आप बफ़र्ससोर्स को ऑडियो संदर्भ से सीधे कनेक्ट कर रहे हैं, यह बफ़र्स स्रोत अभी भी वॉल्यूम 1 पर चलेगा। => बस सभी को हटा दें source.connect(aCtx.destination);
 – 
Kaiido
13 अप्रैल 2017, 11:20
यह मेरे द्वारा जोड़े गए कोड का हिस्सा नहीं है। प्रश्न चेकआउट करें।
 – 
Nadir Laskar
13 अप्रैल 2017, 11:24