#javascript #audio #web-audio-api #mediarecorder #wavesurfer.js
#javascript #Аудио #web-audio-api #mediarecorder #wavesurfer.js
Вопрос:
Я провожу некоторые эксперименты и делаю некоторые визуализации на основе данных, полученных микрофоном в режиме реального времени.
В этом случае я хочу создать визуализацию, подобную этой:https://online-voice-recorder.com/es
или, может быть, аудиомагнитофон Mac OS
У меня есть полный пример codepen ниже, пожалуйста, ознакомьтесь, но мой вопрос в том, что я использую это:
obj.analyser.getByteFrequencyData(obj.frequencyArray)
Правильно ли это для данного конкретного случая, чтобы получить пики и сгенерировать волновой график? например, из библиотеки wavesurfer или, может быть, мне нужно узнать больше об аудио или использовать некоторую математику, я не знаю, я застрял.
вот мой полный пример codepen:https://codepen.io/davidtorroija/pen/bZXeqb
ОТРЕДАКТИРОВАНО:Добавление дополнительной информации: На основе ответа Брэда, изменившего в моем примере getByteTimeDomainData()
Я посмотрел на этот метод getByteTimeDomain и он используется для создания визуализации осциллографа. Я перешел на этот метод в этом примере, и он не похож. Просматривая массив байтов, минимальное значение равно 100, что является максимальным, когда нет звука здесь приведен новый пример Codepen, но, возможно, это моя реализация. Кстати, я беру максимальное число ByteFrequencyArray, потому что я не знаю, какова правильная стратегия для получения пика оттуда, может быть, есть другой способ сделать это? пример кода ниже:
obj.analyser.getByteTimeDomainData(obj.frequencyArray)
for (var i = 0; i< obj.frequencyArray.length; i ) {
if(obj.frequencyArray[i] > max) {
max = obj.frequencyArray[i];
}
}
var freq = Math.floor(max);
obj.bars.push({
x: obj.width,
y: (obj.height / 2) - (freq / 2),
height: max,
width: 5
})
;
Ответ №1:
То, что вы видите на своем скриншоте, на самом деле относится к временной области.
Для этого вам нужно использовать getByteTimeDomainData()
или getFloatTimeDomainData()
.
Комментарии:
1. Спасибо за ответ!, но не могли бы вы объяснить подробнее, я хочу изучить и понять разницу, потому что я рассмотрел этот метод getByteTimeDomain и используется для создания визуализации осциллографа. Я перешел на этот метод в этом примере, и он не похож. При просмотре массива байтов минимальное значение равно 100, что является максимальным при отсутствии звука codepen.io/davidtorroija/pen/gyYrbm
2. @deividsito Без звука байты, возвращаемые из,
getByteTimeDomain
должны фактически зависать127
. Фактические волны давления изменяются отрицательно и положительно, поэтому, если вы пытаетесь квантовать это в байтах, которые могут представлять только целые числа между0
и255
, вы устанавливаете свое эффективное значение нулевого давления на127
. Отрицательное давление может снизиться до0
, а положительное давление может возрасти до255
. Либо посчитайте, чтобы масштабировать значение в байтах до нужного вам диапазона, либо используйтеgetFloatTimeDomainData()
то, что оптимально даст вам-1.0
для1.0
.3. Ок, @Brad спасибо за объяснение :), позвольте мне попробовать, спасибо!
4. Ок, @ Брэд, у меня есть еще один вопрос, когда я постоянно получаю массив значений с течением времени, которые я получал в зависимости от размера fftsize 512 или 1024 и т.д., Я повторяю этот массив и беру максимальное значение этого массива, чтобы вывести это значение за этот промежуток времени. Это правильно или мне нужно вычислить среднее значение по массиву? Спасибо!
5. @deividsito Среднее значение по определению будет приближаться к нулю. Max и min должны быть похожи друг на друга по величине (но с отрицательным значением min). Для простой визуализации подойдет max.