שיחות וידאו וסטרימינג בזמן אמת עם WebRTC ו-SDKs

  • WebRTC מציעה אודיו, וידאו ונתונים בזמן אמת עם השהייה נמוכה מאוד באמצעות getUserMedia, RTCPeerConnection ו-RTCDataChannel.
  • כדי לתפקד בעולם האמיתי הוא זקוק לאיתות, STUN/TURN ו-ICE, וסקלציה דורשת בדרך כלל SFUs או שרתי מדיה.
  • ערכות פיתוח תוכנה (SDK) כמו Agora, Twilio או ZEGOCLOUD מפשטות את התשתית במחיר של עלויות חוזרות ותלות בספקים.
  • פרויקט צדדי יכול להתחיל עם SDK ולהתפתח לתשתית WebRTC משלו ככל שהמוצר מתבגר.

שיחות וידאו וסטרימינג בזמן אמת עם WebRTC ו-SDKs

אם אתה בונה פרויקט צד ג'אווהסקריפט ואם אתם זקוקים לשיחות וידאו, זה נורמלי שיהיו לכם ספקות: האם עליי להשתמש ב-WebRTC טהור, ב-SDK כמו Agora, Twilio, Mux או Zegocloud, או ללכת על RN-WebRTC ב-React Native? החדשות הרעות הן שאין פתרון אחד. החדשות הטובות הן שאתם מבינים JavaScript בזמן אמת, מה שמציב אתכם בעמדה אידיאלית לקבל החלטה מושכלת ולהימנע משיבושים בארכיטקטורה.

בשורות הבאות תראו, שלב אחר שלב, איך זה עובד WebRTC בפניםאיזה תפקיד ממלאים Agora (וספקים דומים אחרים)? מה המשמעות של הקמת תשתית משלכם (STUN/TURN, איתות, SFU, שרתי מדיה...)? ומהם הפשרות האמיתיות בין עלות, מורכבות וגמישות עבור שיחות וידאו וסטרימינג בזמן אמת?

מה זה WebRTC ומדוע הוא הבסיס להכל?

WebRTC (תקשורת בזמן אמת באינטרנט) זוהי קבוצה של סטנדרטים, ממשקי API ופרוטוקולים בקוד פתוח המאפשרים הזרמת אודיו, וידאו ונתונים בזמן אמת ישירות מדפדפן או אפליקציה מקורית, ללא תוספים או יישומים חיצוניים. היא תוקנה על ידי ה-W3C וה-IETF ונתמכת על ידי כל הדפדפנים המודרניים: Chrome, Firefox, Safari, Edge, Opera ודפדפנים ניידים רבים.

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

אפליקציית שיחות
Artaculo relacionado:
כיצד להשתמש וליצור אפליקציית שיחות באנדרואיד: המדריך האולטימטיבי למשתמשים ולמפתחים

ממשקי API מרכזיים של WebRTC: getUserMedia, RTCPeerConnection ו-RTCDataChannel

WebRTC מסתמך על שלושה ממשקי API עיקריים בצד הדפדפן שבהם בוודאות תשתמשו, בין אם תבנו פתרון משלכם או תשתמשו ב-SDK כמו Agora:

  • זרם מדיה / getUserMedia: כדי ללכוד וידאו ואודיו (מצלמה, מיקרופון ואפילו מסך או טאבים).
  • RTCPeerConnection: לנהל משא ומתן ולהעביר זרמי אודיו ווידאו בין עמיתים.
  • RTCDataChannelלשלוח נתונים שרירותיים (טקסט, בינארי, קבצים) עם השהייה נמוכה בין לקוחות.

