Spec-Zone.ru › Web APIs

Основные понятия API Web Audio

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

Графы аудио

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

Аудиоузлы связаны через свои входные и выходные данные, образуя цепочку, которая начинается с одного или нескольких источников, проходит через один или несколько узлов и заканчивается в пункте назначения (хотя вам не нужно указывать пункт назначения, если вы хотите только визуализировать некоторые аудиоданные). Типичный рабочий процесс работы с веб-аудио выглядит примерно так:

  1. Создайте контекст аудио.
  2. Создайте аудиоисточники внутри контекста (такие как <audio>, генератор колебаний или поток).
  3. Создайте аудиоэффекты (например, узлы реверберации, биквадратного фильтра, панера или компрессора).
  4. Выберите конечный пункт назначения для аудио (например, динамики компьютера пользователя).
  5. Подключите узлы источника к нулю или более узлам эффектов, а затем к выбранному пункту назначения.

Примечание: Нотация каналов — это числовое значение, например, 2.0 или 5.1, представляющее количество доступных аудиоканалов в сигнале. Первое число — количество каналов сигнала с полным диапазоном частот. Число, указанное после точки, указывает количество каналов, резервируемых для выходов эффектов низких частот (LFE); их часто называют сабвуферами.

A simple box diagram with an outer box labeled Audio context and three inner boxes labeled Sources, Effects, and Destination. The three inner boxes have arrows between them pointing from left to right, indicating the flow of audio information.

Каждый вход или выход состоит из одного или нескольких аудиоканалов, которые вместе представляют определённую структуру аудио. Поддерживается любая дискретная структура каналов, включая моно, стерео, квадро, 5.1 и так далее.

Show the ability of audio nodes to connect via their inputs and outputs and the channels inside these inputs/outputs.

Есть несколько способов получить аудио:

  • Звук может быть сгенерирован непосредственно в JavaScript с помощью аудиоузла (например, генератора колебаний).
  • Он может быть создан из исходных данных PCM (например, файлы .WAV или другие форматы, поддерживаемые decodeAudioData()).
  • Он может быть сгенерирован из HTML-медиаэлементов, таких как <video> или <audio>.
  • Он может быть получен из потока WebRTC MediaStream, такого как веб-камера или микрофон.

Аудиоданные: что представляет собой образец

При обработке аудиосигнала происходит выборка. Выборка — это преобразование непрерывного сигнала в дискретный сигнал. Другими словами, непрерывная звуковая волна, например, выступление группы, преобразуется в последовательность цифровых выборок (дискретный сигнал во времени), что позволяет компьютеру обрабатывать звук отдельными блоками.

Дополнительную информацию можно найти на странице Википедии Выборка (обработка сигналов).

Буферы аудио: кадры, образцы и каналы

Аудиобуфер AudioBuffer определяется тремя параметрами:

  • количество каналов (1 для моно, 2 для стерео и т. д.),
  • его длина, то есть количество кадров образцов внутри буфера,
  • и частота дискретизации, количество кадров образцов за секунду.

Образец — это единственное 32-битное значение с плавающей точкой, представляющее значение аудиопотока в определённый момент времени в определённом канале (левый или правый, если речь идёт о стерео). Кадр или кадр образца — это набор всех значений для всех каналов, которые будут воспроизводиться в определённый момент времени: все образцы всех каналов, воспроизводимые одновременно (два для стереозвука, шесть для 5.1 и т. д.).

Частота дискретизации — это количество образцов (или кадров, так как все образцы кадра воспроизводятся одновременно), которые будут воспроизводиться в секунду, измеряется в Гц. Чем выше частота дискретизации, тем лучше качество звука.

Рассмотрим моно- и стерео аудиобуфер, каждый длиной в одну секунду с частотой 44100 Гц:

  • Буфер моно будет содержать 44 100 образцов и 44 100 кадров. Свойство length будет равно 44 100.
  • Буфер стерео будет содержать 88 200 образцов, но всё ещё 44 100 кадров. Свойство length по-прежнему будет равно 44100, поскольку оно равно числу кадров.

A diagram showing several frames in an audio buffer in a long line, each one containing two samples, as the buffer has two channels, it is stereo.

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

