2012-12-05 38 views
6

तो यह है कि मैं उज्जवल तत्वों बनाने की तरह एक पेज एनीमेशन का समन्वय करने के डेसिबल के स्तर के रूप में उच्चक्या कोई तरीका ऑडियो फ़ाइल से डेसिबल स्तर की तरह कुछ मिलता है और उस जानकारी को जेसन सरणी में बदल देता है?

उत्तर

12

यह दृष्टिकोण क्रोम/सफारी में काम करेंगे जानकारी का उपयोग कर सकते हैं:

+function(){ 
 
    
 
    var ctx = new AudioContext() 
 
    , url = 'https://cf-media.sndcdn.com/OfjMZo27DlvH.128.mp3?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiKjovL2NmLW1lZGlhLnNuZGNkbi5jb20vT2ZqTVpvMjdEbHZILjEyOC5tcDMiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE1MTUwNDM5Njd9fX1dfQ__&Signature=FfmL2qUssAKs3Z7EPoYo0Yq8-SAg8rKLPs65EasXwuVkfsOB4joFqeCvVR2elpaG-lJaV4hXpXFiRCDWXNOYyAtO4Oz~sexiPwIoSk8-jWiVbGQRS8TMmUmj7TJzxemMOIj7ugWJKk6PHsrUdgqs9woDpHzxmkGCzk6sfqJEIsdeZJ4rWUFAh4iGWn9M6b0xfzTgndAJmytkNj9raCpWCBVmdr5u-r9nt~q5uF1easNSW9oaFilM4s1Hq2ei~VJye8zW9bzvrGm8idVdy-tiPeMWAKcE8J2VuaS1Ret6jRTRaHTDuiNgA5sZvgTzNpEpKtWI7UmAWI5TrqNVSlxpgQ__&Key-Pair-Id=APKAJAGZ7VMH2PFPW6UQ' 
 
    , audio = new Audio(url) 
 
    // 2048 sample buffer, 1 channel in, 1 channel out 
 
    , processor = ctx.createScriptProcessor(2048, 1, 1) 
 
    , meter = document.getElementById('meter') 
 
    , source 
 
    
 
    audio.crossOrigin = 'anonymous' 
 

 
    audio.addEventListener('canplaythrough', function(){ 
 
    source = ctx.createMediaElementSource(audio) 
 
    source.connect(processor) 
 
    source.connect(ctx.destination) 
 
    processor.connect(ctx.destination) 
 
    audio.play() 
 
    }, false); 
 
    
 
    // loop through PCM data and calculate average 
 
    // volume for a given 2048 sample buffer 
 
    processor.onaudioprocess = function(evt){ 
 
    var input = evt.inputBuffer.getChannelData(0) 
 
     , len = input.length 
 
     , total = i = 0 
 
     , rms 
 
    while (i < len) total += Math.abs(input[i++]) 
 
    rms = Math.sqrt(total/len) 
 
    meter.style.width = (rms * 100) + '%' 
 
    } 
 
    
 
}()
#meter { 
 
    width: 0%; 
 
    height: 15px; 
 
    margin: 2px 0; 
 
    background: green; 
 
    -webkit-transition: width .05s; 
 
}
<div id="meter"></div>

महत्वपूर्ण चीजें यहां होती हैं:

processor.onaudioprocess = function(evt){ 
    var input = evt.inputBuffer.getChannelData(0) 
    , len = input.length 
    , total = i = 0 
    , rms 
    while (i < len) total += Math.abs(input[i++]) 
    rms = Math.sqrt(total/len) 
    meter.style.width = (rms * 100) + '%' 
} 

बेसिक सहयोगी, आप हर 2048 नमूने कच्चे पीसीएम डेटा (-1 से 1 के मान) को पकड़ते हैं और आप उनके माध्यम से लूप करते हैं, जो कि समय की औसत अवधि के औसत सिग्नल स्तर की गणना करते हैं।

फिर आप अपने एनिमेशन को करने के लिए उस मान का उपयोग कर सकते हैं।

संपादित करें: आरएमएस का उपयोग करने के लिए अपडेट किया गया, जो जेसन ने बताया कि एक और सार्थक माप है।

+0

मैं कुछ समझ यह कैसे काम करता परेशानी आ रही है। मैं पेज-प्लेयर.जेएस और soundmanager2.js का उपयोग कर रहा हूं -> www.wave.cat – coiso

+0

एक [AnalyserNode] नहीं होगा (https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode) इस काम के लिए बहुत बेहतर हो? –

+0

शायद? आप निश्चित रूप से इसे प्रोफाइल कर सकते हैं और निश्चित रूप से पता लगा सकते हैं। कम से कम, शायद यह उल्लेखनीय है कि इस पोस्ट के बाद से 'स्क्रिप्टप्रोसेसर नोड' को 'ऑडियोवर्कर नोड' के पक्ष में बहिष्कृत कर दिया गया है। –

9

हां, आपको कच्चे पीसीएम नमूने (जैसे किनिस उल्लेख) को पकड़ने की आवश्यकता है। हालांकि, कुल मात्रा के स्तर की गणना करने के लिए, आप मूल्यों के आरएमएस (रूट मीन स्क्वायर) को पकड़ना चाहते हैं। साथ ही, आप स्ट्रीम में सभी चैनलों पर ध्यान देना चाहेंगे, न केवल पहले चैनल (ताकि आप उदाहरण के लिए स्टीरियो स्ट्रीम के लिए वॉल्यूम लेवल को सटीक रूप से प्रतिबिंबित कर सकें)।

कुछ चालें हैं (सुनिश्चित करें कि आप चैनलों में समान नमूने के गुणा का उपयोग करते हैं, अतिरिक्त नहीं)। फिर आप उन्हें एक साथ जोड़ देंगे (फिर से केनिस की तरह)। यदि आप इसे वास्तविक डेसिबल चाहते हैं, तो एक लॉग चरण भी आवश्यक है।

answer to this other question के रूप में एक उदाहरण है।

प्रासंगिक कोड:

var rms = Math.sqrt(sum/(_buffer.length/2)); 
var decibel = 20 * (Math.log(rms)/Math.log(10)); 
+0

धन्यवाद जेसन। आप आरएमएस का उपयोग करने के बारे में पूरी तरह से सही हैं। मैं आलसी था। एफडब्ल्यूआईडब्ल्यू, मेरा उदाहरण वास्तव में प्रोसेसर नोड पर बाएं और दाएं चैनल को प्रस्तुत करता है (जब तक कि मैंने spec को गलत समझा नहीं है) - इसलिए उन्हें कुल में प्रतिनिधित्व किया जाना चाहिए। –

+0

आह शांत! धन्यवाद केविन :)। मैंने कल्पना को नहीं देखा, इसलिए मैं आश्चर्यचकित नहीं होगा :)। –