Как сделать визуализатор звука с помощью HTML CANVAS API?

Опубликовано: 31 Декабря, 2022

В этой статье мы увидим, как сделать визуализатор звука с помощью API холста. Canvas API используется для рисования графики на элементе холста HTML. Итак, с помощью этой функции мы создадим визуализатор звука, который реагирует на звук с микрофона системы.

Аудиовизуализатор можно определить как инструмент, который визуально отображает ритм, громкость и частоту музыки с помощью анимированных изображений.

Используемые классы:

  • MediaDevices: используется для доступа к мультимедиа.
  • AudioContext: используется для создания анализатора.

Используемые методы:

  • getUserMedia: получает доступ к микрофону.
  • createMediaStreamSource: создает источник из потока для создания визуализатора звука.
  • getContext: этот метод используется для получения доступа к контексту холста.
  • requestAnimationFrame: этот метод помогает создавать анимацию.

Подход: Для создания аудиовизуализатора последуют следующие шаги:

  • Создайте элемент холста, чтобы нарисовать визуализатор и кнопку для доступа к системному звуку в коде HTML.
  • Получите доступ к своему микрофону с помощью API-интерфейса навигатора , который возвращает объект потока. MediaDevices — это класс, который обеспечивает доступ к аудиопотоку и может быть доступен только с помощью пользовательских событий, поэтому создайте кнопку и зарегистрируйте функцию, как показано ниже.

Синтаксис:

var btn = document.getElementById("mybtn");
btn.onclick = async()=>{
 let stream =await navigator.mediaDevices.getUserMedia({
     audio: true,
     video: true
   });
}

В приведенном выше коде у нас есть кнопка, состоящая из функции обратного вызова для события onclick для доступа к аудиоустройству.

Создайте экземпляр класса AudioContext и передайте ему объект потока, как показано ниже. Кроме того, создайте анализатор, который будет использоваться для анализа аудиоузлов путем создания визуализации данных.

Синтаксис:

 const audioContext = new AudioContext();
 const analyser = audioContext.createAnalyser();
 const mediaStreamSource = 
     audioContext.createMediaStreamSource(stream);
 mediaStreamSource.connect(analyser);
 analyser.fftSize = 256;

Определите функцию drawVisualizer() , которая постоянно вызывает себя с определенной частотой кадров, используя функцию requestAnimationFrame для отражения изменений в звуковых сигналах.

Добавьте методы API холста в функцию drawVisualizer , чтобы создать окончательную визуализацию, как показано ниже:

function drawVisualizer() {
  requestAnimationFrame(drawVisualizer);
  
  const bufferLength = analyser.frequencyBinCount;
  const dataArray = new Uint8Array(bufferLength);
  analyser.getByteFrequencyData(dataArray);
  
  const width = visualizer.width;
  const height = visualizer.height;
  const barWidth = 10;
  
  const canvasContext = visualizer.getContext("2d");
  canvasContext.clearRect(0, 0, width, height);
  let x = 0;
  dataArray.forEach((item, index,array) => {
   const y = item / 255 * height*1.1;
   canvasContext.strokeStyle = `blue`;
   x = x + barWidth;
   canvasContext.beginPath();
   canvasContext.lineCap = "round";
   canvasContext.lineWidth = 2;
   canvasContext.moveTo(x, height);
   canvasContext.lineTo(x, height - y);
   canvasContext.stroke();
  })
 }

В приведенном выше фрагменте кода изначально мы объявляем типизированный массив для хранения аудиоузлов в виде целочисленных значений , т.е. dataArray, то мы получаем доступ к элементу холста, созданному выше , с помощью селектора JS ie.visualizer и получаем доступ к 2D-контексту холста, т.е.canvasContext. Мы перебираем элементы массива данных и для каждого элемента рисуем линейный путь от нижней части элемента холста до точки (x, высота — y) из приведенного выше кода. Мы назначили синий цвет линии и ширину линии 2 , что помогает нам рисовать несколько вертикальных линий.

Пример. В этом примере мы создаем визуализатор аудио с помощью Canvas API , AudioContext и mediaDevices .

Вывод: этот вывод состоит из круглого визуализатора синего цвета и кнопки рядом с ним для доступа к медиаресурсам системы.