Примечание: Чтобы получить время в секундах из количества кадров, разделите количество кадров на частоту дискретизации. Чтобы получить количество кадров из количества образцов, вам нужно только разделить последнее значение на количество каналов.

Вот несколько простых примеров:

const context = new AudioContext();
const buffer = new AudioBuffer(context, {
  numberOfChannels: 2,
  length: 22050,
  sampleRate: 44100,
});

Примечание: В цифровом аудио 44 100 Гц (также представлено как 44,1 кГц) является распространённой частотой дискретизации. Почему 44,1 кГц?

Во-первых, потому что диапазон восприятия человеческого уха составляет примерно от 20 Гц до 20 000 Гц. В соответствии с теоремой Найквиста — Шеннона частота дискретизации должна быть больше, чем в два раза превышать максимальную частоту, которую нужно воспроизвести. Поэтому частота дискретизации должна быть больше, чем 40 000 Гц.

Во-вторых, сигналы должны быть отфильтрованы до дискретизации, иначе возникает искажение. В то время как идеальный низкочастотный фильтр идеально пропускал бы частоты ниже 20 кГц (без их ослабления) и идеально обрезал бы частоты выше 20 кГц, на практике необходима переходная полоса, где частоты частично ослабляются. Чем шире эта переходная полоса, тем проще и экономичнее создание антилиасингового фильтра. Частота дискретизации 44,1 кГц позволяет использовать переходную полосу 2,05 кГц.

Если вы используете вызов выше, вы получите стерео буфер с двумя каналами, который, при воспроизведении на AudioContext, работающем с частотой 44100 Гц (очень распространённое значение, большинство обычных звуковых карт работают с этой частотой), будет воспроизводиться в течение 0,5 секунд: 22 050 кадров/44 100 Гц = 0,5 секунды.

const context = new AudioContext();
const buffer = new AudioBuffer(context, {
  numberOfChannels: 1,
  length: 22050,
  sampleRate: 22050,
});

Если вы используете этот вызов, вы получите моно буфер (буфер с одним каналом), который, при воспроизведении на AudioContext, работающем с частотой 44 100 Гц, будет автоматически передискретизирован до 44 100 Гц (и, следовательно, даст 44 100 кадров) и длиться 1 секунду: 44 100 кадров/44 100 Гц = 1 секунда.

Примечание: Передискретизация аудио очень похожа на изменение размера изображения. Скажем, у вас есть изображение 16x16, но вы хотите, чтобы оно заполнило область 32x32. Вы меняете его размер (или передискретизируете). Результат имеет меньшее качество (он может быть размытым или неровным, в зависимости от алгоритма изменения размера), но он работает, а изменённое по размеру изображение занимает меньше места. Передискретизированное аудио то же самое: вы экономите место, но, на практике, вы не сможете правильно воспроизвести высокочастотный контент или высокие частоты звука.

Планарные и интерлированные буферы

API Web Audio использует формат планарного буфера. Левый и правый каналы хранятся следующим образом:

LLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRR (for a buffer of 16 frames)

Эта структура широко используется в обработке аудио, что упрощает обработку каждого канала независимо.

Альтернативой является использование формата интерлированного буфера:

LRLRLRLRLRLRLRLRLRLRLRLRLRLRLRLR (for a buffer of 16 frames)

Этот формат широко используется для хранения и воспроизведения аудио без значительной обработки, например, файлы .WAV или декодированный поток MP3.

Поскольку API Web Audio предназначен для обработки, он предоставляет только планарные буферы. Он использует планарный формат, но преобразует аудио в интерлированный формат, когда отправляет его на звуковую карту для воспроизведения. Обратно, когда API декодирует MP3, он начинает с интерлированного формата и преобразует его в планарный для обработки.

Аудиоканалы

Каждый аудиобуфер может содержать разное количество каналов. Большинство современных аудиоустройств используют базовые настройки моно (только один канал) и стерео (левый и правый каналы). Некоторые более сложные наборы поддерживают настройки звука объемного звука (например, квадро и 5.1), что может привести к более богатому звуковому опыту благодаря большому количеству каналов. Обычно мы представляем каналы с помощью стандартных сокращений, представленных в таблице ниже:

Название Каналы
Моно 0: M: mono
Стерео 0: L: left 1: R: right
Квадро 0: L: left 1: R: right 2: SL: surround left 3: SR: surround right
5.1 0: L: left 1: R: right 2: C: center 3: LFE: subwoofer 4: SL: surround left 5: SR: surround right

