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

פרנסואה בופורט
פרנסואה בופורט

עד עכשיו, הגדרת היעד של פלט האודיו הייתה אפשרית רק עבור <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://sinkid.glitch.me/ דרך AudioContext.setSinkId().

תמיכת דפדפן

AudioContext.setSinkId() זמין ב-Chrome 110 ומעלה.

משוב

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

אישורים

תודה להונגצ'אן צ'וי ולמייקל ווילסון שעיינו במאמר זה.

תמונה מהיומן של סטיב הארווי ב-Unense.