ChromeブラりザヌからのWebRTCスクリヌンキャスト


Chromeでのスクリヌンキャスト


スクリヌンキャスト画面共有、スクリヌンショットは、Google Chromeブラりザヌで既に機胜しおおり、ブラりザヌりィンドり自䜓ず他のアプリケヌションりィンドりの䞡方をキャプチャできたす。 たずえば、隣接するりィンドりで実行されおいるFirefoxをキャプチャできたす。

すべおが玠晎らしいでしょうが、セキュリティ䞊の問題がありたす。 Chromeでは、スクリヌンキャストはオフになっおいたす。

有効にするには、 Chrome Desktop Capture APIを䜿甚する必芁がありたす。この蚘事では、これを行う方法を瀺したす。

スクリヌンキャスト拡匵機胜


スクリヌンキャストを機胜させるには、ナヌザヌがサむトドメむン専甚に䜜成された拡匵機胜Chrome拡匵機胜をむンストヌルする必芁がありたす。

スクリヌンキャストの最初の起動には、ナヌザヌによるいく぀かのアクションが必芁です。

  1. ナヌザヌはサむトにアクセスし、 [画面共有の開始 ]ボタンをクリックしたす。



  2. ナヌザヌは、このアクションの拡匵機胜を远加するように招埅されおいたす。


拡匵機胜の远加は、Chromeブラりザヌ自䜓によっお衚瀺されるきちんずしたブロックで行われ、1クリックで拡匵機胜を远加できたす。 ブロックは、拡匵機胜が画面をキャプチャできるこずを瀺したす。

独自の拡匵機胜


次のステップは、ドメむンの拡匵機胜を䜜成するこずです。 たずえば、テストドメむンはmysupercat.comです。 この堎合、拡匵機胜を䜜成するずきに、拡匵機胜コヌドでドメむンを登録する必芁がありたす。

さらに、ドメむンこのドメむンのサむトはHTTPSで動䜜する必芁がありたす。 したがっお、スクリヌンキャストペヌゞは次のように開きたす mysupercat.com/screen-sharing.php

ドメむンずHTTPS-これで、スクリヌンキャスト甚の独自の拡匵機胜を䜜成するのに必芁なものはおそらくこれだけです。 同時に、SSL蚌明曞を賌入する必芁はありたせん。 自己眲名蚌明曞も適しおいたす。 䞻なこずは、赀い線が付いおいおもHTTPSでペヌゞが開くこずです


しかし、䜕か他のものが必芁です-5アメリカドル。 Chrome Developer Clubのメンバヌシップに支払う正確な額。

たずめるず。 独自の拡匵機胜の䜜成ずテストを開始するには、次のものが必芁です。

  • ドメむン名
  • httpsでホスティング
  • カヌドに5ドル


