Mengubah perangkat output tujuan di Audio Web

François Beaufort
François Beaufort

Hingga saat ini, setelan perangkat output audio tujuan hanya dapat dilakukan untuk <video> dan <audio> dengan HTMLMediaElement.setSinkId(). Di Audio Web, AudioContext menggunakan perangkat default, sehingga pengguna harus mengubah perangkat output audio sistem secara manual.

Dari Chrome 110, Anda dapat menggunakan AudioContext.setSinkId() untuk mengarahkan output audio di Audio Web secara terprogram ke perangkat apa pun yang diizinkan.

Hal ini sangat membantu dalam berbagai skenario komunikasi real-time. Misalnya, aplikasi web dapat menggunakannya untuk mengarahkan output secara terprogram ke perangkat output audio tertentu seperti headset Bluetooth atau speakerphone.

Merutekan output audio ke perangkat tertentu

Pertama, Anda memerlukan ID perangkat output audio yang ingin digunakan sebagai tujuan. Dapatkan daftar perangkat media yang tersedia dengan navigator.mediaDevices.enumerateDevices(), filter hanya pada perangkat output audio, dan dapatkan atribut deviceId dari perangkat output audio pilihan Anda. Nilai "" string kosong juga dapat digunakan sebagai perangkat default untuk deviceId.

Setelah memiliki ID perangkat output audio, buat AudioContext dan panggil audioContext.setSinkId(deviceId). Jika berhasil, promise yang ditampilkan akan diselesaikan saat audio dirutekan ke perangkat output terhubung yang dipilih. Tindakan ini dapat gagal jika AudioContext ditutup.

Contoh di bawah menunjukkan cara meminta akses mikrofon jika diperlukan dan mengarahkan output audio di Web Audio ke perangkat output pertama yang tersedia.

const permission = await navigator.permissions.query({ name: "microphone" });
if (permission.state == "prompt") {
  // More audio outputs are available when user grants access to the mic.
  const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  stream.getTracks().forEach((track) => track.stop());
}

// Request a list of media devices and filter audio output devices.
const devices = await navigator.mediaDevices.enumerateDevices();
const audioOutputs = devices.filter(device => device.kind == "audiooutput");

const audioContext = new AudioContext();

// Pick the first available audio output.
const deviceId = audioOutputs[0].deviceId;
await audioContext.setSinkId(deviceId);

Perhatikan bahwa Anda juga dapat meneruskan deviceId sebagai parameter sinkId saat membuat AudioContext.

const audioContext = new AudioContext({ sinkId: deviceId });

Merender audio dengan AudioContext yang dibisukan

Sekarang Anda dapat menentukan "perangkat output senyap" di Web Audio untuk meminimalkan konsumsi daya. Kali ini, teruskan { type: "none" } ke AudioContext.setSinkId(), bukan nilai string.

Perhatikan bahwa jam audio yang dapat diakses melalui audioContext.currentTime akan tetap maju untuk merender grafik audio. Sasaran utama AudioContext yang dibisukan ini adalah merender grafik audio tanpa menghasilkan suara yang dapat didengar. Kasus penggunaan utamanya adalah menganalisis input mikrofon tanpa membuat suara.

// Silent Web Audio output.
await audioContext.setSinkId({ type: "none" });

Deteksi fitur

Untuk memeriksa apakah AudioContext.setSinkId() didukung, gunakan:

if ("setSinkId" in AudioContext.prototype) {
  // AudioContext.setSinkId() is supported.
}

Contoh

Demo tersedia di https://sinkid.glitch.me/ untuk bermain dengan AudioContext.setSinkId().

Dukungan browser

AudioContext.setSinkId() tersedia di Chrome 110 atau yang lebih baru.

Masukan

Tim Chrome dan komunitas standar web ingin mengetahui pengalaman Anda dengan AudioContext.setSinkId(). Berikan masukan dengan memberikan komentar pada masalah GitHub yang ada atau mengajukan masalah baru.

Ucapan terima kasih

Terima kasih kepada Hongchan Choi dan Michael Wilson yang telah meninjau artikel ini.

Foto gambar kalender oleh Steve Harvey di Unsplash.