שינוי התקן הפלט של היעד ב-Web Audio

François Beaufort
François Beaufort

עד עכשיו, אפשר היה להגדיר את מכשיר פלט האודיו רק ב-<video> וב-<audio> עם HTMLMediaElement.setSinkId(). ב-Web Audio, ‏ AudioContext השתמש במכשיר ברירת המחדל, והמשתמש נאלץ לשנות את המכשיר להשמעת האודיו במערכת באופן ידני.

החל מגרסה 110 של Chrome, אפשר להשתמש ב-AudioContext.setSinkId() כדי להפנות את פלט האודיו ב-Web Audio באופן פרוגרמטי לכל מכשיר מורשה.

האפשרות הזו שימושית במיוחד בתרחישים שונים של תקשורת בזמן אמת. לדוגמה, אפליקציית אינטרנט יכולה להשתמש בזה כדי להפנות את הפלט באופן פרוגרמטי למכשיר פלט אודיו ספציפי, כמו אוזניות Bluetooth או דיבורית.

העברת פלט האודיו למכשיר ספציפי

קודם כל, צריך את המזהה של מכשיר פלט האודיו שרוצים להשתמש בו כיעד. כדי לקבל את רשימת מכשירי המדיה הזמינים עם navigator.mediaDevices.enumerateDevices(), לסנן רק מכשירי פלט אודיו ולקבל את מאפיין deviceId של מכשיר פלט האודיו הרצוי. אפשר גם להשתמש בערך המחרוזת הריקה "" כמכשיר ברירת המחדל עבור deviceId.

אחרי שמקבלים את המזהה של מכשיר פלט האודיו, יוצרים AudioContext ומתקשרים אל audioContext.setSinkId(deviceId). אם הפעולה בוצעה ללא שגיאות, ההבטחה שהוחזרה נפתרת כשהאודיו מנותב למכשיר הפלט המחובר שנבחר. הפעולה עלולה להיכשל אם AudioContext סגור.

בדוגמה שלמטה מוצג איך לבקש גישה למיקרופון אם צריך, ולכוון את פלט האודיו ב-Web Audio למכשיר הפלט הראשון שזמין.

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

שימו לב שאפשר גם להעביר את deviceId כפרמטר sinkId כשיוצרים AudioContext.

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

עיבוד אודיו באמצעות AudioContext מושתק

עכשיו אפשר לציין ב-Web Audio מכשיר פלט שקט כדי למזער את צריכת החשמל. הפעם, במקום ערך מחרוזת, מעבירים את הערך { type: "none" } אל AudioContext.setSinkId().

שימו לב: השעון של האודיו שאפשר לגשת אליו דרך audioContext.currentTime עדיין יתקדם כדי להציג את תרשים האודיו. המטרה העיקרית של AudioContext מושתק היא לעבד את גרף האודיו בלי להפיק צליל שניתן לשמוע. תרחיש השימוש העיקרי הוא ניתוח של קלט מהמיקרופון בלי להשמיע צלילים.

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

זיהוי תכונות

כדי לבדוק אם יש תמיכה ב-AudioContext.setSinkId(), משתמשים בפקודה:

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

דוגמה

גרסת הדגמה זמינה בכתובת https://codepen.io/web-dot-dev/pen/emNwEaN/ כדי להתנסות ב-AudioContext.setSinkId().

תמיכה בדפדפנים

AudioContext.setSinkId() זמין ב-Chrome 110 ואילך.

משוב

צוות Chrome וקהילת תקני האינטרנט רוצים לשמוע על החוויות שלכם עם AudioContext.setSinkId(). כדי לשלוח משוב, אפשר להוסיף תגובה לבעיות קיימות ב-GitHub או לדווח על בעיות חדשות.

תודות

תודה לHongchan Choi ולMichael Wilson על בדיקת המאמר הזה.

תמונה של יומן מאת Steve Harvey ב-Unsplash.