עם getUserMedia באפשרותך לבקש גישת הדפדפן למצלמה ולמיקרופון ולקבל MediaStream שאותו אתה מקשר לאחר מכן עם אלמנט <video> עם video.srcObject = stream. אתה יכול להגיש מועמדות הגבלות (רזולוציה, קצב פריימים, מצלמה קדמית/אחורית וכו') ואם לא יעמדו באלה, תקבלו שגיאות כגון OverconstrainedErrorאשר עליך להציע חלופות (לדוגמה, הקטנה מ-1080p ל-720p ויישום התאמות עבור לשפר את שמע המיקרופון).

ה- API של RTCPeerConnection זהו לב השיחות: הוא מטפל במשא ומתן SDP (הצעה/תגובה), איסוף מועמדים ICE (הלם/התקפה), יצירת חיבור ושידור מאובטח דרך SRTP. מהקוד שלך, אתה פשוט יוצר את החיבור, מוסיף רצועות מדיה ומגיב לאירועים כגון onicecandidate u ontrack ואתה דואג לשילוט.

לבסוף, RTCDataChannel זה מאפשר לך להגדיר ערוצי נתונים בדומה ל-WebSocket, אבל מנקודה לנקודה ועם שליטה מדויקת על אמינות וסדר. זה שימושי לצ'אט וידאו, שיתוף קבצים, סנכרון מצב משחק או שיתוף פעולה בזמן אמת. התחביר מוכר: dataChannel.send() y onmessage במקלט.

איתות: ה"דבק" ש-WebRTC לא מגדיר

אי הבנה אופיינית: WebRTC לא כולל שילוטRTCPeerConnection צריך להחליף מידע, אבל הוא לא מכתיב איך. אתם צריכים להגדיר זאת בעצמכם, או ש-SDK של צד שלישי יוכל להמציא זאת עבורכם.

הזוגות נשלחים באמצעות איתות:

  • הודעות בקרת סשןהתחלת שיחה, ניתוק, שגיאות.
  • מידע ברשתמועמדים ל-ICE (כתובות IP/פורטים שהתגלו).
  • מטא-דאטה של ​​מדיההצעות ותגובות של SDP עם רכיבי קודקים, רזולוציות וכו'.

שילוט זה מיושם בדרך כלל עם WebSocketsSocket.IO, HTTP (polling/long-polling), MQTT, או מנגנונים דו כיווניים אחרים. דפוס טיפוסי מאוד הוא שרת Node.js עם Socket.IO שמנהל "חדרים" ומעביר הודעות סוג טקסט/JSON בין לקוחות:

שרתמקבל create or joinהוא יוצר חדר אם אין חדר כזה, תומך בעד שני לקוחות (לשיחת וידאו בסיסית) ומעביר הודעות. message לשקעים האחרים בחדר. אתה אחראי לא לחרוג ממספר המשתמשים המרבי או לעצב את לוגיקת החדר שלך.

לקוחבעת טעינת הדף, הוא מבקש שם חדר (או מסיק אותו מכתובת האתר), הוא פולט create or joinהאזינו לאירועים כמו created, joined, full, ready ומסכים עם הצד השני ליזום או לדחות את השיחה.

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

הלם, סיבוב, קרח: לעבור דרך NAT וחומות אש בלי להשתגע

בעולם אידיאלי, שני משתמשים יהיו תמיד ברשתות נגישות ויתחברו ישירות. בעולם האמיתי, ישנם NAT, חומות אש, CGNAT מספקי אינטרנט ורשתות תאגידיות פרנואידיות. כאן נכנס לתמונה ICE, המשלב STUN ו-TURN.

  • לְזַעזֵעַ ‏(Session Traversal Utilities for NAT) מאפשר ללקוח לגלות את שלו IP ציבורי ופורטשרת STUN מגיב רק עם מידע זה.
  • תור (מעבר באמצעות ממסרים סביב NAT) פועל כ שרת ממסר של מדיה כאשר אין דרך לפתוח ערוץ P2P ישיר. תעבורת אודיו/וידאו עוברת דרכה, כך שהיא צורכת רוחב פס של השרת ועולה כסף.
  • קרח (הקמת קישוריות אינטראקטיבית) אחראית על בדיקת כל המועמדים האפשריים (כתובות מקומיות, המשתקפות על ידי ממסרי STUN ו-TURN) עד למציאת נתיב בר-קיימא.

בפועל, באובייקט התצורה של RTCPeerConnection אתה מוסיף מערך של שרתים בקרח עם URI של STUN/TURN, הדפדפן עושה את השאר. אם תגדירו תשתית משלכם, תצטרכו לפרוס ולתחזק את שרתי STUN/TURN שלכם; אם אתם משתמשים ב-SDK כמו Agora, Twilio או Zegocloud, הם כבר סידרו את זה ומוכנים לייצור.

סטרימינג בזמן אמת עם השהייה נמוכה: WebRTC לעומת HLS/DASH

שיחות וידאו וסטרימינג בזמן אמת עם WebRTC ו-SDKs

כשאנחנו מדברים שידור חי ישנם שני עולמות נפרדים: פרוטוקולים מבוססי HTTP (HLS, DASH) ו-WebRTC. HLS/DASH פועלים על ידי הורדה והשמעה של קטעי וידאו מהלקוח; זה מושלם עבור גמישות באמצעות CDN, אבל זה מציג... השהיות של מספר שניות (5-30 שניות בקלות).

WebRTC, לעומת זאת, משתמש UDP + RTP ומספק את הסרטון במצב "דחיפה" מהמקור לנגן, עם זמני הפעלה קצרים מאוד וזמן השהייה אופייני מתחת ל- 500 ms (לעתים קרובות ~250 אלפיות השנייה) אם הרשת טובה. זה משיג זאת בזכות:

  • בקרת צפיפות משולב, אשר מתאים את קצב הסיביות והרזולוציה בזמן אמת בהתאם לאובדן חבילות, ריצוד או RTT.
  • שימוש בקודקים יעילים (VP8, VP9, ​​​​H.264; יותר ויותר AV1) עם האצת חומרה כאשר זמין.
  • אפשרות שימוש ב-SVC (קידוד וידאו ניתן להרחבה) כך שהמקלט יקבל רק את השכבות שהרשת/המכשיר שלו יכולים לתמוך בהן.

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

הבעיה היא ש-WebRTC P2P טהור לא מתפתח היטב לאלפי צופים; בשביל זה אתה צריך יחידות SFU, שרתי מדיה או פלטפורמות היברידיותוזה בדיוק המקום שבו נכנסים לתמונה פתרונות כמו Flusonic, Agora, או דומים.

הרחבה מעבר ל-P2P: יחידות SFU, שרתי מדיה וארכיטקטורות היברידיות

בשיחת וידאו אחד על אחד, WebRTC פועל בצורה מושלמת. אבל אם מתחילים להוסיף 10, 20 או 100 משתמשים, הדברים משתנים: כל לקוח צריך לשלוח/לקבל מספר סטרימינג, המעבד שלו מתחמם יתר על המידה והרשת קורסת. שלושה דפוסים קלאסיים עולים כאן:

  • יחידת בקרה רב-נקודתית (MCU)השרת מקבל את כל הזרמים, מערבב אותם ושולח זרם יחיד לכל לקוח. יתרון: צריכת משאבים נמוכה על הלקוח. חסרונות: עומס כבד על השרת, פחות בקרת איכות אישית.
  • יחידת העברה סלקטיבית (SFU)השרת מקבל זרמים ומעביר אותם באופן סלקטיבי מבלי לערבב ביניהם. כל צופה מקבל את הזרמים שהוא צריך, אולי באיכויות שונות. זהו הדפוס הנפוץ ביותר כיום עבור שיחת ועידה בווידאו מרובת משתמשים וסטרימינג אינטראקטיבי ניתן להרחבה.
  • ארכיטקטורות היברידיות WebRTC + HLS/DASHWebRTC משמש לקליטה ואינטראקציה, בעוד ש-HLS/DASH מפיצים לקהלים גדולים שאינם זקוקים לאינטראקציה בזמן אמת. זהו איזון בין חביון נמוך במיוחד עבור ה"שחקנים" ומדרגיות עצומה עבור "צופים".

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

מקרי שימוש אופייניים: שיחות וידאו, סטרימינג, IoT ועוד

WebRTC הפך לכל דבר, וסביר להניח שאתם משתמשים בו כל יום מבלי לשים לב. כמה דוגמאות שבהן הוא מתאים במיוחד הן... שיחות וידאו ושיחות ועידה בוידאו:

  • שיחות וידאו ושיחות ועידה בוידאוGoogle Meet, Jitsi, Slack, Microsoft Teams וכלים רבים אחרים מסתמכים על WebRTC (בחלקו או במלואו) לשיתוף וידאו, אודיו ומסכים.
  • שירותי סטרימינג בזמן אמתפלטפורמות כמו Twitch, Meta Live, Vimeo Livestream או כלים כמו Streamyard משלבות WebRTC לצורך בליעה וטכנולוגיות אחרות להפצה המונית.
  • צ'אט והעברת הודעות עם שיתוף קבציםהודות ל-RTCDataChannel תוכלו לקיים צ'אט בזמן אמת, שיתוף קבצים, סנכרון סטטוסים וכו', ללא שרתי מדיה מרכזיים.
  • משחקי ענן ומשחקי מרובה משתתפיםשירותים כמו GeForce NOW או Xbox Cloud Gaming ממנפים טכנולוגיות דומות עבור וידאו אינטראקטיבי; משחקי P2P רבים משתמשים ב-WebRTC כדי לסנכרן את המשחק.
  • האינטרנט של הדברים ומעקבמצלמות חכמות, צגי תינוקות, פעמוני דלת עם וידאו או רחפנים יכולים לשלוח וידאו בזמן אמת למכשירים ניידים ודפדפנים המשתמשים ב-WebRTC.
  • חינוך וטלרפואהכיתות לימוד וירטואליות עם לוחות לבנים, חידונים ווידאו דו-כיווני, או ייעוץ רפואי מקוון שבו זמן השהייה ואבטחה הם קריטיים.

אבטחת WebRTC: הצפנה, הרשאות ושיטות עבודה מומלצות

אבטחה ב-WebRTC אינה תוספת: היא מובנית. משולב מהעיצובכל רכיבי המדיה מוצפנים וממשקי ה-API פועלים רק ממקורות מאובטחים (HTTPS או localhost), אם כי מומלץ להיות ערניים. הונאות באמצעות שיחות וידאו.

  • DTLS (אבטחת שכבת תעבורת נתונים) מצפינה נתונים במעבר.
  • SRTP פרוטוקול תעבורה מאובטח בזמן אמת (Secure Real-time Transport Protocol) מגן על אודיו ווידאו כך שלא ניתן יהיה לתפעל אותם או ליירט אותם בקלות.
  • גישה ל מצלמה ומיקרופון זה דורש אישור מפורש מהמשתמש, עם אינדיקטורים חזותיים גלויים (סמלים, נקודות צבעוניות וכו').
  • מכיוון שאין תוספים להתקנה, הסיכון של תוכנה זדונית מוסווה בתוספים או קבצים בינאריים של צד שלישי.

למרות זאת, אתה צריך לדאוג לשכבה שלך: השתמש HTTPS לכל אורך הדרךבדוק את ההרשאות שאתה מבקש, שמור על דפדפנים וספריות מעודכנים, ואל תזניח את אבטחת שרת האיתות שלך או ממשקי ה-API של REST שלך.

WebRTC לעומת טכנולוגיות אחרות: VoIP, WebSockets ופלטפורמות קנייניות

אם אתם מגיעים מעולם ה-VoIP המסורתי, אתם בוודאי מכירים SIP, PBX, טלפונים ניידים ושרתים יקרים. WebRTC משנה את הפרדיגמה: אינכם צריכים לדרוש מהמשתמש לספק מידע כלשהו. לקוח שולחן עבודה אין צורך בחומרה ספציפית; דפדפן ושרת איתות פשוט יחסית מספיקים.

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

לגבי WebSocketsיש לראות אותם יותר כמשלימים: הם אידיאליים להתראות, צ'אט קל או עדכוני סטטוס, אך לא למדיה אינטנסיבית. WebRTC מותאם במיוחד עבור אודיו/וידאו בזמן אמתעם בקרת עומס, קודקים, מאגר ג'יטר וכו'. בפועל, פרויקטים רבים משתמשים ב-WebSockets לאיתות וב-WebRTC להובלת מדיה.

אם משווים אותם לפלטפורמות כמו זום, GoToMeeting או WebExההבדל טמון במודל: כלים אלה הם פתרונות סגורים, לרוב עם אפליקציות שולחן עבודה חובה וקצה אחורי קנייני. WebRTC, לעומת זאת, היא טכנולוגיה בסיסית; ניתן לבנות עליה "מיני-Meet" משלכם או לשלב אותה עם שירותים שכבר משתמשים בה (כמו Google Meet או Microsoft Teams).

פיתוח עם WebRTC: מורכבות אמיתית ומכשולים נפוצים

למרות שממשקי ה-API נראים פשוטים על הנייר, יישום WebRTC מאפס הוא מורכב יותר. תצטרכו להתמודד עם:

כיצד להשתמש בדפדפן Tor כדי לגשת לרשת העמוקה
Artaculo relacionado:
דפדפן Tor לאנדרואיד: הגדרות מתקדמות ושימוש מאובטח
  • שילוט בהתאמה אישיתעיצוב הודעות, חדרים, ניהול חיבורים מחדש, ניסיונות חוזרים, שגיאות.
  • ניהול קרח/הלם/סיבובפריסת שרתים, ניטור השימוש ב-TURN (אשר צורך רוחב פס), התאמת פסקי זמן.
  • איכות השירות (QoS): להתאים קצבי סיביות, להתמודד עם רשתות לא יציבות, לנהל משא ומתן על רכיבי codec, לזהות מתי חיבור מתדרדר ולהגיב.
  • דֵרוּג: מעבר מ-P2P פשוט לקבוצות, ואז למאות משתמשים, הכנסת SFUs או שרתי מדיה מבלי לשבור את העיצוב המקורי.
  • תואם עבור נבגיםלמרות שהמצב טוב, עדיין תמצאו ניואנסים. adapter.js זה עדיין מומלץ מאוד.

בפרויקט צדדי קטן, הקמת שרת Node עם Socket.IO ו-STUN ציבורי עשויה להספיק לשיחות אישיות או לקבוצות קטנות מאוד. אבל אם הרעיון שלכם גדל ואתם צריכים קהל גדולבין אם מדובר בבקרת איכות עדינה, הקלטות, ניתוח, תמלולים או מונטיזציה, בקרוב תצטרכו לשקול או לשלב שרת מדיה משלואו לעבור לספק מומחה.

CDN בזמן אמת עם SDKs: Agora, Twilio, Mux, ZEGOCLOUD…

שירותים כמו אגורה, טוויליו, מוקס, זגוקלאוד או טכנולוגיות דומות בונות שכבת ערך על גבי WebRTC שחוסכת לכם חודשים של עבודה וכאבי ראש רבים:

  • הם מציעים לך א רשת תקשורת עולמית עם יחידות SFU המופצות ברחבי העולם, ממוטבות להשהייה נמוכה.
  • תַקצִיר הלם/סיבוב, איתות, ניסיונות חוזרים, חיבורים מחדש וניהול רשת מורכב.
  • הם כוללים ערכות פיתוח תוכנה (SDK) מתוחזקות היטב עבור אינטרנט, iOS, אנדרואיד, ריאקט נייטיב ומסגרות אחרות.
  • הם מספקים תוספות כגון הקלטה, שידור ל-RTMP/HLS, ניהול, סטטיסטיקות בזמן אמת, בקרות איכות, תפקידי משתמשים (מארח, קהל, דובר) וכו'.

העלות, כפי שאתם ודאי חושדים, היא הבעיה העיקרית: אם יש לכם אפילו קצת כסף דקות רבות של וידאו או, עם מספר משמעותי של משתמשים בו זמנית, החשבון מרקיע שחקים. יתר על כן, אתם הופכים תלויים בפלטפורמה שלהם ובשינויי המחיר או ה-API שלה.

במצבך הספציפי, עם ניסיון רב ב ג'אווהסקריפט בזמן אמתאפשרות הגיונית היא להתחיל עם SDK כדי להאיץ את הפיתוח, לאמת את המוצר וללמוד על מודל החדר שלו, תפקידיו, מחזור חיי הזרם וניהול המצבים. בהמשך, אם הפרויקט ממריא והעלות הופכת לבעיה, ניתן להעביר בהדרגה חלקים מהפתרון לפלטפורמה חזקה יותר. תשתית WebRTC קניינית או להסתמך על שרת מדיה מסוג Flusonic כדי לשלוט בשכבת ההפצה.

שיטות עבודה מומלצות וכלים לאיתור ניפוי שגיאות ב-WebRTC

כדי להימנע מללכת לאיבוד בקופסה השחורה של WebRTC, מומלץ להסתמך על הכלים שכבר קיימים בדפדפנים ובמערכת האקולוגית:

  • כרום: // webrtc-internals (o אודות: webrtc (בפיירפוקס): פאנל עם סטטיסטיקות מפורטות של חיבורים, קצבי סיביות, אובדן חבילות, קודקים פעילים וכו'.
  • adapter.js: שימו לב שמתוחזק על ידי הקהילה ומחליק הבדלים בין דפדפנים וגרסאות.
  • test.webrtc.org: כדי לבדוק תאימות של מצלמה, מיקרופון, רשת ותאימות כללית במחשב.
  • דוגמיות רשמיות ב- webrtc.github.io/samples: דוגמאות לאילוצים, חיבורי עמיתים, ערוצי נתונים, שיתוף מסך... שימושי מאוד להעתקת תבניות.

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

אנדרואיד ולינוקס
Artaculo relacionado:
אנדרואיד ולינוקס: החלופות הטובות ביותר ל-KDE Connect

עם כל האמור לעיל על השולחן, עבור פרויקט צדדי שרק מתחיל ושבו אתם מעריכים כל כך את זמן פיתוח כמו עלות בטווח הבינוניהאסטרטגיה המאוזנת ביותר היא בדרך כלל להתחיל עם SDK בזמן אמת המבוסס על WebRTC המאפשר לבצע איטרציות מהירות ב-React/React Native, להפנים את האופן שבו הם מטפלים בתפקידים, סשנים, מחזור חיי סטרימינג ומצבים חיים, ובמקביל להתעמק ב-WebRTC "במובן המלא" (getUserMedia, RTCPeerConnection, RTCDataChannel, איתות עם Node+Socket.IO, STUN/TURN, SFU) כדי לא להיות קשורים לנצח לפלטפורמה אחת ולהיות מסוגלים לעשות את הקפיצה לפתרון מותאם אישית יותר כאשר המוצר מצדיק זאת.