ãã®èšäºã§ã¯ããã©ãŠã¶ãŒãããªããŒã¿ãŒãµãŒããŒãä»ããŠãã«ããŠãŒã¶ãŒWebRTCãããªãããŒããã£ã¹ããéçºããæ¹æ³ã«ã€ããŠèª¬æããŸãã ãããŒããã£ã¹ãã¯ãGoogle Chromeãã©ãŠã¶ãŒãšéåžžã®USB Webã«ã¡ã©ããéä¿¡ãããŸãã ãããªããããŒããã£ã¹ãããããã«ãå¥åã®HTMLããŒãžStreamerãäœæããããã¬ãŒã€ãŒã®HTMLããŒãžãåçãããŸãã
æŸéã¹ããŒã
Browser1-ãããŒããã£ã¹ãã ãµãŒããŒã«æ¥ç¶ããWebã«ã¡ã©ãããããªããããŒããã£ã¹ãããŸãã
Browser2 ã Browser3 ã Browser4-ãã¥ãŒã¢ãŒã åççšã®ãããªãæ¥ç¶ããŠåä¿¡ããŸãã WebRTCã¯Web Call Serverã䜿çšããŠãWebRTCãä»ããŠãããªã¹ããªãŒã ãã¹ããªãŒãã³ã°ããŸãã
ååã¯æ確ã§ãããã³ãŒãã®èšè¿°ã«é²ãããšãã§ããŸãã 2ã€ã®HTMLããŒãžãäœæããŸãã æåã®ãã®ã¯streamer.htmlãšåŒã°ãããããªã¹ããªãŒã ããµãŒããŒã«éä¿¡ããŸãã 2çªç®ã¯player.htmlãšåŒã°ãããµãŒããŒããã®ãããªã¹ããªãŒã ãåçããŸãã
ã¹ããªãŒããŒ-HTML
<html> <head> <script language="javascript" src="flashphoner.js"></script> </head> <body onLoad="init()"> <h1>The streamer</h1> <div id="localVideo" style="width:320px;height:240px;border: 1px solid"></div> <input type="button" value="start" onClick="start()"/> <p id="status"></p> </body> </html>
Streamer HTMLããŒãžã§ã¯ã次ã®ãã®ã䜿çšããŸããã
1ïŒ flashphoner.jsã¹ã¯ãªãã
ãã®ã¹ã¯ãªããã¯ã¡ã€ã³ã®JavaScript APIã¹ã¯ãªããã§ãããææ°ã®Web SDKã¢ã»ã³ããªã«å«ãŸããŠããŸãã
<script language="javascript" src="flashphoner.js"></script>
2ïŒ localVideoã®divèŠçŽ ã¯ãWebã«ã¡ã©ãããã£ããã£ããããããªãé 眮ããããããã¯ã§ãã
<div id="localVideo" style="width:320px;height:240px;border: 1px solid"></div>
3ïŒéå§ïŒïŒé¢æ°ãåŒã³åºããããããŒããã£ã¹ããéå§ãã[éå§]ãã¿ã³ã
<input type="button" value="start" onClick="start()"/>
4ïŒæ¬äœã«ã¯ãåæåé¢æ°åŒã³åºãã§onLoadã€ãã³ãã®åŠçãè¿œå ãããŠããããšã«æ³šæããŠãã ããã
<body onLoad="init()">
5ïŒid = statusã®èŠçŽ ãã¹ããŒã¿ã¹ã®è¡šç€ºã«äœ¿çšãããŸãã
<p id="status"></p>
ã¹ããªãŒããŒ-JavaScript
JavaScriptã³ãŒãã®èšè¿°ã«ç§»ããŸãããã ã³ãŒããæå°éã«æããããã«ãjQueryãBootstrapããŸãã¯ãã®ä»ã®ãã¬ãŒã ã¯ãŒã¯ãæå³çã«äœ¿çšããŸããã
var localVideo; function init(){ Flashphoner.init(); localVideo = document.getElementById("localVideo"); } function start() { Flashphoner.createSession({urlServer: "wss://wcs5-eu.flashphoner.com:8443"}).on(Flashphoner.constants.SESSION_STATUS.ESTABLISHED, function (session) { //session connected, start streaming startStreaming(session); }).on(Flashphoner.constants.SESSION_STATUS.DISCONNECTED, function () { setStatus("DISCONNECTED"); }).on(Flashphoner.constants.SESSION_STATUS.FAILED, function () { setStatus("FAILED"); }); } function startStreaming(session) { session.createStream({ name: "stream222", display: localVideo, cacheLocalResources: true, receiveVideo: false, receiveAudio: false }).on(Flashphoner.constants.STREAM_STATUS.PUBLISHING, function (publishStream) { setStatus(Flashphoner.constants.STREAM_STATUS.PUBLISHING); }).on(Flashphoner.constants.STREAM_STATUS.UNPUBLISHED, function () { setStatus(Flashphoner.constants.STREAM_STATUS.UNPUBLISHED); }).on(Flashphoner.constants.STREAM_STATUS.FAILED, function () { setStatus(Flashphoner.constants.STREAM_STATUS.FAILED); }).publish(); } function setStatus(status) { document.getElementById("status").innerHTML = status; }
ãã®äŸã«ã¯4ã€ã®é¢æ°ããããŸãã
1ïŒ åæå
JavaScript APIã®åæåãæ åœããdiv- localVideoèŠçŽ ãžã®åç §ãååŸããŸãã
2ïŒ éå§
ãã®é¢æ°ã¯ãwebsocketsãããã³ã«ã䜿çšããŠãµãŒããŒãžã®æ¥ç¶ãäœæããŸãã æ¥ç¶ã¢ãã¬ã¹ïŒ wssïŒ//ãã¡ã€ã³ïŒ8443 ãã¡ã€ã³ã¯ãWCSãµãŒããŒã®ãã¡ã€ã³ã§ããå¿ èŠããããŸãïŒãµãŒããŒã¯æ¢ã«ã€ã³ã¹ããŒã«ãããæ§æãããŠãããããšãã°webrtc.mycompany.comãªã©ã®å°çšãã¡ã€ã³ããããšæ³å®ããŠããŸããTCPããŒã8443ã¯çä¿¡æ¥ç¶çšã«éããŠããå¿ èŠããããŸãïŒã
ãã®é¢æ°ã®ã³ãŒãããã ESTABLISHEDã¹ããŒã¿ã¹ãååŸããåŸã®æ¬¡ã®ã¢ã¯ã·ã§ã³ã¯ã startStreamingé¢æ°ãåŒã³åºããŠã¹ããªãŒã ããµãŒããŒã«éä¿¡ããããšã§ããããšã¯æããã§ãã
3ïŒ startStreaming
ããã§ã¯ãAPIé¢æ°ã䜿çšããŠæ°ããStreamãªããžã§ã¯ããäœæããŸããsession.createStreamïŒïŒ; ã ã¹ããªãŒã ãäœæãããšã次ã®ãã©ã¡ãŒã¿ãŒãã¡ã€ã³ãã©ã¡ãŒã¿ãŒãšããŠè»¢éãããŸãã
âstreamName-ãããªã¹ããªãŒã ã®åå
âdisplayã¯ãç¹å®ã®ãããªã¹ããªãŒã çšã«ãã£ããã£ãããWebã«ã¡ã©ããã®ãããªã衚瀺ãããdivèŠçŽ ã§ã
äžæã®ã¹ããªãŒã åãçæããããšãæãŸããã§ããããã¹ãã«ã¯stream222ã䜿çšããŸãã
4ïŒ setStatus
ãã®é¢æ°ã¯ãã»ãã·ã§ã³ãŸãã¯ã¹ããªãŒã ã®ã¹ããŒã¿ã¹ãHTMLããŒãžã«è¡šç€ºããŸãã
å¥ã®streamer.jsãã¡ã€ã«ã§ã¹ã¯ãªãããåãåºããŸãã streamer.htmlããŒãžã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
<html> <head> <script language="javascript" src="flashphoner.js"></script> <script language="javascript" src="streamer.js"></script> </head> <body onLoad="init()"> <h1>The streamer</h1> <div id="localVideo" style="width:320px;height:240px;border: 1px solid"></div> <input type="button" value="start" onClick="start()"/> <p id="status"></p> </body> </html>
ã¹ããªãŒããŒ-ãã¹ã
ãã®çµæã3ã€ã®ã¹ã¯ãªããã§æ§æãããããã¹ããªãŒãã³ã°ã¢ããªã±ãŒã·ã§ã³ãåŸãããŸããã
âstreaming.html
âstreaming.js
âflashphoner.js
ã¹ã¯ãªãããWebãµãŒããŒã«ã³ããŒããŠããã¹ããéå§ããŸãã WebãµãŒããŒãšããŠã Apache 2ãæšæº/ var / www / htmlãšãšãã«äœ¿çšããŸã
ãã®çµæãåäœäžã®ã¹ããªãŒããŒã¯ã次ã®ã¹ã¯ãªãŒã³ã·ã§ããã«ç€ºãããã«ãªããŸãã [ã¹ã¿ãŒã]ãã¿ã³ãã¯ãªãã¯ãããšããµãŒããŒãšã®æ¥ç¶ã確ç«ãããWebRTCãããªã¹ããªãŒã ããµãŒããŒã«éä¿¡ãããŸãã
ã¹ããªãŒã ãå®éã«éä¿¡ãããããšã確èªããã«ã¯ã chromeïŒ// webrtc-internalsã¿ãã«ç§»åããŸãã ããã§ã¯ããããªã¹ããªãŒã ã§äœãèµ·ãã£ãŠãããããªã¢ã«ã¿ã€ã ã§èŠ³å¯ãããããã¬ãŒãã解å床ããã¬ãŒã ã¬ãŒããéä¿¡ãã±ããæ°ãRTTãªã©ã®ãã©ã¡ãŒã¿ãç£èŠã§ããŸãã
ãã®ããã«ããŠãã¹ããªãŒããŒãç²åŸããWebRTCãããªã¹ããªãŒã ããµãŒããŒã«æ£ããéä¿¡ãããããã§ãµãŒããŒã¯ãããããã¯ã¢ããããŸãã ã¹ããªãŒã ãååŸããŠåçããã«ã¯ãæ°ããplayer.htmlããŒãžãäœæããŸã
ãã¬ãŒã€ãŒ-HTML
ã¹ããªãŒããŒãããã¬ãŒã€ãŒã®ããŒãžãã³ããŒããŸããå¯äžã®éãã¯ã streamer.jsã®ä»£ããã«player.jsã䜿çšãã localVideoã®ä»£ããã«divèŠçŽ ã«id = remoteVideoãèšå®ããããšã§ãã
<html> <head> <script language="javascript" src="flashphoner.js"></script> <script language="javascript" src="player.js"></script> </head> <body onLoad="init()"> <h1>The player</h1> <div id="remoteVideo" style="width:320px;height:240px;border: 1px solid"></div> <input type="button" value="start" onClick="start()"/> <p id="status"></p> </body> </html>
ãã¬ãŒã€ãŒ-JavaScript
ãã¬ãŒã€ãŒã®ã¹ã¯ãªããã«ã¯ããã€ãã®éãããããŸãããã¢ãããŒãã¯åããŸãŸã§ããFlashphonerAPIã¯åæåãããã¹ã¿ãŒããã¿ã³ã¯websocketãä»ããŠãµãŒããŒãžã®æ¥ç¶ãéãã ESTABLISHEDã€ãã³ããåŸ æ©ããŠãã¹ããªãŒã ã®åçãéå§ããŸãã
player.jsã¹ã¯ãªãããšstreamer.jsã¹ã¯ãªããã®éãã®ãªã¹ãïŒ
âlocalVideoã®ä»£ããã«remoteVideoã«ãã£ãŠäœ¿çšãããŸã
âæ¥ç¶ã確ç«ãããããstartStreamingã®ä»£ããã«startPlaybackãåŒã³åºããŸã
âcreateStreamïŒïŒã¡ãœããã䜿çšããŠã¹ããªãŒã ãäœæããå Žåããã©ã¡ãŒã¿receiveAudio = trueããã³receiveVideo = trueãæž¡ãããŸã
âpublishïŒïŒã®ä»£ããã«playïŒïŒã¡ãœãããåŒã³åºãããŸã
var remoteVideo; function init(){ Flashphoner.init(); remoteVideo = document.getElementById("remoteVideo"); } function start() { Flashphoner.createSession({urlServer: "wss://wcs5-eu.flashphoner.com:8443"}).on(Flashphoner.constants.SESSION_STATUS.ESTABLISHED, function (session) { //session connected, start streaming startPlayback(session); }).on(Flashphoner.constants.SESSION_STATUS.DISCONNECTED, function () { setStatus("DISCONNECTED"); }).on(Flashphoner.constants.SESSION_STATUS.FAILED, function () { setStatus("FAILED"); }); } function startPlayback(session) { session.createStream({ name: "stream222", display: remoteVideo, cacheLocalResources: true, receiveVideo: true, receiveAudio: true }).on(Flashphoner.constants.STREAM_STATUS.PLAYING, function (playStream) { setStatus(Flashphoner.constants.STREAM_STATUS.PLAYING); }).on(Flashphoner.constants.STREAM_STATUS.STOPPED, function () { setStatus(Flashphoner.constants.STREAM_STATUS.STOPPED); }).on(Flashphoner.constants.STREAM_STATUS.FAILED, function () { setStatus(Flashphoner.constants.STREAM_STATUS.FAILED); }).play(); } function setStatus(status) { document.getElementById("status").innerHTML = status; }
ãã®çµæã2ã€ã®ã¹ã¯ãªããã§æ§æãããWebRTCãã¬ãŒã€ãŒãåŸãããŸãã
âplayer.html
âplayer.js
ãã¬ãŒã€ãŒãåäœããã«ã¯flashphoner.js APIãã¡ã€ã«ãå¿ èŠã§ããããšãå¿ããªãã§ãã ããããã®ããããã¬ãŒã€ãŒã®ãã¡ã€ã«ãWebãµãŒããŒäžã®åããã©ã«ããŒã«ã³ããŒããŸãã
ãã®çµæãWebRTCãªã³ã©ã€ã³ãããŒããã£ã¹ãã®æçµã¢ããªã±ãŒã·ã§ã³ã¯5ã€ã®ãã¡ã€ã«ã§æ§æãããŸãã
âstreamer.html
âstreamer.js
âplayer.html
âplayer.js
âflashphoner.js
ãã¹ããéå§ãã streamer.htmlãä»ããŠãããªã¹ããªãŒã ãå床éä¿¡ããŸãããã ãã®åŸã player.htmlã§æ°ãããã©ãŠã¶ã¿ããéã ã[éå§]ãã¯ãªãã¯ããŸãã
ãã®çµæããããŒããã£ã¹ããè¡ããããã¬ãŒã€ãŒãžã®ãããªã¹ããªãŒã ã§ããWebRTCãååŸãããŸããã ããã§ãä»ã®ããã€ã¹ããåããããªã¹ããªãŒã ã«æ¥ç¶ããããè€æ°ã®ãã©ãŠã¶ã¿ããéãããããããšãã§ããŸããåã¿ãã¯åããããªã¹ããªãŒã ãååŸããŸãã
ãããã£ãŠããããªã¹ããªãŒã ããµãŒããŒã«éä¿¡ãã1察å€ã¢ãŒãã§é ä¿¡ããŸãããããã«ãããè€æ°ã®æ¥ç¶ã§ã®ç°¡åãªãããªãããŒããã£ã¹ããå®çŸããŸããã
3å
次ã®æ¡ä»¶ãèæ ®ããŠã3åã§ãããŒããã£ã¹ããå±éããŠã¿ãŸãããã
1ïŒãããªã¹ããªãŒã ãäžç¶ããããã«Web Call Server 5ãæ¢ã«ã€ã³ã¹ããŒã«ãããŠããã SSLãæ§æãããŠããŸã ã SSL / HTTPSãªãã§ã¯ãGoogle Chromeã§ã®ãããŒããã£ã¹ãã¯æ©èœããŸããããŠã§ãã«ã¡ã©ãšãã€ã¯ã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¥ç¶ãå®å šã§ããããããŒããã£ã¹ãããã¹ãããŠããããŒãžãHTTPSçµç±ã§éãããŠããå¿ èŠãããããã§ãã TCPããŒã8443ãéããŠããã wssãåãå ¥ããæºåãã§ããŠããŸãïŒ//æ¥ç¶
2ïŒ Apacheãªã©ã®HTTPãµãŒããŒããã§ã«ã€ã³ã¹ããŒã«ããã³æ§æãããŠããŸãã WebãµãŒããŒã¯HTTPSçµç±ã§åäœããããã«æ§æãããŠããããã¹ãã¹ã¯ãªãããã¢ããããŒã/ããŠã³ããŒãã§ããFTP / SFTP / SSHã¢ã¯ã»ã¹ãåããŠããŸãã
WCS5ãšApacheã¯ãåãã·ã¹ãã ã«ã€ã³ã¹ããŒã«ããããšããç°ãªããµãŒããŒã«é åžããããšãã§ããŸãã ãã®å ŽåãApacheã¯åã«HTMLããŒãžãšã¹ã¯ãªããã®åœ¢åŒã§ã³ã³ãã³ããæäŸããWCS5ã¯ãããªãšã®æ¥ç¶ãæäŸããŸãã
ã€ã³ã¹ããŒã«ããã«ãã¹ããå®è¡ããã«ã¯ããã¢ãµãŒããŒwssïŒ//wcs5-eu.flashphoner.comïŒ8443ã䜿çšã§ããŸã-æ¥ç¶ããã³ãã¹ãçšã«éããŠããŸãã
å1
ãã¹ãã¹ã¯ãªãããããŒãããWebãµãŒããŒã®/ var / www / htmlãã©ã«ããŒã«è§£åããŸãã
wget --no-check-certificate https://flashphoner.com//downloads/examples/webrtc-broadcasting-example-0.5.15.1977.2088.tar.gz tar -xzf webrtc-broadcasting-example-0.5.15.1977.2088.tar.gz
å2
ç·šéãæ€çŽ¢ãå€æŽã®ããã«streamer.jsããã³player.jsã¹ã¯ãªãããéããŸãã
wssïŒ//wcs5-eu.flashphoner.comïŒ8443
ã«
wssïŒ//domain.comïŒ8443
ããã§domain.comã¯ãWCS5ãã€ã³ã¹ããŒã«ãããŠãããµãŒããŒã®ãã¡ã€ã³åã§ã
å3
httpsïŒ//ã®ãã©ãŠã¶ã§streamer.htmlãéãã[éå§]ãã¯ãªãã¯ããŸãã æ°ããã¿ãã§player.htmlãéãã[éå§]ãã¯ãªãã¯ããŸãã
ãŠã§ãã«ã¡ã©ãããŒããã£ã¹ãã®æºåãã§ããŸããã ãã®åŸãçŸåšã®äŸãä¿®æ£ããã¹ããªãŒããŒããã®ããã€ãã®ã¹ããªãŒã ã®å ¬éãšãã¬ãŒã€ãŒãžã®ãããªãé ä¿¡ã䜿çšããŠãäŸãã°å€å¯Ÿå€ã®ãããŒããã£ã¹ãããã¹ãã§ããŸãã
åç §è³æ
1. Web Call Server 5ã®åæã€ã³ã¹ããŒã«ãšæ§æ
2. WCS5ã®Web SDK
3. ãããŒããã£ã¹ããœãŒã¹ã³ãŒããããŠã³ããŒããã
4. chromeã® WebRTCçµ±èšïŒ// webrtc-internals
Web Call Server 5ã¯ãWebRTCãRTMPãããã³ãããªã¬ã€ãã³ã·ã®äœãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãéçºããããã®ãã®ä»ã®ãããã³ã«ããµããŒãããã¹ããªãŒãã³ã°ã¡ãã£ã¢ãµãŒããŒã§ãã ãµãŒããŒã«ã¯ãã¯ãã¹ãã©ãããã©ãŒã ãããªãã£ããããªã³ã©ã€ã³ãããªãããŒããã£ã¹ããIPã«ã¡ã©ããã®ãããŒããã£ã¹ããããã³ãã©ãŠã¶ãŒãšã¢ãã€ã«ããã€ã¹çšã®ãã®ä»ã®ã¹ããªãŒãã³ã°ãããªã¢ããªã±ãŒã·ã§ã³ãéçºããããã®Web SDKãAndroid SDKãããã³iOS SDKãå«ãŸããŠããŸãã