AudioContext:setSinkId() 方法

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

實驗性: 這是一項實驗性技術
在生產中使用此技術之前,請仔細檢查瀏覽器相容性表格

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

AudioContext 介面的 setSinkId() 方法用於設定 AudioContext 的輸出音訊裝置。如果未顯式設定 sink ID,則會使用系統預設音訊輸出裝置。

要將音訊裝置設定為與預設裝置不同的裝置,開發者需要獲得訪問音訊裝置的許可權。如果需要,可以透過呼叫 MediaDevices.getUserMedia() 來提示使用者授予所需許可權。

此外,此功能可能會被 speaker-selection Permissions Policy 阻止。

語法

js
setSinkId(sinkId)

引數

sinkId

要設定為輸出音訊裝置的裝置的 sink ID。這可以接受以下任一型別的值:

String

一個代表 sink ID 的字串,例如透過 MediaDevices.enumerateDevices() 返回的 MediaDeviceInfo 物件的 deviceId 屬性檢索到。

AudioSinkOptions

一個表示 sink ID 不同選項的物件。目前它只有一個屬性 type,值為 none。設定此引數將使音訊被處理而不透過任何音訊輸出裝置播放。當您不需要與處理同步播放時,這是一個減少功耗的有用選項。

返回值

一個 Promise,它會以 undefined 的值 fulfilled。

嘗試將 sink ID 設定為其現有值(即 AudioContext.sinkId 返回的值)不會引發錯誤,但會立即中止該過程。

異常

InvalidAccessError DOMException

嘗試訪問選定的音訊輸出裝置失敗時丟擲。

NotAllowedError DOMException

當瀏覽器沒有訪問音訊裝置的許可權時丟擲。

NotFoundError DOMException

當傳入的 sinkId 與系統上找到的任何音訊裝置都不匹配時丟擲。

示例

在我們的 SetSinkId 測試示例(檢視 原始碼)中,我們建立了一個音訊圖,透過 AudioBufferSourceNode 生成三秒鐘的白噪聲,並將其透過 GainNode 進行處理,使其聲音稍小一些。

js
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);

    select.addEventListener("change", async () => {
      if (select.value === "none") {
        await audioCtx.setSinkId({ type: "none" });
      } else {
        await audioCtx.setSinkId(select.value);
      }
    });
  }
});

我們還為使用者提供了一個下拉選單,允許他們動態更改音訊輸出裝置。為此,我們:

  1. 提供一個按鈕來填充下拉選單。我們首先呼叫 MediaDevices.getUserMedia() 來觸發我們需要允許裝置列舉的許可權提示,然後使用 MediaDevices.enumerateDevices() 獲取所有可用裝置。我們遍歷不同的裝置,並將每個裝置作為選項新增到 <select> 元素中。我們還建立了一個“無”選項,用於您不想在任何輸出裝置上播放音訊的情況。
  2. <select> 元素新增一個 change 事件監聽器,以便在選擇新值時更改 sink ID,從而更改音訊輸出裝置。如果下拉選單中選擇了“無”,我們則使用 { type : 'none' } 物件引數呼叫 setSinkId() 來選擇不使用任何音訊裝置;否則,我們將其與 <select> 元素 value 屬性中包含的音訊裝置 ID 作為引數一起呼叫。

輸出裝置可以在音訊播放期間、之前或之間更改。

規範

規範
Web Audio API
# dom-audiocontext-setsinkid

瀏覽器相容性

另見