AudioContext:setSinkId() 方法
AudioContext 介面的 setSinkId() 方法用於設定 AudioContext 的輸出音訊裝置。如果未顯式設定 sink ID,則會使用系統預設音訊輸出裝置。
要將音訊裝置設定為與預設裝置不同的裝置,開發者需要獲得訪問音訊裝置的許可權。如果需要,可以透過呼叫 MediaDevices.getUserMedia() 來提示使用者授予所需許可權。
此外,此功能可能會被 speaker-selection Permissions Policy 阻止。
語法
setSinkId(sinkId)
引數
sinkId-
要設定為輸出音訊裝置的裝置的 sink ID。這可以接受以下任一型別的值:
- String
-
一個代表 sink ID 的字串,例如透過
MediaDevices.enumerateDevices()返回的MediaDeviceInfo物件的deviceId屬性檢索到。 AudioSinkOptions-
一個表示 sink ID 不同選項的物件。目前它只有一個屬性
type,值為none。設定此引數將使音訊被處理而不透過任何音訊輸出裝置播放。當您不需要與處理同步播放時,這是一個減少功耗的有用選項。
返回值
一個 Promise,它會以 undefined 的值 fulfilled。
嘗試將 sink ID 設定為其現有值(即 AudioContext.sinkId 返回的值)不會引發錯誤,但會立即中止該過程。
異常
InvalidAccessErrorDOMException-
嘗試訪問選定的音訊輸出裝置失敗時丟擲。
NotAllowedErrorDOMException-
當瀏覽器沒有訪問音訊裝置的許可權時丟擲。
NotFoundErrorDOMException-
當傳入的
sinkId與系統上找到的任何音訊裝置都不匹配時丟擲。
示例
在我們的 SetSinkId 測試示例(檢視 原始碼)中,我們建立了一個音訊圖,透過 AudioBufferSourceNode 生成三秒鐘的白噪聲,並將其透過 GainNode 進行處理,使其聲音稍小一些。
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);
}
});
}
});
我們還為使用者提供了一個下拉選單,允許他們動態更改音訊輸出裝置。為此,我們:
- 提供一個按鈕來填充下拉選單。我們首先呼叫
MediaDevices.getUserMedia()來觸發我們需要允許裝置列舉的許可權提示,然後使用MediaDevices.enumerateDevices()獲取所有可用裝置。我們遍歷不同的裝置,並將每個裝置作為選項新增到<select>元素中。我們還建立了一個“無”選項,用於您不想在任何輸出裝置上播放音訊的情況。 - 為
<select>元素新增一個change事件監聽器,以便在選擇新值時更改 sink ID,從而更改音訊輸出裝置。如果下拉選單中選擇了“無”,我們則使用{ type : 'none' }物件引數呼叫setSinkId()來選擇不使用任何音訊裝置;否則,我們將其與<select>元素value屬性中包含的音訊裝置 ID 作為引數一起呼叫。
輸出裝置可以在音訊播放期間、之前或之間更改。
規範
| 規範 |
|---|
| Web Audio API # dom-audiocontext-setsinkid |
瀏覽器相容性
載入中…