Изучение методов получения амплитуды микрофона с помощью JavaScript

Вход для микрофона – распространенная функция веб-приложений, позволяющая пользователям взаимодействовать с аудиоконтентом. Одним из важных аспектов работы с микрофонным входом является получение амплитуды, которая представляет силу или громкость аудиосигнала. В этой статье мы рассмотрим различные методы получения амплитуды микрофона с помощью JavaScript. Мы предоставим примеры кода для иллюстрации каждого подхода. Давайте погрузимся!

Метод 1: API веб-аудио
API веб-аудио предоставляет мощные возможности для работы со звуком в браузере. Чтобы получить амплитуду микрофона с помощью этого API, вы можете выполнить следующие действия:

navigator.mediaDevices.getUserMedia({ audio: true })
  .then((stream) => {
    const audioContext = new AudioContext();
    const microphone = audioContext.createMediaStreamSource(stream);
    const analyser = audioContext.createAnalyser();
    microphone.connect(analyser);
    analyser.connect(audioContext.destination);
    const bufferLength = analyser.fftSize;
    const data = new Uint8Array(bufferLength);
    function updateAmplitude() {
      analyser.getByteTimeDomainData(data);
      // Calculate the average amplitude
      const sum = data.reduce((acc, value) => acc + value, 0);
      const amplitude = sum / bufferLength;
      // Use the amplitude value
      console.log(amplitude);
      requestAnimationFrame(updateAmplitude);
    }
    updateAmplitude();
  })
  .catch((error) => {
    console.error('Error accessing microphone:', error);
  });

Метод 2: getUserMedia с ScriptProcessorNode (устарел)
До API веб-аудио ScriptProcessorNode обычно использовался для обработки ввода с микрофона. Хотя сейчас он устарел, его все еще можно использовать для совместимости со старыми браузерами. Вот пример:

navigator.mediaDevices.getUserMedia({ audio: true })
  .then((stream) => {
    const audioContext = new AudioContext();
    const microphone = audioContext.createMediaStreamSource(stream);
    const scriptProcessor = audioContext.createScriptProcessor(1024, 1, 1);
    scriptProcessor.onaudioprocess = (event) => {
      const inputBuffer = event.inputBuffer.getChannelData(0);

      // Calculate the average amplitude
      const sum = inputBuffer.reduce((acc, value) => acc + Math.abs(value), 0);
      const amplitude = sum / inputBuffer.length;

      // Use the amplitude value
      console.log(amplitude);
    };

    microphone.connect(scriptProcessor);
    scriptProcessor.connect(audioContext.destination);
  })
  .catch((error) => {
    console.error('Error accessing microphone:', error);
  });

Метод 3: getUserMedia с AnalyserNode (устаревший)
Для старых браузеров, которые не поддерживают API веб-аудио, вы можете использовать устаревший метод, включающий AnalyserNode. Вот пример:

navigator.getUserMedia = (navigator.getUserMedia ||
  navigator.webkitGetUserMedia ||
  navigator.mozGetUserMedia ||
  navigator.msGetUserMedia);
if (navigator.getUserMedia) {
  navigator.getUserMedia({ audio: true }, (stream) => {
    const audioContext = new (window.AudioContext || window.webkitAudioContext)();
    const microphone = audioContext.createMediaStreamSource(stream);
    const analyser = audioContext.createAnalyser();
    microphone.connect(analyser);
    const bufferLength = analyser.fftSize;
    const data = new Uint8Array(bufferLength);
    function updateAmplitude() {
      analyser.getByteTimeDomainData(data);
      // Calculate the average amplitude
      const sum = data.reduce((acc, value) => acc + value, 0);
      const amplitude = sum / bufferLength;
      // Use the amplitude value
      console.log(amplitude);
      requestAnimationFrame(updateAmplitude);
    }
    updateAmplitude();
  }, (error) => {
    console.error('Error accessing microphone:', error);
  });
} else {
  console.error('getUserMedia not supported in this browser.');
}

В этой статье мы рассмотрели несколько методов получения амплитуды микрофона с помощью JavaScript. Мы рассмотрели современный подход с использованием API веб-аудио, а также устаревшие и устаревшие методы для совместимости со старыми браузерами. Включив эти методы в свои веб-приложения, вы сможете улучшить взаимодействие с пользователем и создать инновационные функции на основе звука.