AudioContext: примеры (JAVASCRIPT)

Руководство по использованию AudioContext для обработки звука
Раздел: Web Audio API, Контекст
AudioContext(options (object)): AudioContext

Основы AudioContext

Объект AudioContext представляет интерфейс Web Audio API для обработки и синтеза звука в веб-приложениях. Он создает граф аудиоузлов, где источник звука соединяется с пунктом назначения.

Конструктор AudioContext() не требует обязательных аргументов, но может принимать объект настроек:

const audioContext = new AudioContext(options);

Параметр options - необязательный объект со свойствами:

  • sampleRate - частота дискретизации контекста в герцах.
  • latencyHint - подсказка о балансе между задержкой и энергопотреблением ('balanced', 'interactive', 'playback').

Методы объекта включают createOscillator(), createBufferSource(), createGain(), createBiquadFilter() и другие для создания аудиоузлов.

Простые примеры использования

Создание базового аудиоконтекста:

// Создание контекста с настройками
const context = new AudioContext({
  latencyHint: 'interactive',
  sampleRate: 44100
});
console.log(context.state); // 'running' или 'suspended'
AudioContext {state: 'running', sampleRate: 44100, ...}

Воспроизведение простого тона:

const ctx = new AudioContext();
const oscillator = ctx.createOscillator();
oscillator.connect(ctx.destination);
oscillator.start();
setTimeout(() => oscillator.stop(), 1000);
// Слышим тон частотой 440 Гц в течение 1 секунды

Похожие возможности JavaScript

HTMLAudioElement обеспечивает простой способ встраивания звука через тег <audio>. Подходит для воспроизведения медиафайлов без сложной обработки.

WebRTC позволяет захватывать и обрабатывать аудиопотоки с устройства пользователя, что полезно для видеоконференций.

MediaRecorder API записывает аудиопотоки, но не предоставляет инструментов для тонкой обработки звука.

AudioContext предпочтителен для задач синтеза, анализа или применения эффектов к аудио.

Аналоги в других языках

В Python библиотека pyaudio обеспечивает работу со звуком:

import pyaudio
import numpy as np

p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paFloat32,
                channels=1,
                rate=44100,
                output=True)
# Генерация и воспроизведение тона
tone = np.sin(2 * np.pi * 440 * np.arange(44100) / 44100)
stream.write(tone.astype(np.float32).tobytes())

В C используют PortAudio или OpenAL для кросс-платформенной работы со звуком. Эти библиотеки требуют больше кода для инициализации по сравнению с браузерным API.

В PHP прямой аналог отсутствует, так как язык работает на сервере. Для обработки аудиофайлов применяют расширения вроде FFmpeg.

Распространенные ошибки

Попытка автоматического воспроизведения без жеста пользователя:

// Не сработает во многих браузерах
const ctx = new AudioContext();
const osc = ctx.createOscillator();
osc.connect(ctx.destination);
osc.start(); // Вызовет ошибку
// Ошибка: NotAllowedError

Решение - запускать контекст по действию пользователя:

document.addEventListener('click', () => {
  if (ctx.state === 'suspended') {
    ctx.resume();
  }
});

Использование узлов после их остановки:

const source = ctx.createBufferSource();
source.start();
source.stop();
// Пытаемся использовать снова - ошибка
source.start();
InvalidStateError: Cannot call start more than once

Изменения в современных версиях

Спецификация Web Audio API обновилась, добавив AudioWorklet как замену устаревшему ScriptProcessorNode для выполнения пользовательской обработки аудио.

Добавлена поддержка channelCountMode и channelInterpretation для лучшего контроля над аудиоканалами.

Метод resume() теперь возвращает Promise, что упрощает работу с асинхронным кодом.

Появилась возможность создать AudioContext с пользовательской частотой дискретизации, если устройство поддерживает.

Расширенные примеры применения

Применение фильтра к аудиопотоку:

Пример javascript
async function playFilteredSound() {
  const ctx = new AudioContext();
  const response = await fetch('audio.mp3');
  const arrayBuffer = await response.arrayBuffer();
  const audioBuffer = await ctx.decodeAudioData(arrayBuffer);
  
  const source = ctx.createBufferSource();
  source.buffer = audioBuffer;
  
  const filter = ctx.createBiquadFilter();
  filter.type = 'lowpass';
  filter.frequency.value = 1000;
  
  source.connect(filter);
  filter.connect(ctx.destination);
  source.start();
}

Визуализация аудиоспектра:

Пример javascript
const ctx = new AudioContext();
const analyser = ctx.createAnalyser();
analyser.fftSize = 2048;
const bufferLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);

// Подключение анализатора к источнику звука
source.connect(analyser);
analyser.connect(ctx.destination);

function draw() {
  analyser.getByteFrequencyData(dataArray);
  // Использование dataArray для отрисовки
  requestAnimationFrame(draw);
}

Создание пространственного звука с PannerNode:

Пример javascript
const panner = ctx.createPanner();
panner.panningModel = 'HRTF';
panner.setPosition(1, 0, 0); // Источник справа
source.connect(panner);
panner.connect(ctx.destination);

JS AudioContext function comments

En
AudioContext Represents an audio-processing graph