שיחות וידאו WebRTC: הגדרת ICE, TURN ו-SFU

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

פיתוח ותחזוקה של כל סוגי האתרים:

אתרי מידע או יישומי אינטרנט
אתרי תדמית, דפי נחיתה, אתרי חברה, קטלוגים מקוונים, חידונים, אתרי קידום, בלוגים, מקורות חדשות, פורטלי מידע, פורומים, אגרגטורים
אתרי מסחר אלקטרוני או יישומי אינטרנט
חנויות מקוונות, פורטלי B2B, שווקים, בורסות מקוונות, אתרי קאשבק, בורסות, פלטפורמות דרופשיפינג, מנתחי מוצרים
יישומי אינטרנט לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, פורטלים ארגוניים, מערכות ניהול ייצור, מנתחי מידע
אתרי שירות אלקטרוני או יישומי אינטרנט
פלטפורמות מודעות, בתי ספר מקוונים, בתי קולנוע מקוונים, בוני אתרים, פורטלים לשירותים אלקטרוניים, פלטפורמות אירוח וידאו, פורטלים נושאיים

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

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
שיחות וידאו WebRTC: הגדרת ICE, TURN ו-SFU
מורכב
~1-2 שבועות

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1502
  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1344
  • פיתוח אתר עבור BELFINGROUP
    פיתוח אתר עבור BELFINGROUP
    1052
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1306
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1049
  • פיתוח אתר לחברת FIXPER
    פיתוח אתר לחברת FIXPER
    1033

מדוע שיחות WebRTC דורשות גישה מקיפה?

WebRTC מספק API חזק לשיחות וידאו, אך פתרון מוכן לייצור דורש יותר מאשר RTCPeerConnection אחד. חיבור P2P ישיר נשבר לעיתים קרובות עקב NAT סימטרי: עד 15–20% מהשיחות לא מצליחות ליצור ערוץ ישיר. חומות אש ארגוניות שחוסמות UDP מוסיפות עוד 10–15% כשלונות. ללא המחסנית הנכונה (ICE, TURN, שרת איתות, SFU), שיחות נכשלות או מספקות איכות לא יציבה. אנחנו פותרים את הבעיות האלה: אנו מגדירים כל רכיב עבור התשתית הספציפית שלך כך ששיחות וידאו יעבדו ביציבות בכל רשת—מ-WiFi ביתי ועד VPN ארגוני.

RTCPeerConnection מנהל מועמדים ל-ICE, זרמי מדיה והצפנת DTLS-SRTP. אבל WebRTC עצמו אינו כולל החלפת הצעות SDP—נדרש שרת איתות. מחסנית ייצור טיפוסית:

רכיב אפשרויות
שרת איתות Socket.IO, WebSocket (Go/Node), Phoenix Channels
ICE/STUN coturn, Twilio STUN, Google STUN
שרת TURN coturn על VPS ייעודי, Twilio TURN, Xirsys
שרת מדיה (SFU) mediasoup, Janus, LiveKit, Jitsi Videobridge
ספריית לקוח RTCPeerConnection מקורי או simple-peer, mediasoup-client

ללא הגדרה נכונה של כל רכיב, שיחות יעבדו רק מקומית או ייכשלו מאחורי NAT. אנו משלבים WebRTC במפתח פתוח, ומבטיחים יציבות.

כיצד שרת TURN פותר את בעיית ה-NAT?

שרת STUN קובע את ה-IP החיצוני, אך עם NAT סימטרי הוא חסר תועלת. שרת TURN מעביר תעבורת מדיה כאשר P2P בלתי אפשרי. אנו פורסים coturn עם TLS על פורט 443. זה מגדיל את המעבר דרך פרוקסי ארגוניים פי 3 בהשוואה ל-TURN מבוסס UDP. הגדרה:

פריסת coturn עם TLS
# /etc/turnserver.conf
listening-port=3478
tls-listening-port=5349
realm=yourdomain.com
server-name=yourdomain.com
lt-cred-mech
use-auth-secret
static-auth-secret=YOUR_SECRET
total-quota=100
bps-capacity=0
stale-nonce=600
cert=/etc/letsencrypt/live/yourdomain.com/fullchain.pem
pkey=/etc/letsencrypt/live/yourdomain.com/privkey.pem

