Skip to content

העברת שמע: גשר שמע וזרמי מדיה#

גרסת בטא

הפונקציונליות נמצאת בגרסת בטא. הפונקציות עשויות להשתנות ועלולות לפעול באופן לא יציב. ייתכן שבעתיד תיגבה תשלום נוסף עבור הפונקציונליות.
ניתן לבקש גישה לפונקציונליות דרך התמיכה הטכנית של GREEN-API

איתות השיחה (חיוג, קבלה, דחייה, סיום) עובר דרך שיטות הלקוח, ואילו השמע עובר בנפרד, ב-WebRTC. החיבור אינו מפעיל את השמע בעצמו: זאת עושה השיטה calls.startAudioBridge(). בהמשך הטקסט אנו קוראים לכך גשר שמע.

סדר הקריאות#

גשר השמע שייך לשיחה, ולכן השיחה חייבת כבר להתקיים בשרת:

  1. להמתין לסיום dial() (שיחה יוצאת) או accept() (שיחה נכנסת);
  2. לקרוא ל-calls.startAudioBridge().

אם מפעילים את הגשר מוקדם יותר, השרת ידחה את ההצעה להעברת שמע עם השגיאה no active call.

await client.dial('79991234567');
await calls.startAudioBridge();

כישלון בהפעלת הגשר אינו מבטל את השיחה עצמה: היא נשארת בשרת, וניתן לקרוא ל-startAudioBridge() שוב. באותה דרך מחזירים את השמע לאחר טעינת הדף מחדש: אם calls.state.state שווה ל-out-call או ל-on-call, ו-calls.hasAudioBridge שווה ל-false, הפעילו את הגשר בלי לחייג שוב.

if (['out-call', 'on-call'].includes(calls.state.state) && !calls.hasAudioBridge) {
  await calls.startAudioBridge();
}

בסיום השיחה הספרייה מפרקת את הגשר בעצמה — אין צורך לקרוא ל-stopAudioBridge() במטפל של end-call. השיטה calls.close() עוצרת את הגשר וסוגרת את החיבור כאשר השיחות אינן נדרשות עוד.

אירועים עם זרמי מדיה#

כאשר הגשר מופעל, החיבור מדווח על שני זרמים:

  • local-stream-ready — זרם המיקרופון שלכם; מגיע ראשון, ושימושי למחוון העוצמה ולהשתקת המיקרופון;
  • remote-stream-ready — הזרם של הצד השני; יש להתחיל לנגן אותו.
const audioElement = document.createElement('audio');

calls.addEventListener('local-stream-ready', (event) => {
  console.log('Microphone is ready.', event.detail);
});

calls.addEventListener('remote-stream-ready', (event) => {
  audioElement.srcObject = event.detail;
  audioElement.play();

  console.log('The other party stream is ready and playing.');
});

calls.addEventListener('end-call', () => {
  audioElement.srcObject = null;
  audioElement.pause();
});
אם בשיחה אין קול

שני האירועים מגיעים ברגע הפעלת הגשר, כלומר לפני שהאפליקציה מספיקה להציג את מסך השיחה. רכיב שנרשם אליהם רק כשהוא מופיע לא ישמע דבר — האירועים כבר חלפו. שמרו את הזרם האחרון שהתקבל והעבירו אותו לרכיב השמע כאשר הרכיב מופיע. כך זה ממומש בדוגמת ה-React, ראו לקוח React.

השתקת המיקרופון#

אין בספרייה שיטה נפרדת להשתקת המיקרופון, וגם אין בה צורך. הטראק מהאירוע local-stream-ready הוא אותו טראק שמועבר לצד השני, ולכן השבתתו היא בדיוק מה שגורם לצד השני להפסיק לשמוע אתכם:

let localStream = null;

calls.addEventListener('local-stream-ready', (event) => {
  localStream = event.detail;
});

function setMicrophoneEnabled(enabled) {
  localStream.getAudioTracks().forEach((track) => { track.enabled = enabled; });
}

שני דברים שקל לפספס:

  • התחברות מחדש מחליפה את המיקרופון. אם החיבור נותק בזמן שהגשר פעיל, הספרייה מפרקת את הגשר, ממתינה לחיבור ומפעילה אותו מחדש — עם בקשה חדשה למיקרופון וטראק חדש. השיחה אינה מסתיימת, ואירוע end-call לא יגיע. הטראק החדש מגיע כשהוא מופעל, ולכן יש להעביר אליו את ההשתקה, אחרת המיקרופון יתחיל לפעול בשקט, בעוד שהכפתור בממשק ימשיך להציג שהוא מושתק.
  • טראק שנעצר אינו מיקרופון. טראקים שנעצרו בעת פירוק הגשר נשארים בזרם, ולכן לא מספיק פשוט לספור אותם. לפני שמציגים שהמיקרופון מושתק, בדקו שהטראק פעיל: track.readyState === 'live'.