Я создал метод getSpectrum
с использованием метода getByteFrequencyData
в узле анализатора Web Audio API. Массив возвращенных аудиоданных относится к источнику звука (либо к экземпляру 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.
Любое подстрекательство было бы высоко оценено! Heres a 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
. Кто-нибудь видит, что мне не хватает?
Вы можете обойти эту проблему, поставив GainNode в между 'analyser' и вашей' контексте. destination'. Тогда у вас будет ползунок громкости, который регулирует GainNode вместо громкости звука. Таким образом, громкость корректируется только после прохождения вашего анализатора. – idbehold
Для чего я работаю, я бы не стал контролировать то, что задает том, поэтому я не смог бы поставить GainNode перед тем, что было бы. Это хорошая идея. Будет рассматривать его для других проектов. –