לעומסים גבוהים (100+ שיחות במקביל), אנו משתמשים באשכול coturn עם DNS round-robin. כל מופע מחזיק עד 100 שיחות.

מהו SFU ומתי הוא נדרש?

SFU (יחידת העברה סלקטיבית) הוא שרת מדיה שמעביר זרמים ללא ערבוב. בניגוד לטופולוגיית mesh (P2P), שבה 5 משתתפים יוצרים 10 חיבורים לכל לקוח, SFU מקבל זרם אחד ומעביר אותו לנמענים. עומס הלקוח מופחת פי 9 עם 10 משתתפים. אנו משתמשים ב-mediasoup או LiveKit בהתאם לדרישות הביצועים והגמישות.

פרמטר P2P (mesh) SFU
מקסימום משתתפים 4-6 50+
דרישות לקוח גבוהות (חיבורי n-1) נמוכות (חיבור אחד)
עומס שרת אפס בינוני
מורכבות נמוכה בינונית
הקלטת שיחות רק בצד הלקוח בצד השרת

SFU מאפשר לשרת פי 10 יותר משתתפים עם אותו רוחב פס.

שרת איתות: יישום ב-Node.js + Socket.IO

שרת האיתות מעביר הצעות SDP, תשובות ומועמדים ל-ICE בין משתתפים. דוגמה לקוד בצד השרת:

// server.js
io.on('connection', (socket) => {
  socket.on('join-room', (roomId, userId) => {
    socket.join(roomId);
    socket.to(roomId).emit('user-connected', userId);
    socket.on('offer', (offer, targetId) => {
      io.to(targetId).emit('offer', offer, socket.id);
    });
    socket.on('answer', (answer, targetId) => {
      io.to(targetId).emit('answer', answer, socket.id);
    });
    socket.on('ice-candidate', (candidate, targetId) => {
      io.to(targetId).emit('ice-candidate', candidate, socket.id);
    });
    socket.on('disconnect', () => {
      socket.to(roomId).emit('user-disconnected', userId);
    });
  });
});

הקוד הזה הוא הבסיס לשיחות P2P ו-SFU. שרת TURN עולה כ-$10–20 בחודש לפרויקט קטן, וחיסכון בתעבורה באמצעות Simulcast מגיע ל-50%.

צד הלקוח: RTCPeerConnection וניהול מדיה

בצד הלקוח, אנו יוצרים # /etc/turnserver.conf listening-port=3478 tls-listening-port=5349 realm=yourdomain.com server-name=yourdomain.com lt-cred-mech use-auth-secret static-auth-secret=YOUR_SECRET total-quota=100 bps-capacity=0 stale-nonce=600 cert=/etc/letsencrypt/live/yourdomain.com/fullchain.pem pkey=/etc/letsencrypt/live/yourdomain.com/privkey.pem עם שרתי ICE/TURN ומקבלים זרם מדיה:

const pc = new RTCPeerConnection({
  iceServers: [
    {
      urls: 'stun:stun.yourdomain.com:3478'
    },
    {
      urls: 'turn:turn.yourdomain.com:3478',
      username: generateTurnUsername(ttl),
      credential: generateTurnCredential(username, secret),
    },
  ],
  iceTransportPolicy: 'all',
});

const stream = await navigator.mediaDevices.getUserMedia({
  video: {
    width: { ideal: 1280 },
    height: { ideal: 720 },
    frameRate: { ideal: 30 }
  },
  audio: {
    echoCancellation: true,
    noiseSuppression: true,
    sampleRate: 48000
  },
});

stream.getTracks().forEach(track => pc.addTrack(track, stream));

כדי לשפר את האיכות, אנו משתמשים ב-Simulcast עם SFU—הלקוח שולח שלושה זרמים ברזולוציות שונות:

pc.addTransceiver(videoTrack, {
  direction: 'sendonly',
  sendEncodings: [
    { rid: 'low', maxBitrate: 150000, scaleResolutionDownBy: 4 },
    { rid: 'mid', maxBitrate: 500000, scaleResolutionDownBy: 2 },
    { rid: 'high', maxBitrate: 1500000 },
  ],
});