Улучшение и уменьшение микширования

Когда количество каналов входного и выходного сигналов не совпадает, необходимо выполнить апмиксинг или даунмиксинг. Следующие правила, управляемые настройкой свойства AudioNode.channelInterpretation на speakers или discrete, применяются:

Интерпретация Входные каналы Выходные каналы Правила микширования
speakers 1 (Моно) 2 (Стерео) Апмиксинг с моно на стерео.
Входной канал M используется для обоих выходных каналов (L и R).
output.L = input.M
output.R = input.M
1 (Моно) 4 (Квадро) Апмиксинг с моно на квадро.
Входной канал M используется для не-задних выходных каналов (L и R). Задние выходные каналы (SL и SR) остаются бесзвучными.
output.L = input.M
output.R = input.M
output.SL = 0
output.SR = 0
1 (Моно) 6 (5.1) Апмиксинг с моно на 5.1.
Входной канал M используется для центрального выходного канала (C). Все остальные (L, R, LFE, SL, и SR) остаются бесзвучными.
output.L = 0
output.R = 0

output.C = input.M
output.LFE = 0
output.SL = 0
output.SR = 0
2 (Стерео) 1 (Моно) Даунмиксинг с стерео на моно.
Оба входных канала (L и R) равномерно комбинируются для получения единственного выходного канала (M).
output.M = 0.5 * (input.L + input.R)
2 (Стерео) 4 (Квадро) Апмиксинг со стерео на квадро.
Входные каналы L и R используются для их соответствующих не-задних выходных каналов (L и R). Задние выходные каналы (SL и SR) остаются бесзвучными.
output.L = input.L
output.R = input.R
output.SL = 0
output.SR = 0
2 (Стерео) 6 (5.1) Апмиксинг со стерео на 5.1.
Входные каналы L и R используются для их соответствующих не-задних выходных каналов (L и R). Задние выходные каналы (SL и SR), а также центральный (C) и сабвуферный (LFE) каналы остаются бесзвучными.
output.L = input.L
output.R = input.R
output.C = 0
output.LFE = 0
output.SL = 0
output.SR = 0
4 (Квадро) 1 (Моно) Даунмиксинг с квадро на моно.
Все четыре входных канала (L, R, SL, и SR) равномерно комбинируются для получения единственного выходного канала (M).
output.M = 0.25 * (input.L + input.R + input.SL + input.SR)
4 (Квадро) 2 (Стерео) Даунмиксинг с квадро на стерео.
Оба левых входных канала (L и SL) равномерно комбинируются для получения единственного левого выходного канала (L). Аналогично, оба правых входных канала (R и SR) равномерно комбинируются для получения единственного правого выходного канала (R).
output.L = 0.5 * (input.L + input.SL)
output.R = 0.5 * (input.R + input.SR)
4 (Квадро) 6 (5.1) Апмиксинг с квадро на 5.1.
Входные каналы L, R, SL, и SR используются для соответствующих выходных каналов (L и R). Центральный (C) и сабвуферный (LFE) каналы остаются бесзвучными.
output.L = input.L
output.R = input.R
output.C = 0
output.LFE = 0
output.SL = input.SL
output.SR = input.SR
6 (5.1) 1 (Моно) Даунмиксинг с 5.1 на моно.
Левые (L и SL), правые (R и SR) и центральные каналы смешиваются вместе. Каналы окружения незначительно ослабляются, а обычные боковые каналы компенсируются по мощности, чтобы считаться одним каналом, умножаясь на √2/2. Сабвуферный (LFE) канал теряется.
output.M = 0.7071 * (input.L + input.R) + input.C + 0.5 * (input.SL + input.SR)
6 (5.1) 2 (Стерео) Даунмиксинг с 5.1 на стерео.
Центральный канал (C) суммируется с каждым боковым каналом окружения (SL или SR) и смешивается в каждый боковой канал. При микшировании до двух каналов микширование происходит с меньшей мощностью: в каждом случае оно умножается на √2/2. Сабвуферный (LFE) канал теряется.
output.L = input.L + 0.7071 * (input.C + input.SL)
output.R = input.R + 0.7071 * (input.C + input.SR)
6 (5.1) 4 (Квадро) Даунмиксинг с 5.1 на квадро.
Центральный (C) смешивается с боковыми не-задними каналами (L и R). При микшировании до двух каналов микширование происходит с меньшей мощностью: в каждом случае оно умножается на √2/2. Каналы окружения передаются без изменений. Сабвуферный (LFE) канал теряется.
output.L = input.L + 0.7071 * input.C
output.R = input.R + 0.7071 * input.C
output.SL = input.SL
output.SR = input.SR
Другие, нестандартные макеты Нестандартные макеты каналов ведут себя так, как будто channelInterpretation установлено на discrete.
Спецификация явно разрешает будущую дефиницию новых макетов динамиков. Поэтому этот резервный вариант не является будущим доказательством, поскольку поведение браузеров для определенного количества каналов может измениться в будущем.
discrete любой (x) любой (y) где x<y Апмиксинг дискретных каналов.
Заполните каждый выходной канал его входным аналогом — то есть входным каналом с тем же индексом. Каналы без соответствующих входных каналов остаются бесзвучными.
любой (x) любой (y) где x>y Даунмиксинг дискретных каналов.
Заполните каждый выходной канал его входным аналогом — то есть входным каналом с тем же индексом. Входные каналы без соответствующих выходных каналов отбрасываются.

