העברת שמע: גשר שמע וזרמי מדיה#
גרסת בטא
הפונקציונליות נמצאת בגרסת בטא. הפונקציות עשויות להשתנות ועלולות לפעול באופן לא יציב. ייתכן שבעתיד תיגבה תשלום נוסף עבור הפונקציונליות.
ניתן לבקש גישה לפונקציונליות דרך התמיכה הטכנית של GREEN-API
איתות השיחה (חיוג, קבלה, דחייה, סיום) עובר דרך שיטות הלקוח, ואילו השמע עובר בנפרד, ב-WebRTC. החיבור אינו מפעיל את השמע בעצמו: זאת עושה השיטה calls.startAudioBridge(). בהמשך הטקסט אנו קוראים לכך גשר שמע.
סדר הקריאות#
גשר השמע שייך לשיחה, ולכן השיחה חייבת כבר להתקיים בשרת:
- להמתין לסיום
dial()(שיחה יוצאת) אוaccept()(שיחה נכנסת); - לקרוא ל-
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'.