האם Webrtc זקוק ל Backend?
האם WebRTC ללא שום שרת אפילו לא שרת איתות אפשרי
סיכום
WebRTC היא חבילת רכיבים המאפשרת ערוצי מדיה ונתונים בזמן אמת בין דפדפנים. עם זאת, זה עדיין דורש שירות Backend עבור פונקציות מסוימות. במאמר זה נבחן את הסיבות לכך ששירות Backend נחוץ, הרכיבים והחומרה המעורבים בהגדרת WebRTC, הקודקים של השמע והווידיאו הנתמכים, וחשיבותו של שרת ספרייה ושרת הלם.
1. מה זה webrtc?
WebRTC היא חבילה של רכיבים המאפשרת למפתחים להקים ערוצי מדיה ונתונים בזמן אמת בין הדפדפנים. זה נוצר על ידי גוגל ומכיל רכיבי מפתח שנשלחים ב- Chrome, Firefox, Opera ו- Microsoft Edge (ORTC).
2. מדוע אתה עדיין צריך שירות Backend?
למרות היכולות של WebRTC, שירות Backend נדרש לפונקציות מסוימות. לדוגמה, כדי להתקשר למישהו, אתה צריך לדעת את הכתובת שלו, שהיא בדרך כלל דינמית. מידע זה צריך להיות מאוחסן ולנהל בשרת. בנוסף, שירות Backend יכול לעקוב אחר כל המכשירים למשתמש ולהודיע להם על שיחות נכנסות.
3. אילו רכיבים וחומרה מעורבים בהגדרת WEBRTC?
WebRTC עוזר בהקמת הסביבה הפיזית, כמו מצלמות, רמקולים ומיקרופונים, כמו גם חומרה אחרת כמו ביטול הד וחומרת ביטול רקע. זה גם מסייע בהגדרת התצורה של הרשת באמצעות Stun (Session Traversal Utilities עבור NAT).
4. אילו קודקי שמע נתמכים על ידי webrtc?
WEBRTC תומך בקודקי שמע שונים כולל G711, ILBC ו- OPUS. אופוס הוא קודקוד משתנה באיכות גבוהה הנמצא בשימוש נרחב ב- WebRTC.
5. אילו קודקים בווידיאו נתמכים על ידי Webrtc?
WEBRTC תומך ב- VP8 ו- VP9 Codecs, שהם הווריאציות ללא תמלוגים של גוגל של H.264/h.265. זה גם תומך ב- H.264.
6. מדוע קודקי שמע חשובים ב- WebRTC?
Codecs Audio מטפל במשימות כמו אובדן מנות, קידוד ופענוח של שמע, תיקון שגיאות, ביטול רעש, ביטול הד, ופילוס נפח. הם תורמים לפופולריות של WebRTC במכשירים ניידים ושולחנות עבודה ניידים.
7. מה הספרייה של מי זמין להתקשר?
על מנת להתחיל שיחה, עליך לדעת את הכתובת של הנמען. הספרייה משמשת כדפים לבנים דינאמיים, ומאפשרת למשתמשים לבצע צ’ק -אין עם שרת ולספק מידע ליצירת קשר. ניתן ליישם זאת באמצעות פרוטוקולים XMPP, SIP או מותאם אישית.
8. מדוע אתה זקוק לשרת הלם?
שרת Stun (Session Traversal Utilities עבור NAT) עוזר לקבוע את כתובת ה- IP החיצונית של מכשיר ובודק אם שני מכשירים יכולים לתקשר ישירות. זה ממלא תפקיד מכריע בקביעת קשרים בין עמיתים.
9. מהו שרת פנייה?
אם אין אפשרות להפעלה של עמיתים לעמית בגלל מגבלות חומת האש, יש צורך בתור (חצייה באמצעות ממסרים סביב NAT). זה עוזר להעביר נתונים בין מכשירים על ידי עקיפת מגבלות חומת אש.
10. מדוע שתשקול להשתמש בשירות Backend כמו sinch?
הגדרת ושמירה על שרתים לאיתות, הלם וסיבוב יכולה להיות מורכבת ויקרה. סינץ ‘, כספק שירותי Backend, מציע פתרונות מדרגיים וחסכוניים. הם מטפלים במיליארד דקות בשנה ומספקים SDKs WebRTC מיטביים למכשירים שונים ותנאי רשת שונים.
11. הוא webrtc רק על backend?
לא, webrtc כרוך בהיבטים חזיתיים וגם של Backend. SINCH, למשל, מתאים ומגדיר את התצורה של WEBRTC SDK כדי להבטיח ביצועים מיטביים בין מכשירים ותנאי רשת. הם מיישמים תכונות כמו Opus אדפטיביים כדי להתאים את איכות ההקלטה על בסיס מדדים איכותיים מתנועה.
12. מהם היתרונות של שימוש בסינץ ‘?
SINCH מציע מומחיות בתקשורת בזמן אמת ומספק SDKs WebRTC מותאמים אישית, קודקים אופטימליים ורשת מבוזרת. התמחור שלהם עבור העברת נתונים הוא חסכוני והם מבטיחים תקשורת עם חורבן נמוך באמצעות שרתים ממוקמים אסטרטגית.
13. כמה בולט חביון רשת בשיחה?
כ -250 מ ‘של חביון רשת מורגש במהלך שיחה. גורמים כמו חביון רשת, זמן עיבוד וקידוד נתונים יכולים לתרום לחביון הכללי.
14. אילו פונקציונליות מספק שירות Backend ב- WebRTC?
שירות Backend מטפל במשימות כגון ניהול ספריות, איתות, הלם והפנה לניהול שרת ומעקב אחר מכשירים למשתמשים.
15. מה הופך את WebRTC לפופולרי במכשירים ניידים ושולחן עבודה?
התמיכה של WebRTC בקודקי שמע ווידאו, יחד עם קלות השימוש ויכולות בזמן אמת, תורמת לפופולריות שלה במכשירים ניידים ושולחן עבודה ניידים.
האם WebRTC ללא שום שרת אפילו לא שרת איתות אפשרי
לאחר מכן, פתח שתי כרטיסיות בדפדפן שלך (או בשני דפדפנים שונים), והכניסה Localhost: 7000. כאמור, עדיף שיהיה שתי מצלמות זמינות לדוגמה זו לעבוד. אם הכל הולך טוב, אתה אמור לראות הוצאת וידאו אחת בכל אחת מהלשוניות.
Webrtc ולמה אתה עדיין צריך שירות Backend
הצטרף לקהילת Dzone וקבל את חווית החבר המלאה.
מאמר זה הופיע במקור בבלוג SINCH מאת כריסטיאן ג’נסן.
מה זה webrtc?
WebRTC היא חבילה של רכיבים המבוססים מכמה חידושים מחברות שגוגל קנתה בשנת 2010. WebRTC מאפשר למפתח להגדיר ערוצי מדיה ונתונים בזמן אמת בין שני דפדפנים (או מוביילים אם אתה מרכיב את זה בשביל זה). הוא מכיל כמה רכיבי מפתח וכולם נשלחים בכרום, פיירפוקס ואופרה, וגרסה שלה קיימת במיקרוסופט’S קצה הדפדפן החדש (ORTC).
הגדרת זרמי נתונים וחומרה
WebRTC מסייע בהגדרת גם את הסביבה הפיזית (כמו מצלמות, רמקולים ומיקרופונים) וחומרה אחרת (כגון ביטול הד וחומרת ביטול רקע – אלה שתמצאו בעיקר במוביילים), ובנוסף עוזרים להבין את הרשת יחד עם הלם.
קודקי שמע וקודקי וידאו
אחד היתרונות העיקריים המשתמשים ב- WebRTC על פני תוכנה אחרת כאשר התמודדות עם שמע ווידאו בזמן אמת הוא קוד פתוח/קודקים בחינם של גוגל חביבה מספיק כדי לשלוח.
Codecs Audio
- G711, המשמש ברשתות טלפון רגילות
- ILBC, מקודד פס צר ישן, המשמש גם ברשתות טלפון
- Opus, משתנה באיכות גבוהה ו (תמיכה בקודקוס אדפטיבי) שהוא החדש ביותר ב- Codec המשמש ב- WebRTC.
יש יותר נשלחים, אבל אלה העיקריים והכי נפוצים.
Codecs וידאו
- VP8 ובקרוב VP9, זהו גוגל’וריאציה של H ללא תמלוגים H.264/h.265 Codec
- ח.264 (נוסף בשנת 2015 כהסכם ל- ORTC)
Codecs Audio עושים הרבה מהעבודה עבורך, דואגים לאובדן מנות, קידוד ופענוח של שמע, תיקון שגיאות, ביטול רעש, ביטול הד, פילוס נפח ועוד. העובדה שהוא מכיל Codecs גם הופכת אותו לפופולרי מאוד במכשירים ניידים ושולחנות עבודה.
אז עכשיו אני יכול לבנות שיחות מבוססות דפדפן משלי ב- JavaScript טהור באמצעות (הוסף כאן את מסגרת JS Side JS המועדפת עליך). למרבה הצער, זה’זה לא כל כך פשוט כדי לקבוע שיחה מכיוון שיש שני דברים עיקריים שחסרים כאן.
מדריך מי זמין להתקשר (או גילוי עמיתים)
כדי להתקשר למישהו, אתה צריך לדעת את הכתובת, ובניגוד למספרי טלפון רגילים, הכתובת באינטרנט היא בעיקר כתובות IP דינאמיות. כדי לפתור זאת, אתה צריך לרשום היכן כולם נמצאים. ניתן לעשות זאת במספר דרכים באמצעות XMPP, SIP, פרוטוקולים מותאמים אישית וכו ‘., אבל הכל מסתכם בכל מי שמוכן לקבל שיחה בודק עם שרת כך או אחרת, ומאפשר לשרת לדעת כיצד ליצור קשר עם אותו עמית (משתמע למשלוח נוסף של הצעה/הזמנה/SDP וכו ‘.).
חשוב על זה כדפים לבנים דינאמיים לחלוטין. זה נעשה בדרך כלל במרווחים מתוזמנים כדי לשמור על חומות אש או דומה לשרת האיתות להודיע ללקוח אם מישהו רוצה לתקשר איתו. אז זו היצירה הראשונה שאתה צריך לבנות על זה.
בשלב הבא אתה בטח רוצה לעקוב אחר כל המכשירים למשתמש מסוים ולהודיע להם בכל המכשירים אם יש שיחה. בעזרת סינץ ‘אנו דואגים לחלק זה עבורך.
שרת הלם
לאחר ששרת האיתות שלך איתר מכשיר ושולח הצעה, אתה זקוק לשרת הלם. שרת הלם יאפשר לקבוע את כתובת ה- IP החיצונית שלך, כמו גם אם שני המכשירים (או יותר) יכולים לדבר זה עם זה ישירות. סינץ ‘ידאג גם לך.
שרת ממסר מדיה (פנה שרת)
אם לא אפשרי הפעלה של עמיתים לעמית (הנתונים שלנו מצביעים על זה בסביבות 25% מהמפגשים), תזדקק לשרת פנייה. שרת הפנייה בעצם יעביר את החלקים עבורך דרך חורים פתוחים בחומת האש בין שני הלקוחות. למה זה קרה? הנפוץ ביותר הוא חומות אש א -סימטריות והאפשרות להכות חורים בנמלים שונים בחומות אש.
בסדר, אבל למה דון’אני מגדיר את זה בעצמי?
ובכן, אתה יכול. זה עשוי להיות קצת יתר על המידה, ועוד יכולת אחת בצוות הפעילות שלך תידרש. תורכם ושרתי הלם ככל הנראה יהיו תחת שימוש בכבדות ויקרים. וכאן נכנסת כלכלה מדרגית. מכיוון ש- SINC.
אתה בטח רוצה שתהיה גם רשת מבוזרת. אם למשל יש לך שרת התור שלך ב- U.ג. והשיחות נמשכות בין לקוחות באירופה, תוסיף חביון רק בגלל שכל התנועה צריכה לחצות את האוקיאנוס. כלל אצבע טוב הוא שסביבות 250 מ”מ מורגשת בשיחה (מידע יותר על מידע שירות כאן). לכן, מבלי להוסיף חביון רשת כלשהו על הלקוח וזמן העיבוד לקידוד הנתונים, אתה בעצם מובטח שיהיה לך יותר מדי חביון בין הלקוחות.
האם זה רק על Backend?
זה’לא רק על Backend. ב- SINCH יש לנו ניסיון רב של תקשורת בזמן אמת, ואנחנו מתאימים ומגדירים את התצורה של WEBRTC SDK שלנו כדי לעבוד בצורה הטובה ביותר בכל המכשירים ובתנאי רשתות שונות. כמה דוגמאות הן יישום אופוס אדפטיבי, אשר יתאים את איכות ההקלטה על בסיס מדדים איכותיים מהתנועה שלנו. אנו יודעים גם באילו קודקים להשתמש בנסיבות ספציפיות, ואילו לבחור כדי למזער את קידוד הניתוח והשהייה ברחבי העולם.
פורסם ב- Dzone באישור כריסטיאן ג’נסן . עיין במאמר המקורי כאן.
דעות שהביעו על ידי תורמי Dzone הם שלהם.
האם WebRTC ללא שום שרת אפילו לא שרת איתות אפשרי?
אני מנסה להגדיר תוסף קורדובה ל- iOS שממלא את פונקציות WebRTC מבלי להשתמש בשרת כלשהו וזה יעשה זאת יש להשתמש רק ברשת מקומית. אני יודע שיש את התוסף הזה, שנראה מבטיח אבל יש לי כמה בעיות עם זה. התוכנית שלי היא לא להשתמש בטרון, הלם או כל סוג של שרת איתות. אולי אתה חושב עכשיו: “בסדר זה לא אפשרי. אף איתות אינו שווה לחיבור.“אבל תן לי להסביר קודם. כפי שצוין כאן וכאן אפשר להימנע משימוש בשרת טרון, הלם או קרח. אני חושב שזו דרך טובה להתחיל את הפרויקט שלי אבל עדיין יש שאלה פתוחה. כיצד המכשירים ימצאו זה את זה אם אין איתות כלשהו (בדוגמה הם משתמשים בצומת.שרת JS)? כרגע אני משחק עם הרעיון של קוד QR המכיל את כל המידע הדרוש. בסוף זה צריך להיראות כך (Arrwos שחורים חשובים יותר): הרעיון הוא שכל מי שנכנס לחדר צריך לסרוק קוד QR ב- RP ואז המכשיר מכיר את ה- IP, היציאה וכו ‘. של ה- RP וחיבור WebRTC עם Datachannel יוקם. אני מחפש תשובה כבר ימים, אבל בגלל העובדה (או לפחות אחת הסיבות) ש- WebRTC אפילו לא נתמך ב- iOS באופן טבעי, אין הרבה דוגמאות webrtc בחוץ שעובדות על iOS ואף אחד לרשת מקומית. אז השאלה שלי היא: האם אני בדרך הנכונה או שזה אפילו לא אפשרי? (לא מצאתי דוגמה לכך בשום מקום, אבל אם אני שם את כל הפוסטים שקראתי יחד, אני חושב שזה אמור להיות אפשרי.)
שאל 10 באוגוסט 2017 בשעה 12:38
3,257 3 3 תגי זהב 11 11 תגי כסף 19 19 תגי ברונזה
לא משנה איך אתה פותר גילוי, אבל כדי ליצור חיבור WebRTC, אתה צריך לקבל את ההצעה ולענות על הודעות בין העמיתים איכשהו. ההודעות הללו מכילות אוטומטית מועמדים לקרח אם אתה מחכה לאיסוף הקרח שיסיים קודם. ראה StackOverflow.com/a/29056385/918910.
Webrtc: דוגמה עובדת
לאחרונה הייתי צריך להשתמש ב- WebRTC לפרויקט פשוט. לטכנולוגיה עצמה יתרונות רבים והיא מפותחת כסטנדרט פתוח, ללא צורך בתוספים כלשהם. עם זאת, הייתי די חדש ב- WebRTC והיו לי כמה בעיות להביא את הראש סביב המושגים הבסיסיים, כמו גם ליצור פיתרון עובד. ישנם הדרכות רבות זמינות (כמו זו, שהעניקה השראה לפיתרון שלי). אבל רובם לא שלמים, מיושנים או אילצו אותי להשתמש בכמה שירותי צד ג ‘(ה.ז. Google Firebase), מה שהפך את כל התהליך לסבך יותר להתקנה וקשה יותר להבנה.
החלטתי להרכיב את המידע מכל המשאבים האלה וליצור דוגמה פשוטה ועובדת ליישום WebRTC. זה לא דורש שירותי צד ג ‘אלא אם כן ברצונך להשתמש בהם ברשת ציבורית (ובמקרה זה הבעלות על שרת באמת תעזור). אני מקווה שזה יספק נקודת התחלה טובה לכל מי שמעוניין לחקור את Webrtc.
זה לא הולך להיות הדרכה מלאה לטכנולוגיית Webrtc. תוכלו למצוא שפע של הדרכות והסברים מפורטים בכל האינטרנט, למשל כאן. אתה יכול גם לבדוק את ה- API של WebRTC אם אתה רוצה מידע נוסף. הפוסט הזה רק הולך להראות לך דוגמה אחת אפשרית עבודה של webrtc ולהסביר איך זה עובד.
תיאור כללי
קוד המקור המלא של דוגמה זו זמין ב- GitHub. התוכנית מורכבת משלושה חלקים:
- אפליקציית רשת
- שרת איתות
- פנה לשרת
ה אפליקציית רשת הוא פשוט מאוד: קובץ HTML אחד וקובץ JavaScript אחד (בתוספת תלות אחת: שֶׁקַע.io.JS, הכלול במאגר). זה נועד לעבוד עם שני לקוחות בלבד (שני דפדפני אינטרנט או שתי כרטיסיות של אותו דפדפן). ברגע שתפתח אותו בדפדפן שלך (נבדק ב- Firefox 74), הוא יבקש אישור להשתמש במצלמה ובמיקרופון שלך. לאחר הענקת ההרשאה, הווידיאו והשמע מכל אחת מהלשוניות יוזרמו לזה האחר.
הערה: אתה עלול לחוות כמה בעיות אם תנסה לגשת לאותה מצלמה משתי הכרטיסיות. במבחן שלי, אני’VE השתמשה בשני מכשירים תוך כדי בדיקה במכונה שלי (מצלמת מחשב נייד מובנית ומצלמת רשת USB).
ה שרת איתות משמש על ידי יישומי WebRTC כדי להחליף מידע הנדרש ליצירת קשר ישיר בין עמיתים. אתה יכול לבחור כל טכנולוגיה שאתה רוצה בשביל זה. דוגמה זו משתמשת ב- WebSockets (Python-Socketio ב- Backend ו- שֶׁקַע.io-client בחזית).
ה לפנות שרת נדרש אם ברצונך להשתמש בדוגמה זו ברשת ציבורית. התהליך מתואר עוד יותר בפוסט זה. לבדיקות רשת מקומיות, לא תזדקק לכך.
איתות
שרת האיתות כתוב ב- Python3 ונראה כך:
מתוך AIOHTTP ייבוא אינטרנט ייבוא SOCKECTIO ROOM = 'ROOM' SIO = SOCKECTIO.AsyncServer (cors_lowed_origins = '*') app = web.יישום () sio.צרף (אפליקציה) @sio.Event Async Def Connect (SID, Environ): הדפס ('מחובר', SID) מחכה ל- SIO.פול ('מוכן', חדר = חדר, skip_sid = sid) sio.Enter_room (סיד, חדר) @sio.ניתוק אירועים (SID): SIO.Leave_room (Sid, Room) הדפס ('מנותק', Sid) @sio.Event Async Def Data (SID, נתונים): הדפס ('הודעה מ <>: <>'.פורמט (סיד, נתונים)) ממתין ל- SIO.פול ('נתונים', נתונים, חדר = חדר, skip_sid = sid) אם __name__ == '__MAIN__': WEB.run_app (אפליקציה, יציאה = 9999)
כל לקוח מצטרף לאותו חדר. לפני הכניסה לחדר, א מוּכָן האירוע נשלח לכל הלקוחות שנמצאים כעת בחדר. המשמעות היא שחיבור ה- WebSocket הראשון לא יקבל הודעה (החדר ריק), אך כאשר הקבוע החיבור השני, הראשון יקבל א מוּכָן אירוע, מאותת כי ישנם לפחות שני לקוחות בחדר והחיבור WebRTC יכול להתחיל. מלבד זאת, שרת זה יעביר כל נתונים (נתונים אירוע) שנשלח על ידי שקע אחד לשנייה.
ההתקנה די פשוטה:
איתות CD PIP התקן את AIOHTTT PYTHON-SOCKECTIO PYTHON SERVER.PY
זה יתחיל את שרת האיתות ב Localhost: 9999.
Webrtc
התהליך הפשוט של השימוש ב- WebRTC בדוגמה זו נראה כך:
- שני הלקוחות משיגים את זרמי המדיה המקומיים שלהם
- לאחר קבלת הזרם, כל לקוח מתחבר לשרת האיתות
- ברגע שהלקוח השני מתחבר, הראשון מקבל א מוּכָן אירוע, מה שאומר שניתן לנהל משא ומתן על חיבור WebRTC
- הלקוח הראשון יוצר אובייקט RTCPeerConnection ושולח הצעה ללקוח השני
- הלקוח השני מקבל את ההצעה, יוצר אובייקט RTCPeerConnection ושולח תשובה
- מידע נוסף מוחלף גם, כמו מועמדי קרח
- לאחר המשא ומתן על המשא ומתן על החיבור, נקרא קריאה חוזרת לקבלת זרם מרוחק, וזרם זה משמש כמקור ל וִידֵאוֹ אֵלֵמֶנט.
אם אתה רוצה להריץ דוגמה זו ב- LocalHost, שרת איתות ויישום האינטרנט הוא כל מה שאתה צריך. החלק העיקרי של קובץ HTML הוא אלמנט וידיאו יחיד (איזה מקור עומד להיות מוגדר מאוחר יותר על ידי הסקריפט):
דוגמה לעבודה WebRTC
חלק JavaScript הוא קצת יותר מסובך, ואני’להסביר את זה צעד אחר צעד. ראשית, ישנם משתני התצורה:
// משתנים config const signing_server_url = 'http: // localhost: 9999'; const pc_config = <>;
עבור Localhost, PC_CONFIG יכול להישאר ריק, ו איתות_שרון_רל צריך להצביע על שרת האיתות אתה’התחילה בשלב הקודם.
בשלב הבא יש לנו את שיטות האיתות:
תן Socket = IO (איתות_SERVER_URL, < autoConnect: false >); שֶׁקַע.ב ('נתונים', (נתונים) => < console.log('Data received: ',data); handleSignalingData(data); >); שֶׁקַע.ב ('מוכן', () => < console.log('Ready'); createPeerConnection(); sendOffer(); >); תן ל- SendData = (נתונים) => < socket.emit('data', data); >;
בדוגמה זו אנו רוצים להתחבר לשרת האיתות רק לאחר שנקבל את זרם המדיה המקומי, ולכן עלינו להגדיר . חוץ מזה, יש לנו לשלוח נתונים שיטה הפולטת א נתונים אירוע, ואנחנו מגיבים ל נתונים אירוע על ידי טיפול במידע הנכנס כראוי (עוד על כך בהמשך). כמו כן, קבלת א מוּכָן האירוע פירושו ששני הלקוחות השיגו את זרמי המדיה המקומיים שלהם והתחברו לשרת האיתות, כך שנוכל ליצור חיבור בצד שלנו ולנהל משא ומתן על הצעה עם הצד המרוחק.
בשלב הבא יש לנו את המשתנים הקשורים ל- WebRTC:
תן למחשב; תן ל- LocalStream; תן ל- RemoteStreamElement = מסמך.QuerySelector ('#remotestream');
ה PC יחזיק בחיבור העמיתים שלנו, LocalStream הוא הזרם שאנו משיגים מהדפדפן, ו RemostreameLement האם ה וִידֵאוֹ אלמנט בו נשתמש כדי להציג את הזרם המרוחק.
כדי להשיג את זרם המדיה מהדפדפן, אנו נשתמש getLocalStream שיטה:
תן getLocalStream = () => < navigator.mediaDevices.getUserMedia(< audio: true, video: true >) .ואז ((זרם) => < console.log('Stream found'); localStream = stream; // Connect after making sure that local stream is availble socket.connect(); >) .לתפוס (שגיאה => < console.error('Stream not found: ', error); >); >
כפי שאתה יכול לראות, אנו הולכים להתחבר לשרת האיתות רק לאחר שהזרם (שמע ווידאו) מתקבל. שימו לב שכל הסוגים והמשתנים הקשורים ל- WebRTC (כמו נווט, RTCPEERCONNECTION, וכו.) מסופקים על ידי הדפדפן ואינם מחייבים אותך להתקין דבר.
יצירת חיבור עמיתים קלה יחסית:
תן CreatePeerConnection = () => < try < pc = new RTCPeerConnection(PC_CONFIG); pc.onicecandidate = onIceCandidate; pc.onaddstream = onAddStream; pc.addStream(localStream); console.log('PeerConnection created'); >לתפוס (שגיאה) < console.error('PeerConnection failed: ', error); >>;
שני ההתקשרות שאנו הולכים להשתמש בהם הם OniceCandidate (נקרא כאשר הצד המרוחק שולח לנו מועמד קרח), ו OnAddStream (נקרא לאחר שהצד המרוחק מוסיף את זרם המדיה המקומי שלו לחיבור העמיתים שלו).
בשלב הבא יש לנו את ההיגיון של ההצעה והתשובה:
תן ל- SendOffer = () => < console.log('Send offer'); pc.createOffer().then( setAndSendLocalDescription, (error) => < console.error('Send offer failed: ', error); >); >; תן ל- SendAnswer = () => < console.log('Send answer'); pc.createAnswer().then( setAndSendLocalDescription, (error) => < console.error('Send answer failed: ', error); >); >; בואו setandsendlocaldescript < pc.setLocalDescription(sessionDescription); console.log('Local description set'); sendData(sessionDescription); >;
פרטי המשא ומתן של WebRTC הצעה לתשובות אינם חלק מהפוסט הזה (אנא עיין בתיעוד WebRTC אם אתה רוצה לדעת יותר על התהליך). זה’מספיק כדי לדעת שצד אחד שולח הצעה, השני מגיב אליו על ידי שליחת תשובה, ושני הצדדים משתמשים בתיאור עבור חיבורי העמיתים המתאימים שלהם.
התקשרות חוזרת WebRTC נראית כך:
תן ל- OniceCandidate = (אירוע) => < if (event.candidate) < console.log('ICE candidate'); sendData(< type: 'candidate', candidate: event.candidate >); >>; תן ל- onAdddStream = (אירוע) => < console.log('Add stream'); remoteStreamElement.srcObject = event.stream; >;
מועמדי קרח שהתקבלו נשלחים ללקוח האחר, וכאשר הלקוח האחר קובע את זרם המדיה, אנו מגיבים באמצעותו כמקור עבורנו וִידֵאוֹ אֵלֵמֶנט.
השיטה האחרונה משמשת לטיפול בנתונים נכנסים:
תן ל- HandlesignalingData = (נתונים) => < switch (data.type) < case 'offer': createPeerConnection(); pc.setRemoteDescription(new RTCSessionDescription(data)); sendAnswer(); break; case 'answer': pc.setRemoteDescription(new RTCSessionDescription(data)); break; case 'candidate': pc.addIceCandidate(new RTCIceCandidate(data.candidate)); break; >>;
כאשר אנו מקבלים הצעה, אנו יוצרים חיבור עמיתים משלנו (המרוחק מוכן באותה נקודה). לאחר מכן, אנו קובעים את התיאור המרוחק ושולחים תשובה. כאשר אנו מקבלים את התשובה, אנו פשוט קובעים את התיאור המרוחק של חיבור העמיתים שלנו. לבסוף, כאשר מועמד קרח נשלח על ידי הלקוח האחר, אנו מוסיפים אותו לחיבור השווים שלנו.
ולבסוף, כדי להתחיל בפועל את החיבור WebRTC, אנחנו רק צריכים להתקשר getLocalStream:
// התחל חיבור getLocalStream ();
פועל ב- Localhost
אם התחלת את שרת האיתות בשלב הקודם, אתה רק צריך לארח את קבצי ה- HTML ו- JavaScript, למשל כאלה:
CD Python -M HTTP.שרת 7000
לאחר מכן, פתח שתי כרטיסיות בדפדפן שלך (או בשני דפדפנים שונים), והכניסה Localhost: 7000. כאמור, עדיף שיהיה שתי מצלמות זמינות לדוגמה זו לעבוד. אם הכל הולך טוב, אתה אמור לראות הוצאת וידאו אחת בכל אחת מהלשוניות.
מעבר ל- LocalHost
יתכן שתפתה להשתמש בדוגמה זו בשני מחשבים שונים ברשת המקומית שלך, ולהחליף מארח מקומי עם המכונה שלך’כתובת IP, ה.ז. 192.168.0.11. תבחין במהירות שזה לא’לא לעבוד, והדפדפן שלך טוען כי נווט אינו מוגדר.
זה קורה מכיוון ש- WebRTC נועד להיות מאובטח. זה אומר כדי לעבוד הוא זקוק להקשר מאובטח. במילים פשוטות: יש לארח את כל המשאבים (במקרה שלנו, שרת HTTP ושרת האיתות). אם ההקשר אינו מאובטח, נווט לא יוגדרו, ולא תורשו לגשת למדיה של משתמשים.
אם אתה רוצה לבדוק דוגמה זו במכונות שונות, באמצעות localhost אם ברור שאינו אפשרות. הגדרת אישורים אינה חלק מפוסט זה ולא משימה קלה בכלל. אם אתה רק רוצה לבדוק במהירות את הדוגמה הזו בשני מחשבים שונים, אתה יכול להשתמש בטריק פשוט. במקום לארח את המשאבים מעל HTTPS, אתה יכול לאפשר הקשר חסר ביטחון ב- Firefox. לך ל אודות: config, לקבל את הסיכון ולשנות את הערכים של שני המשתנים הללו ל נָכוֹן:
- כְּלֵי תִקְשׁוֹרֶת.מכשירים.לֹא בָּטוּחַ.מופעל
- כְּלֵי תִקְשׁוֹרֶת.getusermedia.לֹא בָּטוּחַ.מופעל
זה אמור להיראות כך:
עכשיו אתה אמור להיות מסוגל לגשת ליישום האינטרנט בשני מחשבים שונים, ויש לבסס את חיבור WebRTC כראוי.
הולך גלובלי
אתה יכול להשתמש בדוגמה זו ברשת ציבורית, אבל זה’זה הולך לדרוש קצת יותר עבודה. ראשית, עליך להגדיר שרת פנייה. במילים פשוטות, שרתי פונה משמשים לגלות עמיתים WebRTC ברשת ציבורית. למרבה הצער, לצעד זה, תזדקק לשרת גלוי לציבור. החדשות הטובות הן שברגע שיש לך שרת משלך, תהליך ההתקנה יהיה די קל (לפחות למערכת הפעלה מבוססת Ubuntu). אני’מצא הרבה מידע שימושי בדיון זה על הצפת ערימה, ואני’M פשוט הולך להעתיק את הקטעים החשובים ביותר כאן:
sudo apt התקן coturn turnserver -a -o -v -n -no -dtls -no -tls -u שם משתמש: תעודה -R תחום
זה יתחיל שרת סיבוב באמצעות יציאה 3478. פירושו של הדגלים:
- -א: השתמש במנגנון האישורים לטווח הארוך
- -O: התחל תהליך כדמון (ניתק מהקליפה הנוכחית)
- -v: ‘לְמַתֵן’ מצב מילולי
- -n: אל תשתמש בקובץ תצורה, קח את כל הפרמטרים משורת הפקודה בלבד
- –לא-DTLS: אל תתחיל מאזיני לקוח DTLS
- –לא-TLS: אל תתחיל מאזיני לקוח TLS
- -U: חשבון משתמש, בטופס ‘שם משתמש סיסמא’, לתעודות לטווח הארוך
- -R: תחום ברירת המחדל שישמש למשתמשים
עריכה: כדי לבדוק אם הגדרת שרת התור שלך נכונה, אתה יכול להשתמש ב- validator זה. כדי לבדוק את הדוגמה שלמעלה, עליך להזין את הערכים הבאים:
נְקִישָׁה “הוסף שרת”, הסר שרתים אחרים ובחר “אסוף מועמדים”. אם אתה מקבל רכיב מהסוג ממסר, זה אומר שההגדרה שלך עובדת.
בשלב הבא, עליך לשנות מעט את תצורת חיבור העמיתים. לַעֲרוֹך רָאשִׁי.JS, מחליף עם IP בפועל של השרת שלך:
const turn_server_url = ': 3478'; const turn_server_username = 'שם משתמש'; const turn_server_credential = 'תעודה'; const pc_config = < iceServers: [ < urls: 'turn:' + TURN_SERVER_URL + '?transport=tcp', username: TURN_SERVER_USERNAME, credential: TURN_SERVER_CREDENTIAL >, < urls: 'turn:' + TURN_SERVER_URL + '?transport=udp', username: TURN_SERVER_USERNAME, credential: TURN_SERVER_CREDENTIAL >]>;
כמובן שתצטרך גם לארח את שרת האיתות שלך ואת יישום האינטרנט עצמו ב- IP ציבורי, ואתה צריך לשנות איתות_שרון_רל כראוי. ברגע שזה ייעשה, דוגמה זו אמורה לעבוד עבור כל שתי מכונות המחוברות לאינטרנט.
סיכום
זו רק אחת הדוגמאות למה שאתה יכול לעשות עם webrtc. הטכנולוגיה אינה מוגבלת לשמע ווידאו, ניתן להשתמש בה כדי להחליף נתונים כלשהם. אני מקווה שמצאת את הפוסט הזה מועיל וכי זה יעזור להתחיל אותך עם רעיונות משלך!
תוצאות הסקר: ומפתחי WebRTC אומרים ..
ניהלנו סקר מפתחים קצר עם Bloggeek.אותי לפני כמה שבועות (ראו את הפוסט הזה). קיבלנו 97 משיבים נכון ליום שישי האחרון, 1 באוגוסט. Tsahi בחר באקראי 3 מנצחים – הוא יצר איתם קשר כבר כך שאם לא קיבלת את הדוא”ל שלו אנו מצטערים לומר שלא זכית 2 ספרים אלקטרוניים בחינם. עם זאת, אתה עדיין זכאי להנחה של 20%, והיית צריך לקבל דוא”ל עם הוראות עם קודי קופון.
97 המשיבים בהחלט אינם גודל מדגם תקף סטטיסטית ממאגר של אלפי מפתחי WEBRTC פעילים (אולי יותר), אך יש כמה נקודות נתונים שימושיות שנוכל לחלץ מהנתונים.
סוגי מפתחים
ספריית כלי המפתחים שלנו מחולקת לאפשרויות אלה למעט DevOps. לפני שנה DevOps כלים ספציפיים ל- WebRTC לא היו קיימים. אני מתחיל לשמוע יותר על זה ואני מצפה שזה יהיה מהותי יותר “כְּלִי” קטגוריה בעתיד הקרוב.
אמורים להיות מפתחים חזיתיים יותר מאשר אחורי. בכלל לא היו הרבה מפתחי אינטרנט טהורים של Frontend (ראו שולחנות זוגיים). WEBRTC בדרך כלל לא עובד ללא פיתוח של Backend איפשהו (חריג בולט בפרויקט WebRTC נטול השרת כאן). אתה יכול להטיל את זה ממישהו אחר אבל זה בדרך כלל מרמז על עלות מסוימת. פירוש הדבר יכול להיות ש- WebRTC עדיין קשה למפתחי החזית הטהורים ביותר.
כְּמוֹ כֵן, יָלִיד די רחוק ברשימה. מניסיוני, הילידים עדיין די קשה להסתדר בלי להפגיז קצת מזומנים עבור SDKs בתשלום. אָנוּ’תראה איך זה משתנה באנדרואיד עם Webrtc הילידים שמגיע לאנדרואיד-L מגיע.
זו הייתה השאלה היחידה שהייתה ריבוי בחירה, כלומר המשיבים יכלו לבחור כמה שיותר מתאימים. יותר מכל, הופתעתי לראות שרוב המשיבים עושים יותר מסוג פיתוח אחד, כאשר שליש רבים עושים 3 ומעלה:
סוגי DEV שנבחרו | הִיכים | יַקרָן |
1 | 41 | 42% |
2 | 22 | 23% |
3 | 25 | 26% |
4 | 3 | 3% |
5 | 6 | 6% |
ספירת המשיבים שבחרו יותר מסוג מפתח אחד לפי ספירה
זה גרם לי לסקרן שאלות כמו:
- האם מפתחים אחוריים מכירים סוגים שונים יותר של פיתוח מאשר מפתחים ילידים?
- אילו סוגי פיתוח נוטים להיות מעצבים של האחרים?
הנה הטבילה הצולבת המלאה:
אינטרנט Frontend | Backend Web | יָלִיד | טלקום | DevOps | |
אינטרנט Frontend | 100% | 84% | 32% | 29% | 23% |
Backend Web | 78% | 100% | 30% | 37% | 27% |
יָלִיד | 72% | 72% | 100% | 36% | 28% |
טלקום | 37% | 51% | 21% | 100% | 21% |
DevOps | 72% | 89% | 39% | 50% | 100% |
אחוז הנשאלים שבחרו יותר מסוג מפתח אחד לפי סוג המפתח
בהתבסס על מערך נתונים זה (ובהנחה של אמיתות), מפתחי DevOps נוטים להיות בעלי הכישורים ביותר בתחומים אחרים. מפתחים ילידים מכירים הרבה קדמי ואחורי.
ומה הייתה הקבוצה שהייתה הסבירה ביותר לציין רק מיומנות פיתוח אחת: טלקום; כמעט מחצית מהנשאלים בטלקום הרשומים “טלקום” בלי שום דבר אחר. המשיבים של טלקום הם צנועים או שהם צריכים לבשר את מערך המיומנות שלהם ביחס לבני גילם בקטגוריות אחרות.
סוג DEV | 1 | 2 | 3 | 4 | 5 | סכום סופי |
אינטרנט Frontend | 14% | 30% | 39% | 5% | 11% | 100% |
Backend Web | 10% | 33% | 42% | 5% | 10% | 100% |
טלקום | 47% | 12% | 21% | 7% | 14% | 100% |
יָלִיד | 20% | 8% | 40% | 8% | 24% | 100% |
DevOps | 11% | 0% | 50% | 6% | 33% | 100% |
מספר סוגי המפתחים שנבחרו כאחוז מסוג DEV סה”כ לפי סוג פיתוח
מסגרות קדמיות
זה היה לי באופן אישי וכמה חברים אחרים בצוות Webrtchacks באופן אישי סקרן. אחד מספרי הפרסים אחרי הכל הוא על זווית. לאחרונה אני משתמש ב- jQuery לפרויקטים שלי ותהיתי אם יש דרך טובה יותר כשאני מחשיב יישומים מתוחכמים יותר.
“אַחֵר” הייתה תגובה משמעותית כאן – בתוך אותה קבוצה הופיעה jQuery 4 פעמים (4%). שום דבר או מנהג לא צוין על ידי 8 (8%)
מסגרות וכלים אחוריים
ראשית, אנו מתנצלים על שהזנחתם לשים “אַחֵר” קטגוריה כאן. אפשרות אחרת הייתה צריכה להיות שם. בלי שיהיה לך “אַחֵר” אפשרות, קשה לחזות כמה היו בוחרים בזה, אך ניתן לומר שזה היה מוריד את התגובות עבור הפריטים לעיל לפחות בכמה נקודות אחוז.
אין הפתעות גדולות בתגובות לעיל, אבל הייתי סקרן לראות איך זה תואם את סוגי המפתחים השונים:
סוג מפתח | ||||||
מסגרת/ כלי | סה”כ | אינטרנט Frontend | Backend Web | יָלִיד | טלקום | DevOps |
צוֹמֶת.JS | 36% | 46% | 43% | 24% | 30% | 33% |
ג’אווה | 20% | 16% | 20% | 20% | 19% | 11% |
פיתון או מסילות | 14% | 13% | 12% | 16% | 16% | 22% |
כוכבית || FreeSwitch | 12% | 4% | 5% | 8% | 23% | 17% |
PHP | 10% | 14% | 13% | 20% | 5% | 6% |
.נֶטוֹ | 7% | 7% | 7% | 12% | 7% | 11% |
כרטיסייה חוצה של שאלת מסגרת/כלים לעומת. סוג המפתח המוצג כאחוז מסך העמוד
אין כאן מגמות ברורות מלבד העדפה כללית לצומת.JS. קצת הופתעתי לראות טלקום כל כך מקוטע – הייתי מצפה לאשכול חזק יותר סביב כלי טלקום מסורתיים יותר כמו ג’אווה וכוכבית/Freeswitch. זכור כי נתונים אלה הופכים מעט מוסתרים מכיוון ששאלת סוג המפתח היא רב-בחירה.
כלים ספציפיים WebRTC ו- XAAs
הייתה לנו גם שאלה של צורה חופשית שתאפשר למשיבים להזין את כל הכלים שהם משתמשים בהם. 86% מהנשאלים נכנסו למשהו. להלן פרט לכל הכלים שהוזכרו לא פעם:
WHO’הבא עבור Webrtc – כלומר, ספארי או iOS?
לא הרבה מה להוסיף כאן. אנו יכולים להמשיך לבדוק סטטוס.מוֹדֶרנִי.IE עבור האחרון ב- Internet Explorer. בהצלחה מנסה להבין מה אפל הולכת לעשות.
איך ללמוד על webrtc?
טוב לראות שיש לנו קהל נאמן עם WebrtChacks שנכנס ראשון �� . היו גם 4 “אַחֵר” תגובות (4%) עבור github. זה מזכיר לי להזכיר שהיישרתי את דף ה- WebrtChacks Github לפרויקטים שלי.
מחשבות סופיות
ההמראה העיקרית שלי הייתה:
- צוֹמֶת.JS, Angular ו- EasyRTC זוכים בתחרות הפופולריות הזו.
- DevOp.
- כישורי פיתוח טלקום מדורגים די נמוכים, אך לא נמוכים כמו התפתחות מקורית ו- DevOps
- כישורי טלקום הם המרוכזים ביותר – המשיבים שלנו עם כישורי טלקום צריכים להרחיב את מערכות מיומנות הפיתוח שלהם כך שיכללו יותר רשת
בהחלט הייתי רוצה לעשות זאת שוב בעתיד ולתת לו דחיפה גדולה יותר לשיפור שיעור התגובה. בינתיים אנחנו’אפקח את הסקר פתוח – אל תהסס לענות אם עדיין לא יש לך. אָנוּ’LL צ’ק-אין עליו מעת לעת ועדכן את הפוסט הזה לפי הצורך.
אם אתה רוצה לבצע ניתוח משלך או לראות כיצד אני חותך את הנתונים, אתה יכול להציג את התוצאות הגולמיות (פחות מידע מזהה) ואת קובץ העבודה שלי כאן.
אתה יכול גם לבדוק את Tsahi’פוסט על התוצאות כאן.
שוב תודה לכל המשיבים – התרומות שלך ממשיכות לעזור לקהילה WebRTC!