Spec-Zone.ru › Web APIs

MediaDevices: событие devicechange

Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или всех поддерживающих браузерах.

Событие devicechange отправляется экземпляру MediaDevices всякий раз, когда медиаустройство, такое как камера, микрофон или динамик, подключается или отключается от системы.

Это событие не отменяется и не распространяется.

Синтаксис

Используйте имя события в методах, таких как addEventListener(), или задайте свойство обработчика событий.

addEventListener("devicechange", (event) => {});

ondevicechange = (event) => {};

Тип события

Общее Event.

Пример

В этом примере мы создаём функцию updateDeviceList(), которая вызывается один раз, когда MediaDevices.getUserMedia() успешно получает поток, а затем вызывается каждый раз, когда список устройств изменяется. Она отображает в окне браузера два списка: один для аудиоустройств и один для видеоустройств, с меткой устройства (названием) и указанием, является ли это устройство устройством ввода или вывода. Так как пример предоставляет обработчик события devicechange, список обновляется каждый раз, когда к устройству, на котором запущен образец, подключается или отключается медиаустройство.

Мы настраиваем глобальные переменные, которые содержат ссылки на элементы <ul>, используемые для перечисления аудио- и видеоустройств:

const audioList = document.getElementById("audioList");
const videoList = document.getElementById("videoList");

Получение и отрисовка списка устройств

Теперь давайте посмотрим на updateDeviceList(). Этот метод вызывается всякий раз, когда нам нужно получить текущий список медиаустройств и обновить отображаемые списки аудио- и видеоустройств, используя эту информацию.

function updateDeviceList() {
  navigator.mediaDevices.enumerateDevices().then((devices) => {
    audioList.textContent = "";
    videoList.textContent = "";

    devices.forEach((device) => {
      const elem = document.createElement("li");
      const [kind, type, direction] = device.kind.match(/(\w+)(input|output)/i);

      elem.innerHTML = `<strong>${device.label}</strong> (${direction})`;
      if (type === "audio") {
        audioList.appendChild(elem);
      } else if (type === "video") {
        videoList.appendChild(elem);
      }
    });
  });
}

updateDeviceList() состоит целиком из вызова функции enumerateDevices() объекта MediaDevices, на который ссылается свойство navigator.mediaDevices, а также кода, выполняемого, когда promise, возвращаемый enumerateDevices(), выполняется. Обработчик выполнения вызывается, когда список устройств готов. Список передаётся в обработчик выполнения в виде массива объектов MediaDeviceInfo, каждый из которых описывает одно медиаустройство ввода или вывода.

Цикл forEach() используется для просмотра всех устройств. Для каждого устройства мы создаём новый объект <li>, используемый для отображения его пользователю.

Строка let [kind, type, direction] = device.kind.match(/(\w+)(input|output)/i); заслуживает особого внимания. Она использует деструктурирующее присваивание для присвоения значений первых трёх элементов массива, возвращаемого String.match(), переменным kind, type и direction. Мы делаем это, потому что значение MediaDeviceInfo.kind представляет собой одну строку, содержащую тип медиа и направление потока медиа, например, "audioinput" или "videooutput". Эта строка затем извлекает тип ("audio" или "video") и направление ("вход" или "выход"), чтобы их можно было использовать для построения строки, отображаемой в списке.

После сборки строки, содержащей имя устройства в жирном шрифте и направление в скобках, она добавляется в соответствующий список путём вызова appendChild() для audioList или videoList, в зависимости от типа устройства.

Обработка изменений списка устройств

Мы вызываем updateDeviceList() в двух местах. Первое — в обработчике выполнения обещания getUserMedia() для первоначального заполнения списка при открытии потока. Второе — в обработчике событий для этого события devicechange:

navigator.mediaDevices.ondevicechange = (event) => {
  updateDeviceList();
};

С этим кодом каждый раз, когда пользователь подключает камеру, микрофон или другое медиаустройство, или включает или выключает его, мы вызываем updateDeviceList() для перерисовки списка подключенных устройств.

Результат

Спецификации

Спецификация
Media Capture and Streams
# event-mediadevices-devicechange
Media Capture and Streams
# dom-mediadevices-ondevicechange

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

Рабочий стол Мобильные устройства
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet WebView Android
devicechange_event 57 12 52 34 11 Нет 52 Нет 11 Нет Нет

© 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/MediaDevices/devicechange_event

Spec-Zone.ru

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