2016-07-22 16 views
6

द्वारा GetByteFrequencyData से ऑडियो डेटा को सामान्यीकृत करें मैंने वेब ऑडियो एपीआई के विश्लेषक नोड पर getByteFrequencyData विधि का उपयोग करके getSpectrum विधि बनाई है। ऑडियो डेटा की सरणी (या तो एक एल, या ऑडियो() उदाहरण) volume से संबंधित है, 0 से 1.वॉल्यूम

ऑडियो स्रोत की मात्रा का उपयोग करके मैं प्राप्त प्रत्येक मान को सामान्य करने की कोशिश कर रहा हूं GetByteFrequencyData से ताकि प्राप्त स्पेक्ट्रम के उपयोगकर्ता को ऑडियो डेटा को विज़ुअलाइज़ करने पर वॉल्यूम के बारे में चिंता न करें।

यह getSpectrum

var audioData = new Uint8Array(analyser.binCount); 
var spectrum = []; 

analyser.getByteFrequencyData(audioData); 

for (var i = 0; i < audioData.length; i++) { 
    var value = audioData[i]; 

    //Where I'm trying to calculate the value independent of volume 
    value = ((value/audioEl.volume)/255); 

    spectrum.push(value); 
} 

return spectrum; 

W3C spec संदर्भ एक maxDecibels और minDecibels दिया लौटे मूल्य की गणना करने के लिए इस्तेमाल समीकरण के संस्करण नीचे धारीदार है। मेरी प्राथमिक समझ के साथ, मैंने गणित को उलटा करने की कोशिश की है, इसलिए मुझे सामान्यीकृत मूल्य मिलता है, लेकिन मैं इसे ठीक से काम नहीं कर रहा हूं। मुझे इसे 0 से 1 तक 0 वॉल्यूम वैल्यू के साथ पूरा करने में परेशानी हो रही है।

किसी भी उत्तेजना की बहुत सराहना की जाएगी! इस मुद्दे के working example है। वॉल्यूम स्लाइडर को बदलना समस्या को चित्रित करेगा।

अपडेट 7/22/16: @ रेमंड-खिलौने के जवाब के लिए धन्यवाद, मैंने यह पता लगाया कि 0 से 1 वॉल्यूम वैल्यू को डेसिबल में कैसे परिवर्तित किया जाए।

volumeDB = Math.abs((Math.log(volume)/Math.LN10)*20); 

डीबी मिलने के बाद, मैं W3C कल्पना में समीकरण उल्टा,

value = ((audioDataValue * volumeDB)/255) - volumeDB 

दुर्भाग्य से, value किसी भी तरह अभी भी volume के सापेक्ष समाप्त होता है। क्या कोई देखता है कि मैं क्या खो रहा हूं?

+1

आप इस समस्या को हल मिल सकता है करने के लिए 0 से एक नाव हो रही समाप्त हो गया। destination'। फिर आपके पास एक वॉल्यूम स्लाइडर होगा जो ऑडियो की मात्रा के बजाय GainNode को समायोजित करेगा। इस तरह वॉल्यूम आपके 'एनालिसर' से गुज़रने के बाद ही समायोजित हो जाता है। – idbehold

+0

जो मैं काम कर रहा हूं, उसके लिए मुझे वॉल्यूम सेट करने का नियंत्रण नहीं होगा, इसलिए मैं जो कुछ भी हो, उसके सामने एक गेनोडोड नहीं डाल पाऊंगा। यह एक अच्छा विचार था। इसे अन्य परियोजनाओं के लिए विचार करेंगे –

उत्तर

1

स्पष्ट रूप से मैं मूर्ख की भूल पर था। @raymond-toy ने बताया कि स्पेक्ट्रम मान निश्चित रूप से मात्रा के सापेक्ष हैं। सामान्यीकरण का मतलब है "स्पेक्ट्रम के नीचे से" डेटा का एक हिस्सा खोना, जो मेरा लक्ष्य नहीं था।

अगर कोई उत्सुक है, मैं सिर्फ 255 से audioDataValue विभाजित, `analyser` और अपने` संदर्भ के बीच में एक GainNode डालकर 1.

1

getByteFrequencyData डीबी में मूल्य लौटाता है। आप इन मानों को audioE1.volume द्वारा विभाजित नहीं करना चाहते हैं। आप से getByteFrequencyData

एक डीबी मूल्य को (किसी भी तरह!) AudioE1.volume कन्वर्ट करने के लिए और जोड़ने (या घटाना) कि मूल्यों से यह बातें समझना आसान अगर आप getFloatFrequencyData पहली बार इस्तेमाल किया देखने के लिए क्या हो रहा है हो सकता है चाहता हूँ।

+0

यह एक महान पहला कदम था। गणित को 0 से 1 वॉल्यूम को डीबी 'Math.abs ((Math.log (वॉल्यूम)/Math.LN10) * 20) में बदलने के लिए मिला। प्लगिंग कि w3c spec के व्यस्त समीकरण में या तो काम नहीं किया था। 'value = ((audioDataValue * volumeDB)/255) - वॉल्यूम डीबी;' 'मान' अभी भी वॉल्यूम के सापेक्ष समाप्त होता है। आईडीके क्या मैं गलत कर रहा हूँ। –

+1

मुझे लगता है कि आप मूल्य = audioDataValue - volumedB के साथ बेहतर हैं। वॉल्यूम डीबी द्वारा विभाजित न करें; दो डीबी मूल्यों को विभाजित करना वास्तव में समझ में नहीं आता है। और मुझे समझ में नहीं आता कि आप स्पेक्ट्रम को सामान्य बनाना क्यों चाहते हैं। यह GetByteFrequency के साथ सही काम नहीं करेगा क्योंकि वॉल्यूम कम हो जाता है, वैसे भी आप स्पेक्ट्रम के नीचे से मूल्यों को खोने जा रहे हैं। –

+0

मैं देख रहा हूँ कि आप क्या कह रहे हैं। घटाना समझ में आता है, बस यह नहीं पता था कि यह इस तरह से काम करता है। मुझे लगता है कि ऑडियोडेटाव्यू में परिवर्तन वॉल्यूम स्तर के अनुपात में आनुपातिक है। मैं कोशिश करूँगा –

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