Визуализации

В общем случае, мы получаем выходной сигнал во времени для создания визуализаций звука, обычно считывая данные о его усилении или частоте. Затем, используя графический инструмент, мы преобразуем полученные данные в визуальное представление, такое как график. В API Web Audio доступен анализатор AnalyserNode, который не изменяет аудиосигнал, проходящий через него. Кроме того, он выводит аудиоданные, позволяя обрабатывать их с помощью технологии, такой как <canvas>.

Without modifying the audio stream, the node allows to get the frequency and time-domain data associated with it, using an FFT.

Вы можете получить данные, используя следующие методы:

AnalyserNode.getFloatFrequencyData()

Копирует текущие данные частоты в массив Float32Array, переданный в него.

AnalyserNode.getByteFrequencyData()

Копирует текущие данные частоты в массив Uint8Array (массив беззнаковых байтов), переданный в него.

AnalyserNode.getFloatTimeDomainData()

Копирует текущие данные волны или данных во временной области в массив Float32Array, переданный в него.

AnalyserNode.getByteTimeDomainData()

Копирует текущие данные волны или данные во временной области в массив Uint8Array (массив беззнаковых байтов), переданный в него.

Примечание: Дополнительную информацию можно найти в нашей статье Визуализации с помощью API Web Audio.

Стереоэффекты

Стереоэффекты позволяют моделировать положение и поведение аудиосигнала в определённой точке физического пространства, имитируя восприятие звука слушателем. В API Web Audio стереоэффекты обрабатываются узлом PannerNode и AudioListener.

Узел использует правую декартову систему координат для описания положения источника звука как вектора и его ориентации как 3D конуса направления. Конус может быть довольно широким, например, для оминиканальных источников.

The PannerNode defines a spatial position and orientation for a given signal.

Аналогично, API Web Audio описывает слушателя, используя правую декартову систему координат: его положение как вектор и его ориентацию как два вектора направления, вверх и вперёд. Эти векторы определяют направление вершины головы слушателя и направление, в котором смотрит нос слушателя. Векторы перпендикулярны друг другу.

We see the position, up, and front vectors of an AudioListener, with the up and front vectors at 90° from the other.

Примечание: Дополнительную информацию можно найти в нашей статье Основы стереоэффектов в Web Audio.

Fan-in и Fan-out

В аудиотерминах, фан-ин описывает процесс, с помощью которого ChannelMergerNode принимает ряд моно входных источников и выдает один многоканальный сигнал:

Fan-in process diagram. Multiple point-less arrows representing mono-input sources combine to output a single pointed arrow representing a single multi-channel signal

Фан-аут описывает обратный процесс, при котором ChannelSplitterNode принимает многоканальный входной источник и выдает несколько моно выходных сигналов:

Fan-out process diagram. A single point-less arrow representing a multi-channel input source splits to output multiple pointed arrows representing multiple mono output signals

© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Basic_concepts_behind_Web_Audio_API

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API