2016-07-22 90 views
6

我在Web Audio API的分析器節點上使用getByteFrequencyData方法創建了一個getSpectrum方法。返回的音頻數據陣列是相對於音頻源(el或音頻()實例)volume(值爲0到1)。按照音量對getByteFrequencyData中的音頻數據進行規範化處理

使用音頻源的音量我試圖對接收到的每個值進行歸一化來自getByteFrequencyData,以便getSpectrum的用戶在視頻化音頻數據時不必擔心音量。

這是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的音量值。

任何煽動將不勝感激!這裏有一個working example的問題。更改音量滑塊將說明問題。

更新7/22/16:感謝@ raymond-toy的回答,我想出瞭如何將0音量值轉換爲1音量值爲分貝。

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

獲得DB後,我倒公式中的W3C規範,

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

不幸的是,value相對於volume不知何故仍然結束。有沒有人看到我失蹤?

+1

你可以解決這個問題。 destination'。然後,您將有一個音量滑塊來調整GainNode而不是音頻的音量。這種方式只有在通過「分析器」後才能調整音量。 – idbehold

+0

對於我正在處理的內容,我無法控制音量的設置,所以我無法將GainNode放在任何可能的位置。這是一個好主意。會考慮用於其他項目 –

回答

1

顯然我是一個傻瓜的差事。正如@raymond-toy指出的那樣,頻譜值是相對於音量隱含的。規範化意味着將一部分數據從「光譜底部」丟失,這不是我的目標。

如果任何人的好奇,我最終只是劃分audioDataValue通過255,通過把一個GainNode在`analyser`和你`語境之間獲得一個從0浮子1

1

getByteFrequencyData以dB爲單位返回值。您不想通過audioE1.volume劃分這些值。要轉換(莫名其妙!)audioE1.volume以dB值,並添加(或減去)從值從getByteFrequencyData

如果使用getFloatFrequencyData先來看看發生了什麼這可能是比較容易理解的事情。

+0

這是一個很好的第一步。找到數學將0到1的音量轉換爲DBs 'Math.abs(((Math.log(volume)/Math.LN10)* 20)'。 將其插入到w3c規範的逆方程中也沒有效果。 '值=((audioDataValue * volumeDB)/ 255) - volumeDB;' 'value'最終還是相對於體積不知。 IDK我做錯了什麼。 –

+1

我認爲你最好用value = audioDataValue - volumedB。不要按volumeDB除;劃分兩個dB值並不合理。我不明白你爲什麼要規範化頻譜。 getByteFrequency無法正常工作,因爲隨着音量的減小,無論如何你都會失去頻譜底部的值。 –

+0

我明白你的意思了。減法是有道理的,只是不知道它是如此工作。我認爲audioDataValue的變化與音量水平成正比。我會試試看 –