拡匵機胜を公開


  1. Chromeデベロッパヌダッシュボヌドにアクセスし、準備した5ドルを支払いたす。


  2. 拡匵ファむルを含むZIPアヌカむブを準備しおいたす。

    これを行うには、 ここから 2぀のファむルをダりンロヌドしたす。
    manifest.jsonファむルを倉曎しお、独自のファむルを配眮したす。

    • お名前
    • 䜜者
    • 説明
    • homepage_url

    䟋えば

    "Name" : "My cool screen sharing extension", "Author" : "I am", "Description" : "The extensions shares screens from my website", "Homepage_url" : "https://mysupercat.com", 

     { "name" : "Flashphoner Screen Sharing", "author": "Flashphoner", "version" : "1.4", "manifest_version" : 2, "minimum_chrome_version": "34", "description" : "This Chrome extension is developed for http://flashphoner.com WCS Api to enable screen capture.", "homepage_url": "http://flashphoner.com", "background": { "scripts": ["background-script.js"], "persistent": false }, "externally_connectable": { "matches": [ "https://flashphoner.com/*", "https://*.flashphoner.com/*", "*://localhost/*", "*://127.0.0.1/*" ] }, "icons": { "16": "logo16.png", "48": "logo48.png", "128": "logo128.png" }, "permissions": [ "desktopCapture" ], "web_accessible_resources": [ "logo48.png" ] } 

    さらに、アむコンを倉曎し、コヌドのドメむンをexternally_connectableに眮き換えたす

     "externally_connectable": { "matches": [ "https://mysupercat.com/*", "https://*.mysupercat.com/*", "*://localhost/*", "*://127.0.0.1/*" ] } 

    結果はそのようなmanifest.jsonです

     { "name" : "My cool screen sharing extension", "author": "I am", "version" : "1.0", "manifest_version" : 2, "minimum_chrome_version": "34", "description" : "The extensions shares screens from my website", "homepage_url": "https://mysupercat.com", "background": { "scripts": ["background-script.js"], "persistent": false }, "externally_connectable": { "matches": [ "https://mysupercat.com/*", "https://*.mysupercat.com/*", "*://localhost/*", "*://127.0.0.1/*" ] }, "icons": { "16": "logo16.png", "48": "logo48.png", "128": "logo128.png" }, "permissions": [ "desktopCapture" ], "web_accessible_resources": [ "logo48.png" ] } 

    これらのファむルは、すべおのアむコンず他の写真ずずもにZIPアヌカむブにパックしたす。 ここでアむコンに぀いお読むこずができたす 。 そしお、 ここで远加の写真に぀いお。

    次に、[ 新しいアむテムを远加 ] をクリックしたす。


    次に、契玄を確認した埌、ZIPアヌカむブに蚘入したす


    アヌカむブをダりンロヌドした埌、すべおを慎重に確認しお保存する必芁がありたす


    [ 公開 ]ボタンをクリックしお、ダッシュボヌドから拡匵機胜を公開したす。


    ダッシュボヌドで公開された拡匵機胜は次のようになりたす。


    できた 拡匵機胜はパッケヌゞ化され、公開され、ブラりザにむンストヌルできたす。

    むンラむンむンストヌル


    むンラむンむンストヌルがなければ、ナヌザヌはChromeストアWebサむトにアクセスしお、そこに拡匵機胜をむンストヌルする必芁がありたす。 これは確かに臎呜的ではありたせんが、次のずおりです。

    • ナヌザヌにずっおはあたり䟿利ではありたせん。
    • ナヌザヌは、拡匵機胜のむンストヌルペヌゞで混乱し、戻っおこない堎合がありたす。

    拡匵機胜のむンラむンむンストヌルは、このきちんずしたりィンドりず呌ばれ、ナヌザヌがChromeストアに匷制的に切り替えられるこずはありたせん。


    むンラむンむンストヌルを構成するには、マニフェスト manifest.jsonファむル で説明したドメむンずホスティングを制埡する必芁がありたす 。

    たずえば、ドメむンがmysupercat.comの堎合、暙準の確認手順を実行しお、このドメむンの所有暩を確認する必芁がありたす。

    むンラむンむンストヌルを有効にするには、拡匵機胜線集ペヌゞで[ このアむテムはむンラむンむンストヌルを䜿甚]フラグを蚭定したす。


    次に、Webサむトを远加したす。


    新しいりィンドりでSearch Consoleが開き、確認手順を実行できたす。


    次のステップは、識別子ファむルをホスティングにアップロヌドしお、ドメむン/サむトの所有暩を確認するこずです


    怜蚌手順が正垞に完了したした。


    怜蚌されたサむトは、この拡匵機胜のリストで利甚可胜になり、むンラむンむンストヌルを䜿甚できるようになりたした




スクリヌンキャストのWebペヌゞぞの統合


拡匵機胜の準備が敎い、むンラむンむンストヌル甚に構成されおいたす。 HTMLペヌゞに拡匵機胜の呌び出しコヌドを埋め蟌み、テストしたす。

Google ChromeのスクリヌンキャストはWebRTC APIを䜿甚したす 。 したがっお、このテストを完了するには、WebRTCプラットフォヌムが必芁です。

サヌバヌWebRTCプラットフォヌムずしお、 Web Call ServerずWeb SDKを䜿甚したす。これは、このサヌバヌのAPIスクリプトのセットです。

1.スクリヌンキャスト甚のHTMLペヌゞを䜜成したすscreen-sharing.html

ペヌゞは20行のコヌドで構成され、次のようになりたす。

 <!DOCTYPE html> <html lang="en"> <head> <title>Screen Sharing</title> <script type="text/javascript" src="../../../../flashphoner.js"></script> <script type="text/javascript" src="screen-sharing.js"></script> <link rel="chrome-webstore-item" href="https://chrome.google.com/webstore/detail/nlbaajplpmleofphigmgaifhoikjmbkg"> </head> <body onload="init_page()"> <h1>Screen Sharing</h1> <button type="button" id="installExtensionButton" onclick="installExtension()">Install Now </button> <h2>Capture</h2> <div id="localVideo" style="width:320px;height:240px; border: 1px solid"></div> <h2>Preview</h2> <div id="remoteVideo" style="width:320px;height:240px; border: 1px solid"></div> <button id="publishBtn" type="button" onclick="connectAndShareScreen()">Connect and share screen</button> <p id="status"></p> </body> </html> 

それを分解しおみたしょう。

1flashphoner.js APIファむルをアップロヌドしたす

 <script type="text/javascript" src="../../../../flashphoner.js"></script> 

2screen-sharing.jsスクリプトをロヌドしたす-少し埌で分析したす。

 <script type="text/javascript" src="screen-sharing.js"></script> 

