Использование Web Audio API

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

Внимание. При использовании YandexAudio API разработчику не нужно самостоятельно создавать объект AudioContext. Этот объект создается библиотекой YandexAudio автоматически, после ее загрузки на страницу. Ссылка на созданный аудиоконтекст сохраняется в статическом поле 'audioContext' класса Audio.

Чтобы использовать возможности Web Audio API при работе с плеером, нужно вызвать метод toggleWebAudioAPI() с аргументом 'true':

// Создаем плеер.
var audioPlayer = new ya.music.Audio('html5');

// Включаем режим использования Web Audio API
// для созданного плеера.
audioPlayer.toggleWebAudioAPI(true);
Примечание. Web Audio API доступен только для HTML5-плеера. Для Flash-плеера работа с Web Audio API не поддерживается.

В результате вызова функции toggleWebAudioAPI() будет создано необходимое окружение для работы Web Audio API — будет создан источник звука на основе HTML5-плеера, а также настроен модуль GainNode для установки итоговой громкости. На основе созданного окружения будет построен граф, удовлетворяющий следующей схеме (см. рис. 1):

Чтобы добавить в этот граф дополнительные модули, необходимо вызвать функцию setAudioPreprocessor(). В качестве аргумента данной функции следует передать объект, содержащий свойства:

  • input — модуль, который нужно соединить с источником звука (узел Source);
  • output — модуль, который нужно соединить с узлом GainNode. Если в граф добавляется один модуль, то свойство output будет совпадать с input.

Ниже приведен пример, демонстрирующий добавление в граф модуля DelayNode. Данный модуль позволяет задерживать звук на определенное время.

// Создание модуля для задержки звука.
var delayNode = Audio.audiocontext.createDelay();
// Устанавливаем задержку звука в 3 секунды.
delayNode.delayTime.value = 3;

// Добавляем созданный модуль в граф.
audioPlayer.setAudioPreprocessor({
    input: delayNode,
    output: delayNode
});

В результате выполнения этого кода будет сформирован новый граф, содержащий дополнительный модуль DelayNode:

Примечание. Дополнительные модули могут быть добавлены только между узлами Source и GainNode. Узел GainNode выполняет постобработку звука, необходимую для предотвращения искажения выходного сигнала, поэтому этот узел должен следовать последним.

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

// Создаем два модуля для задержки звука.
var delayNode1 = Audio.audiocontext.createDelay(),
    delayNode2 = Audio.audiocontext.createDelay();

// Соединяем эти модули между собой.
delayNode1.connect(delayNode2);

// Добавляем созданные модули в граф.
audioPlayer.setAudioPreprocessor({
    input: delayNode1,
    output: delayNode2
});
Примечание. Библиотека YandexAudio предоставляет вспомогательный модуль ya.music.Audio.fx.Equalizer. Данный модуль предназначен для упрощения работы с нативным модулем Web Audio API — BiquadFilterNode. Подробно об использовании модуля ya.music.Audio.fx.Equalizer можно ознакомиться в статье.

При вызове функции toggleWebAudioAPI() с аргументом 'false' все модули графа (в том числе GaneNode) будут удалены и управление громкостью будет передано технологии HTML5 Audio.