MediaDevices: enumerateDevices() 方法

Baseline 2023
新推出

自 2023 年 8 月起,此功能已在最新的裝置和瀏覽器版本中可用。此功能可能不適用於舊裝置或瀏覽器。

安全上下文: 此功能僅在安全上下文(HTTPS)中可用,且支援此功能的瀏覽器數量有限。

enumerateDevices() 方法屬於 MediaDevices 介面,用於請求當前可用的媒體輸入和輸出裝置列表,例如麥克風、攝像頭、耳機等。返回的 Promise 會解析為一個 MediaDeviceInfo 物件陣列,每個物件描述一個裝置。

返回的列表將省略任何被文件 許可權策略 阻止的裝置:microphonecameraspeaker-selection(用於輸出裝置)等。對特定非預設裝置的訪問也受 Permissions API 的控制,並且列表將省略使用者未明確授予許可權的裝置。

語法

js
enumerateDevices()

引數

無。

返回值

一個 Promise,解析為一個 MediaDeviceInfo 物件陣列。陣列中的每個物件都描述了一個可用的媒體輸入或輸出裝置。順序很重要 — 預設的捕獲裝置將首先列出。

除了預設裝置外,只有已授予許可權的裝置才是“可用”的。

如果媒體裝置是輸入裝置,則會返回一個 InputDeviceInfo 物件。

如果列舉失敗,則 Promise 會被拒絕。

安全要求

API 的訪問受以下約束:

  • 必須在 安全上下文 中呼叫該方法。
  • 文件必須完全活動且其可見性必須是“visible”。

示例

以下是使用 enumerateDevices() 的示例。它會輸出 裝置 ID 列表,如果可用,還會顯示裝置名稱。

js
if (!navigator.mediaDevices?.enumerateDevices) {
  console.log("enumerateDevices() not supported.");
} else {
  // List cameras and microphones.
  navigator.mediaDevices
    .enumerateDevices()
    .then((devices) => {
      devices.forEach((device) => {
        console.log(`${device.kind}: ${device.label} id = ${device.deviceId}`);
      });
    })
    .catch((err) => {
      console.error(`${err.name}: ${err.message}`);
    });
}

這可能會產生

videoinput: id = csO9c0YpAf274OuCPUA53CNE0YHlIr2yXCi+SqfBZZ8=
audioinput: id = RKxXByjnabbADGQNNZqLVLdmXlS0YkETYCIbg+XxnvM=
audioinput: id = r2/xw1xUPIyZunfV1lGrKOma5wTOvCkWfZ368XCndm0=

或者,如果一個或多個 MediaStream 處於活動狀態或已授予持久許可權

videoinput: FaceTime HD Camera (Built-in) id=csO9c0YpAf274OuCPUA53CNE0YHlIr2yXCi+SqfBZZ8=
audioinput: default (Built-in Microphone) id=RKxXByjnabbADGQNNZqLVLdmXlS0YkETYCIbg+XxnvM=
audioinput: Built-in Microphone id=r2/xw1xUPIyZunfV1lGrKOma5wTOvCkWfZ368XCndm0=

規範

規範
媒體捕獲和流
# dom-mediadevices-enumeratedevices

瀏覽器相容性

另見