ה-SFU בוחר את השכבה המתאימה לכל מקלט, ומספק את האיכות הטובה ביותר תחת רוחב פס מוגבל. בנוסף, אנו עוקבים אחר מצב החיבור באמצעות מטפלי // server.js io.on('connection', (socket) => { socket.on('join-room', (roomId, userId) => { socket.join(roomId); socket.to(roomId).emit('user-connected', userId); socket.on('offer', (offer, targetId) => { io.to(targetId).emit('offer', offer, socket.id); }); socket.on('answer', (answer, targetId) => { io.to(targetId).emit('answer', answer, socket.id); }); socket.on('ice-candidate', (candidate, targetId) => { io.to(targetId).emit('ice-candidate', candidate, socket.id); }); socket.on('disconnect', () => { socket.to(roomId).emit('user-disconnected', userId); }); }); }); ו-RTCPeerConnection, ומיישמים התחברות מחדש אוטומטית במהלך כשלונות זמניים.

ניטור ואופטימיזציה

לאחר ההשקה, חשוב לעקוב אחר מדדי שיחות אמיתיים. אנו משתמשים ב-const pc = new RTCPeerConnection({ iceServers: [ { urls: 'stun:stun.yourdomain.com:3478' }, { urls: 'turn:turn.yourdomain.com:3478', username: generateTurnUsername(ttl), credential: generateTurnCredential(username, secret), }, ], iceTransportPolicy: 'all', }); const stream = await navigator.mediaDevices.getUserMedia({ video: { width: { ideal: 1280 }, height: { ideal: 720 }, frameRate: { ideal: 30 } }, audio: { echoCancellation: true, noiseSuppression: true, sampleRate: 48000 }, }); stream.getTracks().forEach(track => pc.addTrack(track, stream)); כדי לאסוף אינדיקטורים מרכזיים:

  • packetsLost – אחוז אובדן מנות; אם הוא עולה על 5%, אנו יוזמים הפחתת קצב סיביות אדפטיבית.
  • jitter – תנודתיות; אם >30ms, אנו עוברים לקודק אודיו Opus עם חביון נמוך יותר.
  • roundTripTime – RTT; RTT גבוה מצביע על צורך להחליף שרת TURN או נתיב.

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

מה כלול: תוצרים

לאחר היישום, אתה מקבל:

  • תיעוד ארכיטקטוני עם טופולוגיה, שרתים וזרימות;
  • קוד מקור של שרת האיתות ואינטגרציית הלקוח (מאגר Git);
  • גישה לשרת TURN (אישורים מוגבלים בזמן);
  • הכשרת צוות (מפגש של שעתיים על תפעול);
  • חודש אחד של תמיכה לאחר השחרור (ניטור באמצעות pc.addTransceiver(videoTrack, { direction: 'sendonly', sendEncodings: [ { rid: 'low', maxBitrate: 150000, scaleResolutionDownBy: 4 }, { rid: 'mid', maxBitrate: 500000, scaleResolutionDownBy: 2 }, { rid: 'high', maxBitrate: 1500000 }, ], }); , פתרון תקלות).

תהליך היישום ולוחות זמנים

יישום WebRTC מתבצע בחמישה שלבים:

  1. ניתוח – ביקורת על התשתית הקיימת, מקרי שימוש, עומס צפוי.
  2. עיצוב – בחירת טופולוגיה (P2P או SFU), שרתים, קודקים.
  3. יישום – הגדרת TURN/STUN, שרת איתות, אינטגרציית לקוח.
  4. בדיקות – בדיקות עומס, רשתות שונות, מכשירים ניידים.
  5. פריסה – עלייה לאוויר, ניטור באמצעות oniceconnectionstatechange.

לוחות זמנים:

  • שיחת וידאו P2P עם שרת איתות – 3 עד 5 ימים.
  • שיחות קבוצתיות באמצעות SFU – 2 עד 3 שבועות.
  • הקלטה ועיבוד לאחר – תוספת של שבוע.
  • פלטפורמת ועידות מלאה – 6 עד 10 שבועות.

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