Spec-Zone.ru › Web APIs

BaseAudioContext: метод createBuffer()

Базовая Широко поддерживается

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с апреля 2021 года.

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

Метод createBuffer() интерфейса BaseAudioContext используется для создания нового пустого объекта AudioBuffer, который затем можно заполнить данными и воспроизвести с помощью AudioBufferSourceNode.

Дополнительную информацию об аудиобуферах можно найти на странице справки AudioBuffer.

Примечание: createBuffer() раньше мог принимать сжатые данные и возвращать декодированные образцы, но эта возможность была удалена из спецификации, так как весь декодирование производился в основном потоке, поэтому createBuffer() блокировал выполнение других кодов. Асинхронный метод decodeAudioData() выполняет ту же функцию — принимает сжатый аудио, такой как файл MP3, и напрямую возвращает AudioBuffer, который затем можно воспроизвести с помощью AudioBufferSourceNode. Для простых случаев, таких как воспроизведение MP3, следует использовать decodeAudioData().

Для более глубокого понимания работы аудиобуферов, включая назначение параметров, прочитайте статью «Аудиобуферы: кадры, образцы и каналы» в нашем руководстве по основным концепциям здесь.

Синтаксис

createBuffer(numOfChannels, length, sampleRate)

Параметры

numOfChannels

Целое число, представляющее количество каналов, которые должен иметь этот буфер. Значение по умолчанию равно 1, и все агенты пользователя должны поддерживать как минимум 32 канала.

length

Целое число, представляющее размер буфера в кадрах с образцами (каждый кадр с образцом — это размер образца в байтах, умноженный на numOfChannels). Чтобы определить length для определённого количества секунд аудио, используйте numSeconds * sampleRate.

sampleRate

Частота дискретизации линейных аудиоданных в кадрах с образцами в секунду. Все браузеры должны поддерживать частоты дискретизации в диапазоне от 8000 Гц до 96000 Гц.

Возвращаемое значение

Объект AudioBuffer, настроенный в соответствии с указанными параметрами.

Исключения

NotSupportedError DOMException

Выбрасывается, если один или несколько параметров имеют отрицательное значение или другое недопустимое значение (например, numberOfChannels превышает поддерживаемое значение или sampleRate выходит за номинальный диапазон).

RangeError

Выбрасывается, если для выделения буфера недостаточно памяти.

Примеры

Сначала несколько простых тривиальных примеров, чтобы помочь объяснить, как используются параметры:

const audioCtx = new AudioContext();
const buffer = audioCtx.createBuffer(2, 22050, 44100);

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

const audioCtx = new AudioContext();
const buffer = audioCtx.createBuffer(1, 22050, 22050);

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

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

Теперь давайте рассмотрим более сложный createBuffer() пример, в котором мы создаём буфер длительностью три секунды, заполняем его белым шумом, а затем воспроизводим его через AudioBufferSourceNode. Комментарий чётко объясняет, что происходит. Вы также можете запустить код онлайн или посмотреть исходный код.

const audioCtx = new AudioContext();

// Create an empty three-second stereo buffer at the sample rate of the AudioContext
const myArrayBuffer = audioCtx.createBuffer(
  2,
  audioCtx.sampleRate * 3,
  audioCtx.sampleRate,
);

// Fill the buffer with white noise;
// just random values between -1.0 and 1.0
for (let channel = 0; channel < myArrayBuffer.numberOfChannels; channel++) {
  // This gives us the actual ArrayBuffer that contains the data
  const nowBuffering = myArrayBuffer.getChannelData(channel);
  for (let i = 0; i < myArrayBuffer.length; i++) {
    // Math.random() is in [0; 1.0]
    // audio needs to be in [-1.0; 1.0]
    nowBuffering[i] = Math.random() * 2 - 1;
  }
}

// Get an AudioBufferSourceNode.
// This is the AudioNode to use when we want to play an AudioBuffer
const source = audioCtx.createBufferSource();
// set the buffer in the AudioBufferSourceNode
source.buffer = myArrayBuffer;
// connect the AudioBufferSourceNode to the
// destination so we can hear the sound
source.connect(audioCtx.destination);
// start the source playing
source.start();

Технические характеристики

Спецификация
Web Audio API
# dom-baseaudiocontext-createbuffer

Совместимость с браузерами

Рабочие столы Мобильные устройства
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari на iOS Samsung Internet WebView Android
createBuffer 14 12 25 15 6 18 25 14 6 1.0 4.4.3

См. также

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

© 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/BaseAudioContext/createBuffer

Spec-Zone.ru

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