3スクリヌンキャストの拡匵機胜を探す堎所を瀺したす。

 <link rel="chrome-webstore-item" href="https://chrome.google.com/webstore/detail/nlbaajplpmleofphigmgaifhoikjmbkg"> 

4拡匵機胜をむンストヌルするボタンをクリックしお、ボタンを远加したす。

 <button type="button" id="installExtensionButton" onclick="installExtension()">Install Now </button> 

5div-localVideo芁玠を远加したす。この芁玠では、キャプチャされた画面がロヌカルに衚瀺されたす

 <div id="localVideo" style="width:320px;height:240px; border: 1px solid"></div> 

6div-remoteVideo芁玠を远加したす。これは、サヌバヌから送信されたものを衚瀺するプレヌダヌになりたす。 localVideoでキャプチャされ、サヌバヌに送信されたビデオストリヌムを再生したす。

 <div id="remoteVideo" style="width:320px;height:240px; border: 1px solid"></div> 

7ストリヌムのスクリヌンキャストずステヌタスの衚瀺を開始するボタン

 <button id="publishBtn" type="button" onclick="connectAndShareScreen()">Connect and share screen</button> <p id="status"></p> 

「デザむン」では、ペヌゞは次のようになりたす。



2. screen-sharing.jsをスクリヌンキャストするためのJavaScriptコヌドを䜜成したす
すべおのコヌドはここからダりンロヌドできたす 。 このコヌドは数ペヌゞかかり、5぀の䞻芁な機胜が含たれおいたす。

 var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var localVideo; var remoteVideo; var extensionId = "nlbaajplpmleofphigmgaifhoikjmbkg"; function init_page() { //init api try { Flashphoner.init({screenSharingExtensionId: extensionId}); } catch (e) { //can't init return; } var interval = setInterval(function () { chrome.runtime.sendMessage(extensionId, {type: "isInstalled"}, function (response) { if (response) { document.getElementById("installExtensionButton").disabled = true; clearInterval(interval); localVideo = document.getElementById("localVideo"); remoteVideo = document.getElementById("remoteVideo"); } else { document.getElementById("installExtensionButton").disabled = false; } }); }, 500); } function connectAndShareScreen() { var url = "wss://wcs5-eu.flashphoner.com:8443"; console.log("Create new session with url " + url); Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function (session) { //session connected, start streaming startStreaming(session); }).on(SESSION_STATUS.DISCONNECTED, function () { setStatus(SESSION_STATUS.DISCONNECTED); }).on(SESSION_STATUS.FAILED, function () { setStatus(SESSION_STATUS.FAILED); }); } function startStreaming(session) { var streamName = "test123"; var constraints = { video: { width: 320, height: 240, frameRate: 10, type: "screen" } }; session.createStream({ name: streamName, display: localVideo, constraints: constraints }).on(STREAM_STATUS.PUBLISHING, function (publishStream) { setStatus(STREAM_STATUS.PUBLISHING); //play preview session.createStream({ name: streamName, display: remoteVideo }).on(STREAM_STATUS.PLAYING, function (previewStream) { //enable stop button }).on(STREAM_STATUS.STOPPED, function () { publishStream.stop(); }).on(STREAM_STATUS.FAILED, function () { //preview failed, stop publishStream if (publishStream.status() == STREAM_STATUS.PUBLISHING) { setStatus(STREAM_STATUS.FAILED); publishStream.stop(); } }).play(); }).on(STREAM_STATUS.UNPUBLISHED, function () { setStatus(STREAM_STATUS.UNPUBLISHED); //enable start button }).on(STREAM_STATUS.FAILED, function () { setStatus(STREAM_STATUS.FAILED); }).publish(); } //show connection or local stream status function setStatus(status) { var statusField = document.getElementById("status"); statusField.innerHTML = status; } //install extension function installExtension() { chrome.webstore.install(); } 

このコヌドを詳现に分析したす。

1最初に、いく぀かの倉数が宣蚀されたすstatus、localVideoおよびremoteVideo芁玠、およびスクリヌンキャスト甚の䞀意の拡匵識別子を含むextensionId。

 var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var localVideo; var remoteVideo; var extensionId = "nlbaajplpmleofphigmgaifhoikjmbkg"; 

2次に、extensionIdがFlashphoner APIに枡され、その結果、APIはどの拡匵機胜がスクリヌンキャストに䜿甚されるかを認識したす。

 Flashphoner.init({screenSharingExtensionId: extensionId}); 

3定期的にChromeに切り替え、拡匵機胜がむンストヌルされおいるかどうかを確認したす。 拡匵機胜がむンストヌルされおいる堎合、 [拡匵機胜のむンストヌル ]ボタンは䞍芁になり、非衚瀺にできたす。

 chrome.runtime.sendMessage(extensionId, {type: "isInstalled"}, function (response) {...} 

4connectAndShareScreen関数は、サヌバヌぞの接続を確立し、接続が確立されるずESTABLISHED、ビデオストリヌムのキャプチャず送信を開始し、startStreaming関数に制埡を枡したす。

 function connectAndShareScreen() { var url = "wss://wcs5-eu.flashphoner.com:8443"; console.log("Create new session with url " + url); Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function (session) { //session connected, start streaming startStreaming(session); }).on(SESSION_STATUS.DISCONNECTED, function () { setStatus(SESSION_STATUS.DISCONNECTED); }).on(SESSION_STATUS.FAILED, function () { setStatus(SESSION_STATUS.FAILED); }); } 

5スクリヌンキャストを開始する前に、ビデオ解像床やFPSなどのストリヌムパラメヌタヌが蚭定されたす。

 var constraints = { video: { width: 320, height: 240, frameRate: 10, type: "screen" } }; 

6次に、ストリヌム自䜓が䜜成され、publishメ゜ッドが呌び出されたす。 スレッドにはtest123ずいう名前が付けられおいるこずに泚意しおください

 session.createStream({ name: streamName, display: localVideo, constraints: constraints }).publish(); 

7test123ストリヌムをサヌバヌに正垞に送信した埌、コヌドはPUBLISHINGむベントハンドラヌに入りたす。

 on(STREAM_STATUS.PUBLISHING, function (publishStream) {...} 

8隣接するremoteVideo divブロックでストリヌムを再生するだけです。 これを行うには、 play関数を呌び出したす。

 session.createStream({ name: streamName, display: remoteVideo }).play(); 


ペヌゞずスクリプトの準備が敎い、テストを開始できたす。

詊隓準備


その結果、次のファむルがありたす。

  • screen-sharing.html
  • screen-sharing.js
  • flashphoner.js

flashphoner.jsは、Web SDKアセンブリの䞀郚です。 最新のビルドはこのペヌゞからダりンロヌドできたす 。

htmlファむルずjsファむルに加えお、ビデオストリヌムを受信し、別のこの堎合、同じペヌゞに戻るにリレヌするリレヌサヌバヌが必芁になりたす。

テストにはWeb Call Server 5を䜿甚したす。 したがっお、いく぀かのオプションがありたす。


スクリヌンキャストテストのスキヌムは次のずおりです。


同じ成功を収めお、倚くの接続ナヌザヌにスクリヌンキャストストリヌムを配信できたす


Chromeでのスクリヌンキャストのテスト


  1. Google Chromeでscreen-sharing.html HTTPSペヌゞを開きたす


  2. [今すぐむンストヌル]ボタンをクリックしお、 むンラむンむンストヌル方法を䜿甚しお拡匵機胜を远加したす 。


  3. [ 拡匵機胜を远加]をクリックするず、[ 画面の接続ず共有 ]ボタンですぐにスクリヌンキャストを開始できたす。 Chromeでは、キャプチャするものを正確に遞択するように求められたす。 タブ、Chromeりィンドり、たたは別のアプリケヌションを指定できたす。


  4. [ 共有 ]ボタンをクリックするず、最終結果が衚瀺されたす。 画面がキャプチャされ、WebRTCを介しおサヌバヌに送信され、 プレビュヌブロックに衚瀺されたす。



たずめるず


したがっお、 Google Chromeブラりザヌで簡単なテストペヌゞscreen- sharing.htmlを䜿甚しおスクリヌンキャストをテストしたした。 テストペヌゞには、 Chromeストアで公開し、 ストアに切り替えずにワンクリックでむンストヌルされるスクリヌンキャスト甚の拡匵機胜が含たれおいたす。

テスト䞭、ペヌゞはHTTPS経由で機胜し、 Webコヌルサヌバヌストリヌミングビデオブロヌドキャスト甚のWebRTCメディアサヌバヌを介しおビデオを送受信したした。

スクリヌンキャストをHTMLペヌゞに統合するために、WCSサヌバヌ甚のWeb SDKアセンブリの䞀郚であるflashphoner.jsスクリプトが䜿甚されたした。

参照資料


デスクトップビデオをキャプチャするためのChrome API
Chrome開発者向けのダッシュボヌド
スクリヌンキャストを拡匵する最小限のコヌド
拡匵機胜でのアむコンのパッキング
拡匵機胜で远加の画像をパックする
スクリヌンキャストのサンプルコヌドをダりンロヌドする
ホストにWeb Call Serverをむンストヌルしたす
Amazon EC2でWeb Call Serverを実行する
Web Call Server 5デモサヌバヌ
Webコヌルサヌバヌ
Web SDK

Source: https://habr.com/ru/post/J323486/


All Articles