AudioContext: метод setSinkId()
Экспериментальная функция: Это экспериментальная технология
Перед использованием в рабочей среде тщательно изучите таблицу совместимости с браузерами.
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или всех поддерживающих браузерах.
Метод setSinkId() интерфейса AudioContext устанавливает выходное аудиоустройство для AudioContext. Если идентификатор устройства не установлен явно, будет использоваться стандартное системное выходное аудиоустройство.
Для установки аудиоустройства, отличного от стандартного, разработчик должен получить разрешение на доступ к аудиоустройствам. При необходимости пользователю может быть предложено предоставить необходимое разрешение через вызов MediaDevices.getUserMedia().
Кроме того, эта функция может быть заблокирована с помощью speaker-selection Политики разрешений.
Синтаксис
setSinkId(sinkId)
Параметры
sinkId-
Идентификатор устройства, которое вы хотите установить в качестве выходного аудиоустройства. Он может принимать один из следующих типов значений:
- Строка
-
Строка, представляющая идентификатор устройства, например, полученная через свойство
deviceIdобъектовMediaDeviceInfo, возвращаемых методомMediaDevices.enumerateDevices(). AudioSinkOptions-
Объект, представляющий различные параметры для идентификатора устройства. В настоящее время он принимает одно свойство
type, со значениемnone. Установка этого параметра приводит к обработке аудио без воспроизведения через какое-либо аудиоустройство. Этот параметр полезен для минимизации потребления энергии, когда воспроизведение не требуется вместе с обработкой.
Возвращаемое значение
Объект Promise, который завершается значением undefined.
Попытка установить идентификатор устройства на его текущее значение (т. е. возвращаемое методом AudioContext.sinkId) не вызывает ошибок, но немедленно прерывает процесс.
Исключения
-
InvalidAccessErrorDOMException -
Выбрасывается, если доступ к выбранному аудиовыходному устройству не удался.
-
NotAllowedErrorDOMException -
Выбрасывается, если браузер не имеет разрешения на доступ к аудиоустройствам.
-
NotFoundErrorDOMException -
Выбрасывается, если переданный
sinkIdне соответствует ни одному аудиоустройству, найденному в системе.
Примеры
В нашем примере SetSinkId (посмотрите исходный код) мы создаем аудиографик, генерирующий трехсекундный импульс белого шума через AudioBufferSourceNode, который мы также пропускаем через GainNode, чтобы немного его приглушить.
Мы также предоставляем пользователю раскрывающееся меню, позволяющее изменять аудиовыходное устройство в реальном времени. Для этого мы:
-
Предоставляем кнопку для заполнения раскрывающегося меню. Сначала мы вызываем
MediaDevices.getUserMedia(), чтобы вызвать запрос разрешений, необходимый для перечисления устройств, а затем используемMediaDevices.enumerateDevices(), чтобы получить все доступные устройства. Мы перебираем разные устройства и делаем каждое из них доступным в качестве варианта в элементе<select>. Мы также создаем вариант «Нет» на случай, если вы не хотите воспроизводить аудио ни на каком выходе.mediaDeviceBtn.addEventListener('click', async () => { if ("setSinkId" in AudioContext.prototype) { selectDiv.textContent = ""; const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); const devices = await navigator.mediaDevices.enumerateDevices(); // Most of the DOM scripting to generate the dropdown cut out for brevity const audioOutputs = devices.filter( (device) => device.kind === 'audiooutput' && device.deviceId !== 'default' ); audioOutputs.forEach((device) => { const option = document.createElement('option') option.value = device.deviceId; option.textContent = device.label; select.appendChild(option); }); const option = document.createElement('option') option.value = 'none'; option.textContent = 'None'; select.appendChild(option); //... -
Добавляем обработчик события
changeк элементу<select>, чтобы изменить идентификатор устройства и, следовательно, аудиовыходное устройство при выборе нового значения. Если в раскрывающемся списке выбран «Нет», мы вызываемsetSinkId()с параметром{ type : 'none' }для выбора без аудиоустройства, в противном случае мы запускаем его с идентификатором аудиоустройства, содержащимся в атрибуте<select>элементаvalue.// ... select.addEventListener('change', async () => { if(select.value === 'none') { await audioCtx.setSinkId({ type : 'none' }); } else { await audioCtx.setSinkId(select.value); } }) } });
Выходное устройство можно изменять во время воспроизведения аудио, а также до или между воспроизведениями.
Спецификации
| Спецификация |
|---|
| Web Audio API # dom-audiocontext-setsinkid |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
setSinkId |
110 | 110 | Нет | 96 | Нет | 110 | Нет | 74 | Нет | 21.0 | 110 |
См. также
© 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/AudioContext/setSinkId