![](https://habrastorage.org/files/aa9/3cf/050/aa93cf050df949499b04eae09665dc91.png)
èè ïŒã¢ã¬ã¯ãµã³ããŒã»ããªã·ã¥ãã§ã³ã³
趣å³ã«ã€ããŠã話ããŸã-WebRTCãã¯ãããžãŒïŒWebãªã¢ã«ã¿ã€ã éä¿¡-ãªã¢ã«ã¿ã€ã Webéä¿¡ïŒã䜿çšããŠããã©ãŠã¶ãŒã§ãããªæŸéãæŽçããŸãã Googleã¯2012幎ãããã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ããç©æ¥µçã«éçºããŠãããæåã®å®å®çãªãªãŒã¹ã¯2013幎ã«ç»å ŽããŸãããçŸåšãWebRTCã¯ãSafariãé€ããæãäžè¬çãªææ°ã®ãã©ãŠã¶ãŒã§æ¢ã«ååã«ãµããŒããããŠããŸãã
WebRTCãã¯ãããžãŒã䜿çšãããšãP2PããŒã¹ã§2人以äžã®ãŠãŒã¶ãŒéã®ãããªäŒè°ãæé ã§ããŸãã ãããã£ãŠããŠãŒã¶ãŒéã®ããŒã¿ã¯ãµãŒããŒãä»ããã«çŽæ¥éä¿¡ãããŸãã ãã ãããŸã ãµãŒããŒãå¿ èŠã§ãããããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã ãŸããWebRTCã¯ãã©ãŠã¶ã§åäœããããã«èšèšãããŠããŸãããWebRTCæ¥ç¶ã䜿çšã§ããããã«ããããŸããŸãªãã©ãããã©ãŒã çšã®ã©ã€ãã©ãªããããŸãã
WebRTCã䜿çšããå Žåã次ã®åé¡ã解決ããŸãã
- ãµãŒããŒã®ã¡ã³ããã³ã¹ã³ã¹ããåæžããŸãã ãµãŒããŒã¯ãæ¥ç¶ãåæåãããŠãŒã¶ãŒãçžäºã«ãããã¯ãŒã¯æ å ±ã亀æããããã«ã®ã¿å¿ èŠã§ãã ãŸãããŠãŒã¶ãŒã®æ¥ç¶ããã³åæã«é¢ããéç¥ãªã©ã®ã€ãã³ããéä¿¡ããããã«ã䜿çšãããŸãïŒåã¯ã©ã€ã¢ã³ãã®æ å ±ãææ°ã«ãªãããã«ïŒã
- ããŒã¿è»¢éé床ãäžãããããªãšãµãŠã³ãã®éä¿¡ã®é 延ãæžãããŸããçµå±ããµãŒããŒã¯å¿ èŠãããŸããã
- ããŒã¿ã®ãã©ã€ãã·ãŒã匷åããŸã ãããŒã¿ã¹ããªãŒã ãééãããµãŒãããŒãã£ã¯ãããŸããïŒãã¡ããããããã¯ãŒã¯ã«å ¥ãåã«ããŒã¿ãééããã²ãŒããŠã§ã€ãé€ããŸãïŒã
æ¥ç¶ã®åæå
JavaScriptã»ãã·ã§ã³ç¢ºç«ãããã³ã«
æ¥ç¶ã¯ãJavaScriptã»ãã·ã§ã³ç¢ºç«ãããã³ã«ã䜿çšããŠåæåãããŸã-çŸåšããã®ãœãªã¥ãŒã·ã§ã³ã®ä»æ§ã説æãããã©ããã®ã¿ããããŸãã 以äžã«ã€ããŠèª¬æããŸãã
- ãµãŒããŒã«æ¥ç¶ããããã»ã¹ã
- æ°ãããŠãŒã¶ãŒã®äžæã®ããŒã¯ã³ãçæããŸããããã«ãããããã¯ãšã³ãã§ãŠãŒã¶ãŒãèå¥ã§ããŸãã
- ãŠãŒã¶ãŒã«äŒè©±ã«ã¢ã¯ã»ã¹ããããã®ããŒãååŸãã-ã·ã°ããªã³ã°ã
- 2人ã®ãŠãŒã¶ãŒãæ¥ç¶ããããã®RTCStreamConnectionåæåã
- æ°ããåå è ã«é¢ãããããŒããã£ã¹ãã¡ãã»ãŒãžã®äŒè©±ã®ãã¹ãŠã®åå è ã«ããåä¿¡ã
æ°ããåå è ã¯ã次ã®ããã«ãããªäŒè°ã«æ¥ç¶ããŸãããã§ã«ãããªäŒè°ã«åå ããŠãããšããã¡ãã»ãŒãžããã®ãŠãŒã¶ãŒã«éä¿¡ãããŠãŒã¶ãŒã¯æ¥ç¶èŠæ±ãéä¿¡ããŸãã åæã«ããã¹ãŠã®äŒè°åå è ã«æ å ±ãéä¿¡ããŠãæ°ãããŠãŒã¶ãŒãšæ¥ç¶ããŸãã
ã©ã®ããã«æ©èœããŸããïŒ ã¯ã©ã€ã¢ã³ããã¡ãã£ã¢ããŒã¿ãçŽæ¥äº€æã§ãããã©ãŠã¶ã¬ãã«ããããã¯ã©ã€ã¢ã³ãéã®å¯Ÿè©±ã®æ®ãã®éšåãè¡ãããã·ã°ããªã³ã°ãµãŒããŒã¬ãã«ããããŸãã
![](https://habrastorage.org/files/b6d/474/115/b6d474115a324341a5b80afae800721e.png)
ã»ãã·ã§ã³èšè¿°ãããã³ã«
ç¹å®ã®ãŠãŒã¶ãŒã«é¢ããæ å ±ãèšè¿°ã§ããã»ãã·ã§ã³èšè¿°ãããã³ã«ïŒSDP-Session Description ProtocolïŒã«ã¯ãæ¿èªãããä»æ§RFC 4556ãæ¢ã«ãããŸã ã
SDPã§ã¯ã次ã®ãã©ã¡ãŒã¿ãŒã«ã€ããŠèª¬æããŠããŸãã
![](https://habrastorage.org/files/d99/34f/dc9/d9934fdc90a248ae857123e2c50fbc36.png)
- v =ïŒãããã³ã«ããŒãžã§ã³ãçŸåšãããŒãžã§ã³ã¯åžžã«0ã§ãïŒã
- o =ïŒäœæè /ææè ããã³ã»ãã·ã§ã³èå¥åïŒ;
- s =ïŒã»ãã·ã§ã³åã空ã«ããããšã¯ã§ããŸããïŒ;
- i = *ïŒã»ãã·ã§ã³æ å ±ïŒ;
- u = *ïŒè¿œå ã®ã»ãã·ã§ã³æ å ±ã§WWWã¯ã©ã€ã¢ã³ãã䜿çšããURLïŒ;
- e = *ïŒäŒè°ã®è²¬ä»»è ã®é»åã¡ãŒã«ïŒ;
- p = *ïŒäŒè°ã®è²¬ä»»è ã®é»è©±çªå·ïŒ;
- c = *ïŒãã¹ãŠã®ã¡ãã£ã¢ããŒã¿ã®èª¬æãããå Žåãæ¥ç¶ã®æ å ±ã¯å¿ èŠãããŸããïŒ;
- b = *ïŒéä¿¡ãã£ãã«ã®å æ垯åå¹ ã«é¢ããæ å ±ïŒ;
- æéãã©ã¡ãŒã¿ãŒã®èª¬æãå«ã1è¡ä»¥äžïŒä»¥äžã®äŸãåç §ïŒã
- z = *ïŒã¿ã€ã ãŸãŒã³ã®èšå®ïŒ;
- k = *ïŒæå·åããŒïŒ;
- a = *ïŒã»ãã·ã§ã³ã®å±æ§ã説æãã1è¡ä»¥äžã以äžãåç §ïŒã
ã¯ã©ã€ã¢ã³ãã«é¢ããSDPæ å ±ã¯æ¬¡ã®ããã«ãªããŸãã
察話åæ¥ç¶ç¢ºç«ïŒICEïŒ
ICEãã¯ãããžãŒã«ããããã¡ã€ã¢ãŠã©ãŒã«ã®å åŽã«ãããŠãŒã¶ãŒãæ¥ç¶ã§ããŸãã 次ã®4ã€ã®ä»æ§ãå«ãŸããŸãã
- RFC 5389ïŒNATïŒ STUN ïŒã®ã»ãã·ã§ã³ãã©ããŒã¹ãŠãŒãã£ãªãã£ã
- RFC 5766ïŒNATïŒ TURN ïŒåšèŸºã®ãªã¬ãŒã䜿çšãããã©ããŒãµã«ïŒSTUNãžã®ãªã¬ãŒæ¡åŒµã
- RFC 5245ïŒInteractive Connectivity EstablishmentïŒ ICE ïŒïŒãªãã¡ãŒ/ã¢ã³ãµãŒãããã³ã«ã®NATãã©ããŒãµã«çšãããã³ã«ã
- RFC 6544ïŒå¯Ÿè©±åæ¥ç¶ç¢ºç«ïŒICEïŒã䜿çšããTCPåè£
STUNã¯ãVoIPã«ç©æ¥µçã«äœ¿çšãããã¯ã©ã€ã¢ã³ã/ãµãŒããŒãããã³ã«ã§ãã ããã§ã¯ãSTUNãµãŒããŒãåªå é äœãšèŠãªãããŸããããã«ãããUDPãã©ãã£ãã¯ãã«ãŒãã£ã³ã°ã§ããŸãã STUNãµãŒããŒã䜿çšã§ããªãå ŽåãWebRTCã¯TURNãµãŒããŒãžã®æ¥ç¶ãè©Šã¿ãŸãã ãªã¹ãã«ã¯ãICEèªäœã®RFCããã³TCPåè£ã®RFCããããŸãã
WebRTCã®ICEãµãŒããŒã®ã¯ã©ã€ã¢ã³ãå®è£ ã¯ãã§ã«ã€ã³ã¹ããŒã«ãããŠãããããè€æ°ã®STUNãŸãã¯TURNãµãŒããŒãç°¡åã«æå®ã§ããŸãã ããã«ããã®ããã«ã¯ãåæåäžã«ãé©åãªãã©ã¡ãŒã¿ãŒã䜿çšããŠãªããžã§ã¯ããæž¡ãã ãã§ååã§ãïŒåŸã§äŸã瀺ããŸãïŒã
GetUserMedia API
WebRTC APIã®æãèå³æ·±ãéšåã®1ã€ã¯GetUserMedia APIã§ãããã®APIã䜿çšãããšãã¯ã©ã€ã¢ã³ãããçŽæ¥ãªãŒãã£ãªããã³ãããªæ å ±ããã£ããã£ããä»ã®ãã¢ã«ãããŒããã£ã¹ãã§ããŸãã ãã®APIã¯Googleãç©æ¥µçã«å®£äŒããŠããããã2014幎ã®çµãã以æ¥ããã³ã°ã¢ãŠãã¯WebRTCã«ãã£ãŠå®å šã«åŒ·åãããŠããŸãã GetUserMediaã¯ãChromeãFirefoxãOperaã§ãå®å šã«æ©èœããŸãã IEã§WebRTCãæäœã§ããããã«ããæ¡åŒµæ©èœããããŸãã Safariã¯ãã®ãã¯ãããžãŒããµããŒãããŠããŸããã
æè¿ãªãªãŒã¹ãããå¶éã«ãããšãChromeã®GetUserMedia APIã¯ããŒã³ã³ãµãŒããŒäžã®HTTPSã§ã®ã¿æ©èœããããšã«æ³šæããããšãéèŠã§ãã ãããã£ãŠãHTTPãµãŒããŒäžã®ãããã¯ãŒã¯ã«ããå€ãã®äŸã¯ããŸããããŸããã
èå³æ·±ãããšã«ãç»é¢ã®ãããŒããã£ã¹ããèš±å¯ããããã«GetUserMedia APIã䜿çšãããŠããŸããããçŸåšããã¯äžå¯èœã§ã-ã¢ããªã³ã䜿çšããã«ã¹ã¿ã ãœãªã¥ãŒã·ã§ã³ã®ã¿ãããããéçºæã«Firefoxã§å¯Ÿå¿ãããã©ã°ãæå¹ã«ããããšãã§ããŸãã
GetUserMediaã«ã¯æ¬¡ã®æ©èœããããŸãã
- ãããªã¹ããªãŒã ã®æå°ããçæ³ããããã³æ倧解å床ã®éžæãããã¯ãæ¥ç¶é床ã«å¿ããŠãããªã®è§£å床ãå€æŽã§ããããšãæå³ããŸãã
- é»è©±ã®ã«ã¡ã©ã®ãããããéžæããæ©èœã
- ãã¬ãŒã ã¬ãŒããæå®ããæ©èœã
ãããã¯ãã¹ãŠèšå®ãéåžžã«ç°¡åã§ãã GetUserMedia APIãåŒã³åºããšããaudioããšãvideoããšãã2ã€ã®ããããã£ãæã€ãªããžã§ã¯ããããã«æž¡ããŸãã
{ audio: true, video: { width: 1280, height: 720 } }
ãããªã§ã¯ããtrueããæå®ã§ããŸã-ããã©ã«ãã§èšå®ãããŸãã falseã®å ŽåããªãŒãã£ãªãŸãã¯ãããªã¯ãã¥ãŒããããŸãã ãããªãèšå®ã§ããŸã-å¹ ãšé«ããæå®ããŸãã ãŸãã¯ãããšãã°ãæå°å¹ ãçæ³å¹ ãæå€§å¹ ãèšå®ã§ããŸãã
width: { min: 1280 }
width: { min: 1024, ideal: 1280, max: 1920 }
ãããŠã䜿çšãããã«ã¡ã©ãéžæããŸãïŒããŠãŒã¶ãŒã-åé¢ããç°å¢ã-èé¢ïŒïŒ
video: { facingMode: "user" }
video: { facingMode: "environment" }
ãŸããæ¥ç¶é床ãšã³ã³ãã¥ãŒã¿ãŒãªãœãŒã¹ã«å¿ããŠéžæãããæå°ãçæ³ãããã³æ倧ãã¬ãŒã ã¬ãŒããæå®ããããšãã§ããŸãã
video: { frameRate: { ideal: 10, max: 15 }
ãããã¯ãGetUserMedia APIã®æ©èœã§ãã äžæ¹ããããªããã³ãªãŒãã£ãªã¹ããªãŒã ã®ãããã¬ãŒãã決å®ããæ©èœãšãå®éã«éä¿¡ãããåã«äœããã®æ¹æ³ã§ã¹ããªãŒã ãæäœããæ©èœãæããã«æ¬ ããŠããŸãã ãŸãããã¡ããã以åã«ååšããŠããç»é¢ããããŒããã£ã¹ãããæ©äŒãè¿ãããšã¯å®³ã«ãªããŸããã
WebRTCã®æ©èœ
WebRTCã䜿çšãããšããªãŒãã£ãªã³ãŒããã¯ãšãããªã³ãŒããã¯ãå€æŽã§ããŸãããããã¯ãéä¿¡ãããSDPæ å ±ã§çŽæ¥æå®ã§ããŸãã äžè¬ã«ãWebRTCã¯G711ãšOPUSã®2ã€ã®ãªãŒãã£ãªã³ãŒããã¯ïŒãã©ãŠã¶ãŒã«å¿ããŠèªåçã«éžæãããŸãïŒãããã³VP8ãããªåœ¢åŒïŒHTML5ãããªã«æé©ãªGoogleã®WebMïŒã䜿çšããŸãã
WebRTCãã¯ãããžãŒã¯ãChromium 17 +ãOpera 12 +ãFirefox 22+ã§ããçšåºŠãµããŒããããŠããŸãã ä»ã®ãã©ãŠã¶ãŒã®å Žåãwebrtc4allæ¡åŒµæ©èœã䜿çšã§ããŸãããå人çã«ã¯Safariã§å®è¡ã§ããŸããã§ããã WebRTCããµããŒãããC ++ã©ã€ãã©ãªããããŸããããã¯ããããããä»åŸãã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ã®åœ¢ã§WebRTCå®è£ ãèŠãããšãã§ããããšã瀺åããŠããŸãã
ã»ãã¥ãªãã£ã確ä¿ããããã«ãRFC 6347ã§èª¬æãããŠãããã©ã³ã¹ããŒãå±€ã»ãã¥ãªãã£ãããã³ã«ã§ããDTLSã䜿çšãããŸãããŸããåè¿°ã®ããã«ãNATããã³ãã¡ã€ã¢ãŠã©ãŒã«ã®èåŸã«ãããŠãŒã¶ãŒã®æ¥ç¶ã«ã¯TURNããã³STUNãµãŒããŒã䜿çšãããŸãã
ã«ãŒãã£ã³ã°
次ã«ãSTUNãšTURNã䜿çšããŠã«ãŒãã£ã³ã°ãã©ã®ããã«è¡ããããã詳ããèŠãŠã¿ãŸãããã
ãªã¬ãŒNATã䜿çšãããã©ããŒãµã« ïŒ TURN ïŒã¯ãNATãŸãã¯ãã¡ã€ã¢ãŠã©ãŒã«ã®èåŸã«ãããã¹ããTCPãŸãã¯UDPæ¥ç¶ãä»ããŠçä¿¡ããŒã¿ãåä¿¡ã§ããããã«ãããããã³ã«ã§ãã ããã¯å€ããã¯ãããžãŒã§ãããããåªå é äœã¯NATã®ã»ãã·ã§ã³ãã©ããŒãµã«ãŠãŒãã£ãªãã£ïŒ STUN ïŒ -UDPæ¥ç¶ã®ã¿ã確ç«ã§ãããããã¯ãŒã¯ãããã³ã«ã䜿çšããããšã§ãã
ãã©ãŒã«ããã¬ã©ã³ã¹ã確ä¿ããããã«ãè€æ°ã®STUNãµãŒããŒãéžæããããšãã§ããŸãããããè¡ãæ¹æ³ã¯ã æé ã«ç€ºãããŠããŸã ã ãŸãã ãã㧠STUNãµãŒããŒãšTURNãµãŒããŒãžã®æ¥ç¶ããã¹ãã§ããŸã ã
STUNããã³TURNãµãŒããŒã¯æ¬¡ã®ããã«æ©èœããŸãã å éšIPãšãã¡ã€ã¢ãŠã©ãŒã«ãä»ãããããã¯ãŒã¯ãžã®å€éšã¢ã¯ã»ã¹ãæã€2ã€ã®ã¯ã©ã€ã¢ã³ãããããšããŸãã
![](https://habrastorage.org/files/010/83e/ed0/01083eed0d6b4192858dd20155813187.png)
ããã2ã€ã®ã¯ã©ã€ã¢ã³ããæ¥ç¶ããŠãã¹ãŠã®ããŒãããªãã€ã¬ã¯ãããã«ã¯ãSTUNãµãŒããŒãšTURNãµãŒããŒã䜿çšããå¿ èŠããããŸãããã®åŸãå¿ èŠãªæ å ±ããŠãŒã¶ãŒã«éä¿¡ãããã³ã³ãã¥ãŒã¿ãŒéã§çŽæ¥æ¥ç¶ã確ç«ãããŸãã
ICEãµãŒããŒãæäœããããã®ã¢ã«ãŽãªãºã
- RTCPeerConnectionã®åæåæã«STUNãµãŒããŒãžã®ã¢ã¯ã»ã¹ãæäŸããŸãã ãããªãã¯STUNãµãŒããŒã䜿çšã§ããŸãïŒããšãã°ãGoogleããïŒã
- æ¥ç¶åæåã€ãã³ãããªãã¹ã³ããæåããå Žåã¯ãã¹ããªãŒã 転éãéå§ããŸãã
- ãšã©ãŒãçºçããå ŽåãTURNãµãŒããŒãžã®èŠæ±ãå®è¡ãããããä»ããŠã¯ã©ã€ã¢ã³ããæ¥ç¶ããããšããŸãã
- TURNãµãŒããŒã®ååãªåž¯åå¹ ã«æ³šæããŠãã ããã
ãããªã¹ããªãŒã ã®ããã©ãŒãã³ã¹ãšé床
- 30 FPSã§720pïŒ1.0ã2.0 Mbps
- 30 FPSã§360pïŒ0.5ã1.0 Mbps
- 30 FPSã§180pïŒ0.1ã0.5 Mbps
ãããªãããŒããã£ã¹ãã«å²ãåœãŠãå¿ èŠãããWebRTCãã©ãã£ãã¯ã¯ãWebRTCã®ããã©ãŒãã³ã¹ã«æ倧ã®åœ±é¿ãåãŒããŸãã 2人ã®ãŠãŒã¶ãŒã®ã¿ããããŒããã£ã¹ãã«åå ããå Žåãå°ãªããšãFullHDãåé¡ãªãæŽçã§ããŸãã20人ã®ãããªäŒè°ã®å Žåãåé¡ãçºçããŸãã
ããšãã°ãMacBook Air 2015ïŒ4 GBã®RAMã2 GHzã®Core iããã»ããµãŒïŒã§åŸãããçµæã§ãã GetUserMediaå®è£ ã®ã¿ãããã»ããµã11ïŒ èªã¿èŸŒã¿ãŸãã Chrome-Chromeæ¥ç¶ãåæåããããšã3ã€ã®ChromeïŒ70ïŒ ã4ïŒãå®å šãªããã»ããµè² è·ã§ããã5çªç®ã®ã¯ã©ã€ã¢ã³ããæ¢ã«ãã¬ãŒãã«ã€ãªããå Žåãããã»ããµã¯æ¢ã«50ïŒ ã§ããŒããããWebRTCã¯æçµçã«ã¯ã©ãã·ã¥ããŸãã ãã¡ãããã¢ãã€ã«ãã©ãŠã¶ãŒã§ã¯ããã«æªãããšã§ãã2人ã®ãŠãŒã¶ãŒããæ¥ç¶ã§ããŸããã§ããã3人ç®ã®ãŠãŒã¶ãŒãæ¥ç¶ããããšãããšããã¹ãŠãé ããªããæ¥ç¶ãåæãããŸããã
ããã¯ã©ã®ããã«å¯ŸåŠã§ããŸããïŒ
ã¹ã±ãŒãªã³ã°ãšåé¡è§£æ±º
ã§ã¯ãäœããããŸããïŒ äŒè°ã®ãŠãŒã¶ãŒããšã«ãUDPæ¥ç¶ãéããŠããŒã¿ã転éããå¿ èŠããããŸãã ãã®çµæãé³å£°ä»ã480pãããªããããŒããã£ã¹ãããã«ã¯ã1人ã®ãŠãŒã¶ãŒã1ã2ã¡ãã®ãããåæ¹åéä¿¡ã®å Žåã¯2ã4ã¡ã¬ããããå¿ èŠã§ãã æŸéçšéã«éãè² è·ãããããŸãã
ããã©ãŒãã³ã¹ã®åé¡ã¯ããããã·ãµãŒããŒïŒãªã¬ãŒïŒã䜿çšããããšã§è§£æ±ºãããŸãããããã·ãµãŒããŒã¯ãäŒè°ã®å Žåã¯ãããŒããã£ã¹ã¿ãŒããããŒã¿ãåä¿¡ããä»ã®å šå¡ã«é ä¿¡ããŸãã å¿ èŠã«å¿ããŠã1ã€ã®ãµãŒããŒã§ã¯ãªããè€æ°ã®ãµãŒããŒã䜿çšã§ããŸãã
ãŸãããããªãããŒããã£ã¹ããè¡ãå Žåãå€ãã®åé·ãªã¯ã©ã€ã¢ã³ãæ å ±ãéä¿¡ããããšãèæ ®ãã䟡å€ããããŸãããããã¯æåŠã§ããŸãã ããšãã°ãã³ãŒã¹ãå®æœãããšããä»ã®äººããã®ãããªã ãã§ãªããã¡ãã»ãŒãžã ãã§ããé³ã ããå¿ èŠãªå ŽåããããŸãã ãŸããã¢ã¯ãã£ããªã¹ããŒã«ãŒãå€æŽããåŸãæ¥ç¶ã®1ã€ãäžæããã¹ããªãŒã ã§åä¿¡ããæ å ±ã®çš®é¡ãå€æŽããŠããåæ¥ç¶ããã®ãçã«ããªã£ãŠããå ŽåããããŸãã ããã«ããããããã¯ãŒã¯è² è·ãæé©åã§ããŸãã
ãœãããŠã§ã¢ã®å¶éãèæ ®ããããšãéèŠã§ãã1ã€ã®WebRTCã€ã³ã¹ã¿ã³ã¹ã«æ¥ç¶ã§ãããã¢ã¯256åãŸã§ã§ãã é ããæ©ãããããã€ãã®ãµãŒããŒãäžç·ã«æ¥ç¶ããå¿ èŠããããããããã«ãããããšãã°ã¹ã±ãŒãªã³ã°ã®ããã«Amazonã®å·šå€§ã§é«äŸ¡ãªã€ã³ã¹ã¿ã³ã¹ã䜿çšããããšãã§ããªããªããŸãã
CreateOffer API
ã©ã®ããã«æ©èœããŸããïŒ éä¿¡ããSDPããŒã¿ãäœæã§ããCreateOfferïŒïŒAPIããããŸãã
![](https://habrastorage.org/files/ee3/d78/f60/ee3d78f608ad4cd99f818de3949bfa44.png)
CreateOfferã¯ãããã¹ã§ãããªãã¡ãŒãäœæããåŸãlocalDescriptionãçŽæ¥ååŸãããªãã¡ãŒããã®äžã«å ¥ããŠãããã«SDPãã£ãŒã«ããšããŠäœ¿çšã§ããŸãã sendToServerã¯ããã·ã³ã®ååïŒååïŒãã¿ãŒã²ãããã·ã³ã®ååïŒã¿ãŒã²ããïŒãã¿ã€ããªãã¡ãŒãããã³SDPãæžã蟌ãŸããŠãããµãŒããŒã«èŠæ±ããããã®æœè±¡é¢æ°ã§ãã
ãµãŒããŒã«ã€ããŠå°ãèšããããšæããŸãããããã®ç®çã®ããã«ãWebSocketã䜿çšããããšã¯éåžžã«äŸ¿å©ã§ãã 誰ããæ¥ç¶ãããšããã«ãã€ãã³ããçºè¡ããŠãªã¹ããŒãè¿œå ã§ããŸãã ã¯ã©ã€ã¢ã³ããšäžç·ã«ã€ãã³ããå ¬éããããšãéåžžã«ç°¡åã§ãã
åäœäžã®GetUserMedia API
å®éã«ã¯ããã¹ãŠãå°ãã·ã³ãã«ã«ããããšãã§ããŸã-GetUserMedia APIã䜿çšã§ããŸãã åŒã³åºãã®åæåã¯æ¬¡ã®ããã«ãªããŸãã
![](https://habrastorage.org/files/12e/17f/12e/12e17f12ee4449b99a2b88c65fa37112.png)
ããã§ã¯ããããªãšãµãŠã³ãã®äž¡æ¹ãéä¿¡ããŸãã åºåã§ã¯ãmediaStreamãªããžã§ã¯ãïŒãããããŒã¿ã¹ããªãŒã ïŒãåãå ¥ãããããã¹ãååŸããŸãã
ãããŠãç§ãã¡ã¯é»è©±ã«åºãŸãïŒ
![](https://habrastorage.org/files/cc3/bf3/a26/cc3bf3a26ca34fd486518786f7375663.png)
誰ããé»è©±ã«åºãããšããç§ãã¡ã®ãªãã¡ãŒãåãåããŸãïŒgetRemoteOfferã¯ããµãŒããŒããããŒã¿ãåãåãæœè±¡é¢æ°ã§ãïŒã 次ã«ãGetUserMediaãã¹ããªãŒãã³ã°ãéå§ããonaddstreamãšaddstreamã«ã€ããŠæ¢ã«èª¬æããŸããã setRemoteDescription-ãããRTCçšã«åæåããoffer'aãšããŠæå®ããåçïŒanswerïŒãéä¿¡ããŸãã åçãéä¿¡...âããã§ã¯ããµãŒããŒãžã®ãªãã¡ãŒã®éä¿¡ããã»ã¹ã«ã€ããŠèª¬æããŸãããã®åŸããã©ãŠã¶ãŒéã®æ¥ç¶ã確ç«ããããããŒããã£ã¹ããéå§ãããŸãã
WebRTCã®ã¯ã©ã€ã¢ã³ããµãŒããŒã¢ãŒããã¯ãã£
ãµãŒããŒå šäœãã¹ã±ãŒãªã³ã°ãããšãã©ã®ããã«èŠããŸããïŒ éåžžã®ã¯ã©ã€ã¢ã³ã/ãµãŒããŒã¢ãŒããã¯ãã£ã®ããã«ïŒ
![](https://habrastorage.org/files/b27/57c/e83/b2757ce83ae443ca98419c41ca65f0a0.png)
ãããŒããã£ã¹ããšã¹ããªãŒã ãäžç¶ããWebãµãŒããŒãšã®éã«WebSocketæ¥ç¶ãšRTCPeerConnectionããããŸãã æ®ãã¯RTCPeerConnectionsãã»ããã¢ããããŸãã ãããŒããã£ã¹ãã«é¢ããæ å ±ã¯ããŒãªã³ã°ã«ãã£ãŠååŸã§ããWebSocketæ¥ç¶ã®æ°ãç¯çŽã§ããŸãã
ãã®ãããªã¢ãŒããã¯ãã£ãæ¡åŒµããæ¹æ³ã¯ããŸãå€ããªãããã¹ãŠäŒŒãŠããŸãã ã§ããããšïŒ
- ãµãŒããŒã®æ°ãå¢ãããŸãã
- ã¿ãŒã²ãããªãŒãã£ãšã³ã¹ãæãæ··éãããšãªã¢ã«ãµãŒããŒãé 眮ããŸãã
- éå°ãªçç£æ§ãæäŸããããã«ãçµå±ã®ãšããããã®æè¡ã¯äŸç¶ãšããŠæŽ»çºã«éçºãããŠããããã誀åäœãçºçããå¯èœæ§ããããŸãã
èé害æ§ãé«ãã
第äžã«ããã©ãŒã«ããã¬ã©ã³ã¹ãåäžãããã«ã¯ãããŒã³ã³ãµãŒããŒãšãªã¬ãŒãµãŒããŒãåé¢ããããšãçã«ããªã£ãŠããŸãã ã¯ã©ã€ã¢ã³ãã«é¢ãããããã¯ãŒã¯æ å ±ãé ä¿¡ããWebSocketãµãŒããŒã䜿çšã§ããŸãã äžç¶ãµãŒããŒã¯WebSocketãµãŒããŒãšéä¿¡ããããèªäœãéããŠã¡ãã£ã¢ã¹ããªãŒã ããããŒããã£ã¹ãããŸãã
ããã«ãåªå 床ã®é害ãçºçããå Žåã«ããããããŒããã£ã¹ããµãŒããŒããå¥ã®ãããŒããã£ã¹ããµãŒããŒã«ãã°ããåãæ¿ããæ©èœãç·šæã§ããŸãã
極端ãªå ŽåããããŒããã£ã¹ããµãŒããŒã«é害ãçºçããå Žåã«ãŠãŒã¶ãŒéã®çŽæ¥æ¥ç¶ã確ç«ããå¯èœæ§ãæ³å®ããããšã¯å¯èœã§ãããããã¯äŒè°ã«åå ãã人ãã»ãšãã©ããªãå ŽåïŒ10人æªæºïŒã«ã®ã¿é©ããŠããŸãã
ã¡ãã£ã¢ã¹ããªãŒã 衚瀺
ã¯ã©ã€ã¢ã³ãéã§äº€æããããããŒã衚瀺ããæ¹æ³ã®äŸã次ã«ç€ºããŸãã
![](https://habrastorage.org/files/4c1/2ec/f9c/4c12ecf9c057496a82d3fabac0504573.png)
onaddstream-ãªã¹ããŒãè¿œå ããŸãã ãªã¹ããŒãè¿œå ãããããvideoèŠçŽ ãäœæãããã®èŠçŽ ãããŒãžã«è¿œå ããŠããœãŒã¹ãšããŠã¹ããªãŒã ãæå®ããŸãã ã€ãŸããããããã¹ãŠããã©ãŠã¶ãŒã§è¡šç€ºããã«ã¯ãåä¿¡ããã¹ããªãŒã ãšããŠãœãŒã¹HTML5ãããªãæå®ããã ãã§ãã ãã¹ãŠãéåžžã«ç°¡åã§ãã
åŒã³åºããçµäºããå ŽåïŒendCallã¡ãœããïŒããããªèŠçŽ ã調ã¹ããããã®ãããªãåæ¢ãããã¢æ¥ç¶ãéããŠãã¢ãŒãã£ãã¡ã¯ããããªãŒãºããªãããã«ããŸãã ãšã©ãŒãçºçããå Žåãåãæ¹æ³ã§åŒã³åºããçµäºããŸãã
䟿å©ãªã©ã€ãã©ãª
æåŸã«ãWebRTCãæäœããããã«äœ¿çšã§ããã©ã€ãã©ãªã æ°åè¡ã§ç°¡åãªã¯ã©ã€ã¢ã³ããæžãããšãã§ããŸãïŒ
- ã·ã³ãã«ãªãã¢-ç§ã¯ãã®ã©ã€ãã©ãªãæ¬åœã«å¥œãã§ãã2人ã®ãŠãŒã¶ãŒéã®æ¥ç¶ãäœæããåé¡ã解決ããŸãã
- Easyrtc-ãããªäŒè°ãäœæã§ããŸãã
- SimpleWebRTCãåæ§ã®ã©ã€ãã©ãªã§ãã
- js-platform / p2pã
- node-webrtc-ã©ã€ãã©ãªã«ãããããŒã³ã³ãµãŒããŒãæŽçã§ããŸãã