Web-Audio Api и Javascript: получите правильный выбор с микрофона

Я провожу некоторые эксперименты и делаю некоторые визуализации на основе данных, полученных микрофоном в режиме реального времени.

В этом случае я хочу создать такую ​​визуализацию: https://онлайн-диктофон.com/es/

или, может быть, аудиорекордер Mac OS Web-Audio Api и Javascript: получите правильный выбор с микрофона

У меня есть полный пример кода ниже, пожалуйста, ознакомьтесь, но мой вопрос в том, что я использую это:

obj.analyser.getByteFrequencyData(obj.frequencyArray)

Правильно ли для этого конкретного случая получить пики и построить волновой график? например библиотека вейвсерферов или, может быть, мне нужно больше узнать об аудио или использовать некоторые математические методы, я не знаю, что застрял.

вот мой полный пример codepen: https://codepen.io/davidtorroija/pen/bZXeqb

ОТРЕДАКТИРОВАНО: Добавление дополнительной информации: Основываясь на ответе Брэда, изменившем в моем примере getByteTimeDomainData()

Я посмотрел на этот метод getByteTimeDomain и используется для создания визуализации с помощью осциллографа. Я изменил этот метод в этом примере, и это не похоже. Глядя в массив байтов, минимум равен 100, что слишком много, когда нет звука новый пример Codepen здесь Но, возможно, это моя реализация. Web-Audio Api и Javascript: получите правильный выбор с микрофона Кстати, я беру максимальное число 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
})

;

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
469
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что вы видите на скриншоте, на самом деле находится во временной области.

Для этого вам нужно использовать getByteTimeDomainData() или getFloatTimeDomainData().

Спасибо за ответ!, но не могли бы вы объяснить больше, я хочу узнать и понять разницу, потому что я посмотрел на этот метод getByteTimeDomain и используется для создания визуализации осциллографа. Я изменил этот метод в этом примере, и это не похоже. Глядя в массив байтов, минимум равен 100, что слишком много, когда нет звука codepen.io/davidtorroija/pen/gyYrbm

David Torroija 29.03.2019 16:20

@deividsito Без звука байты, возвращенные из getByteTimeDomain, должны фактически зависать вокруг 127. Фактические волны давления колеблются от отрицательных до положительных, поэтому, если вы пытаетесь разбить это на байты, которые могут представлять только целые числа между 0 и 255, вы устанавливаете эффективное значение нулевого давления на 127. Отрицательное давление может упасть до 0, а положительное — до 255. Либо выполните математику, чтобы масштабировать значение байта до нужного диапазона, либо используйте getFloatTimeDomainData(), что оптимально даст вам -1.0 до 1.0 .

Brad 29.03.2019 16:46

Хорошо, @Brad, спасибо за объяснение :), позвольте мне попробовать, спасибо!

David Torroija 29.03.2019 16:52

Хорошо @Brad, у меня есть еще один вопрос, когда я все время получаю массив значений за прошедшее время, которое я получил, в зависимости от fftsize 512 или 1024 и т. д., я повторяю этот массив и беру максимальное значение этого массива, чтобы нарисовать это значение в этот промежуток времени. Это правильно или мне нужно сделать среднее значение массива? Спасибо!

David Torroija 29.03.2019 17:00

@deividsito Среднее значение приближается к нулю по определению. Максимум и минимум должны быть похожи друг на друга по величине (но с отрицательным значением минимума). Для простой визуализации max подойдет.

Brad 29.03.2019 17:29

Отлично, @Brad, спасибо, я только что сделал это :P codepen.io/davidtorroija/pen/ZZzLpb

David Torroija 29.03.2019 18:39

Другие вопросы по теме