AudioContext: phương thức setSinkId()
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Experimental: This is an experimental technology
Check the Browser compatibility table carefully before using this in production.
Secure context: This feature is available only in secure contexts (HTTPS), in some or all supporting browsers.
Phương thức setSinkId() của giao diện AudioContext thiết lập thiết bị đầu ra âm thanh cho AudioContext. Nếu sink ID không được đặt tường minh, thiết bị đầu ra âm thanh mặc định của hệ thống sẽ được sử dụng.
Để đặt thiết bị âm thanh khác với thiết bị mặc định, nhà phát triển cần có quyền truy cập vào các thiết bị âm thanh. Nếu cần, người dùng có thể được nhắc cấp quyền cần thiết thông qua lời gọi MediaDevices.getUserMedia().
Ngoài ra, tính năng này có thể bị chặn bởi Permissions Policy speaker-selection.
Cú pháp
setSinkId(sinkId)
Tham số
sinkId-
Sink ID của thiết bị mà bạn muốn đặt làm thiết bị đầu ra âm thanh. Giá trị này có thể thuộc một trong các kiểu sau:
- String
-
Một chuỗi biểu diễn sink ID, ví dụ được lấy qua thuộc tính
deviceIdcủa các đối tượngMediaDeviceInfođược trả về bởiMediaDevices.enumerateDevices(). AudioSinkOptions-
Một đối tượng biểu diễn các tùy chọn khác nhau cho sink ID. Hiện tại đối tượng này chỉ có một thuộc tính là
typevới giá trịnone. Việc thiết lập tham số này khiến âm thanh được xử lý mà không phát qua bất kỳ thiết bị đầu ra âm thanh nào. Đây là một lựa chọn hữu ích để giảm tiêu thụ điện năng khi bạn không cần phát lại cùng với xử lý.
Giá trị trả về
Một Promise hoàn tất với giá trị undefined.
Việc cố đặt sink ID thành chính giá trị hiện có của nó (tức giá trị được trả về bởi AudioContext.sinkId) sẽ không ném lỗi, nhưng quá trình sẽ bị hủy ngay lập tức.
Ngoại lệ
InvalidAccessErrorDOMException-
Được ném ra nếu việc truy cập thiết bị đầu ra âm thanh đã chọn thất bại.
NotAllowedErrorDOMException-
Được ném ra nếu trình duyệt không có quyền truy cập các thiết bị âm thanh.
NotFoundErrorDOMException-
Được ném ra nếu
sinkIdđược truyền vào không khớp với bất kỳ thiết bị âm thanh nào được tìm thấy trên hệ thống.
Ví dụ
Trong ví dụ kiểm thử SetSinkId của chúng tôi (hãy xem mã nguồn), chúng tôi tạo một đồ thị âm thanh sinh ra một đoạn white noise dài ba giây bằng AudioBufferSourceNode, đồng thời cho nó đi qua một GainNode để giảm âm lượng bớt.
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);
}
});
}
});
Chúng tôi cũng cung cấp cho người dùng một menu thả xuống để cho phép họ thay đổi thiết bị đầu ra âm thanh ngay lập tức. Để làm điều này, chúng tôi:
- Cung cấp một nút để điền dữ liệu vào menu thả xuống. Đầu tiên chúng tôi gọi
MediaDevices.getUserMedia()để kích hoạt hộp thoại xin quyền cần thiết cho phép liệt kê thiết bị, rồi dùngMediaDevices.enumerateDevices()để lấy tất cả thiết bị khả dụng. Chúng tôi lặp qua các thiết bị khác nhau và biến từng thiết bị thành một tùy chọn trong phần tử<select>. Chúng tôi cũng tạo thêm tùy chọn "None" cho trường hợp bạn không muốn phát âm thanh ra bất kỳ đầu ra nào. - Thêm trình nghe sự kiện
changevào phần tử<select>để thay đổi sink ID và do đó thay đổi thiết bị đầu ra âm thanh khi một giá trị mới được chọn. Nếu "None" được chọn trong menu, chúng tôi gọisetSinkId()với tham số đối tượng{ type : 'none' }để không chọn thiết bị âm thanh nào; nếu không, chúng tôi gọi nó với ID thiết bị âm thanh chứa trong thuộc tínhvaluecủa phần tử<select>.
Thiết bị đầu ra có thể được thay đổi trong khi đang phát âm thanh, cũng như trước hoặc giữa các lần phát.
Thông số kỹ thuật
| Specification |
|---|
| Web Audio API> # dom-audiocontext-setsinkid> |