<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>SkyWay &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/skyway/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>WebRTC開発者にはたまらない！徹頭徹尾、デベロッパーファーストだった「SkyWay Developer Meetup#1」</title>
		<link>/shumpei-shiraishi/24700/</link>
		<pubDate>Mon, 13 Nov 2017 01:00:57 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[SkyWay]]></category>
		<category><![CDATA[WebRTC]]></category>

		<guid isPermaLink="false">/?p=24700</guid>
		<description><![CDATA[9月29日に開催された、SkyWay初の開発者向けミートアップ「SkyWay Developer Meetup#1」。 2013年12月からトライアルサービスとして提供されてきたWebRTC Platform SkyWa...]]></description>
				<content:encoded><![CDATA[<p>9月29日に開催された、SkyWay初の開発者向けミートアップ「SkyWay Developer Meetup#1」。</p>

<p>2013年12月からトライアルサービスとして提供されてきたWebRTC Platform SkyWayのビジョンとミッション、基本的な使い方からハックな使い方などが紹介された同イベントの模様を紹介する。</p>

<p><img src="/wp-content/uploads/2017/11/42A7958.jpg" alt="" width="640" height="392" class="alignnone size-full wp-image-24774" srcset="/wp-content/uploads/2017/11/42A7958.jpg 640w, /wp-content/uploads/2017/11/42A7958-300x184.jpg 300w, /wp-content/uploads/2017/11/42A7958-207x127.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>SkyWayのビジョン＆ミッション</h2>

<p>2013年12月から、無償のトライアルサービスとして提供されてきた<a href="https://webrtc.ecl.ntt.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebRTC Platform SkyWay</a>（以下、SkyWay）。</p>

<p>一部では「WebRTCでサービス開発を行うならSkyWayが必須」と認識されつつある昨今、ついに2017年9月7日、商用サービスとして新たなスタートを切った。</p>

<p>本記事では、SkyWay初の開発者向けミートアップ「<a href="https://skyway.connpass.com/event/65697/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SkyWay Developer Meetup#1</a>」の模様をお伝えする。</p>

<p>まず最初に登壇したのは、SkyWayプロダクトマネージャーの水嶋彬貴氏。</p>

<p><img src="/wp-content/uploads/2017/11/42A7924.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24770" srcset="/wp-content/uploads/2017/11/42A7924.jpg 640w, /wp-content/uploads/2017/11/42A7924-300x200.jpg 300w, /wp-content/uploads/2017/11/42A7924-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><span style="font-size: 80%;">▲<strong>SkyWayプロダクトマネージャー 水嶋 彬貴氏</strong></span></p>

<p>6,000人以上の開発者、10,000近くのサービス、300近くの企業に既に利用されているSkyWayは、現在なんと1日あたり50万近くのWebRTC接続を捌いているという。</p>

<p>こうした実績は、「WebRTCを使うとこんなにもたくさんのことができる、と開発者の皆さんに証明していただいた」ことの現れであると水嶋氏は強調。</p>

<p><img src="https://codeiq.jp/magazine/wp-content/uploads/2017/10/numbers.jpg" alt="" width="640" height="360" class="alignnone size-full wp-image-54752" /></p>

<p>その上で、新たなスタートを切ったSkyWayのビジョンとミッションを以下のように定義した。</p>

<p><strong>「リアルタイムコミュニケーションを身近な技術に変え、世界中のソフトウェアエンジニアと共に世の中に革新を起こす」</strong></p>

<p><img src="https://codeiq.jp/magazine/wp-content/uploads/2017/10/mission.jpg" alt="" width="640" height="360" class="alignnone size-full wp-image-54753" /></p>

<h2>リアルタイムコミュニケーションを身近な技術に変える</h2>

<p>ミッションの前半「身近な技術に変える」という部分においてはまず、SkyWayの様々なAPIやSDK、日本語を含めたドキュメントが、WebRTCの難しさを中和してエンジニアの負担を減らすことができるとする。</p>

<p>それによりエンジニアは「WebRTCをどう使うか」ではなく、WebRTCを使ったイノベーションやアイデアに集中することができるようになる。</p>

<p><img src="https://codeiq.jp/magazine/wp-content/uploads/2017/10/sdks.jpg" alt="" width="640" height="360" class="alignnone size-full wp-image-54754" /></p>

<p>もうひとつ、身近な技術に変えるというミッションに基づいて提供されているのが、無償の「コミュニティエディション」だ。</p>

<p>無償で利用できる月に500ギガバイトという帯域量は、ボイスチャットであれば5,787日分、ビデオチャットであっても462日分に相当する。</p>

<p><img src="https://codeiq.jp/magazine/wp-content/uploads/2017/10/numbers2.jpg" alt="" width="640" height="360" class="alignnone size-full wp-image-54755" /></p>

<p>これだけの無料枠を手軽に試せるならば、スタートアップや新規事業に採用するのにためらう必要はない。まさに「リアルタイムコミュニケーションを身近にする」を体現した形だといえる。</p>

<h2>──そしてイノベーションを世界に広げる</h2>

<p>しかし、と水嶋氏は言う。SkyWayがいくらWebRTCを身近にしたところで、それだけでは世界中に広がるものではない。</p>

<p>ミッションステートメントの後半部分「世界中のソフトウェアエンジニアと共に世の中に革新を起こす」を達成するには、SkyWayを利用する開発者の助けが必要なのだと。</p>

<p>そこで水嶋氏は「（開発者への）お願い」と題して、以下の4つを挙げていた。</p>

<ul>
<li>横のつながり</li>
<li>イノベーションのアイデア共有</li>
<li>ノウハウの共有や相互支援</li>
<li>事業の成功と後続の支援</li>
</ul>

<p>水嶋氏のプレゼン資料はこちらから参照できる。</p>

<iframe src="//www.slideshare.net/slideshow/embed_code/key/1Sh8n8LrED5AGx" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>

<div style="margin-bottom:5px"> <strong> <a href="https://html5experts.jp//www.slideshare.net/mizuman1/skyway-vision-mission" title="SkyWay Vision &amp; Mission" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">SkyWay Vision &amp; Mission</a> </strong> from <strong><a href="https://www.slideshare.net/mizuman1" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Yoshiki Mizushima</a></strong> </div>

<h2>WebRTC開発者にはたまらない！基本からハック、生Q/A大会まで！</h2>

<p>その後は開発者向けにたっぷりと時間が割かれ、SkyWay / WebRTCに関する熱い議論が繰り広げられた。</p>

<p>SkyWayテックリードの岩瀬 義昌氏による「SkyWayを使いこなすために」というセッションは、SkyWayに関する基本から応用、ハックから内部関係者しか知らない情報まで盛りだくさんの内容だった。</p>

<p><img src="/wp-content/uploads/2017/11/42A8039.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24772" srcset="/wp-content/uploads/2017/11/42A8039.jpg 640w, /wp-content/uploads/2017/11/42A8039-300x200.jpg 300w, /wp-content/uploads/2017/11/42A8039-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><span style="font-size: 80%;">▲<strong>SkyWayテックリード 岩瀬 義昌氏</strong></span></p>

<p>あまりの情報量に、とてもではないがここでは内容を紹介しきれないため、詳しくは<a href="https://www.slideshare.net/iwashi86/skyway-how-to-use-skyway-webrtc" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">岩瀬氏のスライド</a>をご覧いただきたい。</p>

<iframe src="//www.slideshare.net/slideshow/embed_code/key/xuUXu3NGqjETbc" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>

<div style="margin-bottom:5px"> <strong> <a href="https://html5experts.jp//www.slideshare.net/iwashi86/skyway-how-to-use-skyway-webrtc" title="SkyWayを使いこなすために - How to use SkyWay (WebRTC)" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">SkyWayを使いこなすために &#8211; How to use SkyWay (WebRTC)</a> </strong> from <strong><a href="https://www.slideshare.net/iwashi86" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Yoshimasa Iwase</a></strong> </div>

<p>以下に、筆者として気になったポイントをいくつか書き記しておく。</p>

<p>*SkyWayは、現在開発が停止した<a href="http://peerjs.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PeerJS</a>をベースに開発されていたが、内部はフルスクラッチで書き直しており、継続的なメンテナンスや機能追加を行っている。<strong>「古いのではないか」という心配はあたらない</strong></p>

<p>*SkyWayでは、通常のP2P接続に加え<strong>SFU（Selective Forwarding Unit）もサポートしており、しかも無償から利用できる</strong>。</p>

<p>SFUとは複数のメディアストリームをサーバ側で一本にまとめてクライアントに配信する仕組みであり、多人数のビデオチャットを行う場合などに、P2Pのフルメッシュ型に比べてネットワーク全体の負荷を大きく低減することができる。</p>

<p>SkyWayが提供するRoom APIでは、フルメッシュとSFUを簡単に切り替えることができる。（SFUについては<a href="https://webrtc.ecl.ntt.com/sfu.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SkyWayのドキュメントにある説明</a>がわかりやすい）</p>

<p>*<strong>APIドキュメントに書かれていない機能もいくつかあり</strong>、統計情報の取得なども行える。気になる方は岩瀬さんのスライドを参照のこと。</p>

<p>*安定性やスケーラビリティについては万全の体制を敷いている。
（後のQ/Aセッションによると、開発チームの人員が5人以上の体制で監視しているほか、運営企業であるNTTコミュニケーションズの監視部隊とも連携しており、24時間365日稼働を保証しているとのこと）</p>

<h2>SkyWay開発者によるライトニングトーク大会</h2>

<p>以降も、ミートアップはまだまだ続く。</p>

<p>ライトニングトーク大会では4人の登壇者がSkyWay開発に関する実際から「やってみた」まで幅広いトピックでプレゼンテーションを行った。</p>

<h3><a href="https://twitter.com/jumboOrNot" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@jumboOrNot</a><strong>氏による「iOSでのSkyWay開発の勘所とTips」</strong></h3>

<p>レアジョブ英会話というサービスで、SkyWayを利用したiOSアプリを開発した際の生々しい話。</p>

<p>Skypeで行っていたサービスをWebRTC化することで開けた展望、そしてiOSアプリ開発で直面した問題に対してGoogle Firebaseを用いて対処したことを紹介していた。</p>

<p><img src="/wp-content/uploads/2017/11/42A8096.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24773" srcset="/wp-content/uploads/2017/11/42A8096.jpg 640w, /wp-content/uploads/2017/11/42A8096-300x200.jpg 300w, /wp-content/uploads/2017/11/42A8096-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h4>▼講演資料はこちら</h4>

<script async class="speakerdeck-embed" data-id="b8286e3ed57649968393a440a8569226" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"></script>

<p><br></p>

<h3><a href="https://twitter.com/massie_g" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@massie_g</a><strong>氏による「SkyWayのビデオチャットを録画しよう。そう、ブラウザでね」</strong></h3>

<p>現在のWebブラウザが備えるAPIのみを用いて、ビデオチャットの録画を行う方法を紹介。</p>

<p><img src="/wp-content/uploads/2017/11/42A8139.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24771" srcset="/wp-content/uploads/2017/11/42A8139.jpg 640w, /wp-content/uploads/2017/11/42A8139-300x200.jpg 300w, /wp-content/uploads/2017/11/42A8139-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h4>▼講演資料はこちら</h4>

<iframe src="//www.slideshare.net/slideshow/embed_code/key/1yWoyuzHlI499u" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>

<div style="margin-bottom:5px"> <strong> <a href="https://html5experts.jp//www.slideshare.net/mganeko/skyway-mix-recording" title="Skywayのビデオチャットを録画しよう。そう、ブラウザでね" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Skywayのビデオチャットを録画しよう。そう、ブラウザでね</a> </strong> from <strong><a href="https://www.slideshare.net/mganeko" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">mganeko</a></strong> </div>

<p><br></p>

<h3><a href="https://twitter.com/leader22" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@leader22</a><strong>氏による「SkyWay JS SDKの歩き方」</strong></h3>

<p>SkyWayのJavaScript SDK開発をサポートしたPixelGridの杉浦氏による、JavaScript SDKの読み解きガイド。</p>

<p><img src="/wp-content/uploads/2017/11/42A8161.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24777" srcset="/wp-content/uploads/2017/11/42A8161.jpg 640w, /wp-content/uploads/2017/11/42A8161-300x200.jpg 300w, /wp-content/uploads/2017/11/42A8161-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h4>講演資料: <a href="https://leader22.github.io/slides/skyway_dev_meetup-1/" rel="noopener follow external noreferrer" target="_blank" data-wpel-link="external">SkyWay JS SDKの歩き方</a></h4>

<p><br></p>

<h3><a href="https://twitter.com/lz650sss" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@lz650sss</a><strong>氏による「SkyWay×Cognitive Service」</strong></h3>

<p>SkyWayで受信したビデオチャットの画像をMicrosoft Azureの<a href="https://azure.microsoft.com/ja-jp/services/cognitive-services/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Cognitive Service</a>に送信し、表情を読み取るデモ</p>

<p><img src="/wp-content/uploads/2017/11/42A8205.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24778" srcset="/wp-content/uploads/2017/11/42A8205.jpg 640w, /wp-content/uploads/2017/11/42A8205-300x200.jpg 300w, /wp-content/uploads/2017/11/42A8205-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h4>講演資料: <a href="https://qiita.com/sublimer/items/9207b7e6aeaf75717d43" rel="noopener follow external noreferrer" target="_blank" data-wpel-link="external">SkyWay × Cognitive Service</a></h4>

<p><br></p>

<h2>フランクなQ/Aセッション、そして開発者だらけの懇親会。これぞデベロッパーファーストなミートアップだ</h2>

<p>アジェンダの最後はQ/Aセッション。事前アンケートで集めた質問に対して、開発チームが自らフランクに答えるセッションで、非常に和気あいあいとした雰囲気の中盛り上がった。</p>

<p><img src="/wp-content/uploads/2017/11/42A8363.jpg" alt="" width="640" height="418" class="alignnone size-full wp-image-24779" srcset="/wp-content/uploads/2017/11/42A8363.jpg 640w, /wp-content/uploads/2017/11/42A8363-300x196.jpg 300w, /wp-content/uploads/2017/11/42A8363-207x135.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<img src="https://codeiq.jp/magazine/wp-content/uploads/2017/10/qa.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-54761" /></p>

<p>そして（無料の）懇親会。会場の至る所で、Web(RTC)開発者同士のハイコンテクストな会話が繰り広げられていた。</p>

<p><img src="/wp-content/uploads/2017/11/42A8376.jpg" alt="" width="640" height="401" class="alignnone size-full wp-image-24780" srcset="/wp-content/uploads/2017/11/42A8376.jpg 640w, /wp-content/uploads/2017/11/42A8376-300x188.jpg 300w, /wp-content/uploads/2017/11/42A8376-207x130.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<img src="https://codeiq.jp/magazine/wp-content/uploads/2017/10/social3.jpg" alt="" width="640" height="215" class="alignnone size-full wp-image-54786" /></p>

<p>最後に、イベントを通じて筆者が感じたことを述べておく。</p>

<p>SkyWayはもちろんプラットフォームであるが、このイベントを通じてSkyWayチームが実現したかったことは、<strong>「開発者コミュニティ」というプラットフォームづくり</strong>なのだろうと思う。</p>

<p>SkyWayというプラットフォームを提供してリアルタイムコミュニケーション開発の敷居を下げるだけが彼らの役割ではない。</p>

<p>同時に、開発者基盤としてのコミュニティ構築も図ることで、WebRTCを活用したイノベーションが生まれやすくすることも、また彼らの役割なのだと。</p>

<p>SkyWay開発チームのこうした挑戦が実を結び、日本発のプラットフォームが世界を席巻する日を、筆者は見たい。</p>

<p><span style="font-size: 90%;">※本記事はITエンジニアのためのキャリア応援サイト「<a href="https://codeiq.jp/magazine/" rel="noopener follow external noreferrer" target="_blank" data-wpel-link="external">CodeIQ MAGAZINE</a>」（※2017年11月18日掲載）からの提供記事です。</span></p>
]]></content:encoded>
			</item>
		<item>
		<title>エキスパートたちが語り尽くす、WebRTCの「つらみ」ーWebRTC Conferenceパネルディスカッションレポート</title>
		<link>/mganeko/18386/</link>
		<pubDate>Fri, 18 Mar 2016 00:00:41 +0000</pubDate>
		<dc:creator><![CDATA[がねこまさし]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[SkyWay]]></category>
		<category><![CDATA[WebRTC]]></category>

		<guid isPermaLink="false">/?p=18386</guid>
		<description><![CDATA[こんにちは、がねこです。この記事では先日開催された「WebRTC Conference Japan 2016」から、2日目に行われたパネル・ディスカッション「ここがつらいよWebRTC &#8211; WebRTC開発の...]]></description>
				<content:encoded><![CDATA[<p><style>
.post-detail-contents p {
  text-indent: 0;
  clear: left;
}
b.speaker {
  background-size: 48px;
  display: inline-block;
  width: 48px;
  height: 18px;
  float: left;
  padding-right: 8px;
  padding-top: 48px;
  text-align: center;
  margin-bottom: 4px;
  font-weight: normal;
  font-size: small;
}
b.speaker.ganeko {
  background: url('/wp-content/uploads/2016/03/ganeko.jpg') no-repeat;
}
b.speaker.minamoto {
  background: url('/wp-content/uploads/2016/03/minamoto.jpg') no-repeat;
}
b.speaker.ago {
  background: url('/wp-content/uploads/2016/03/ago.jpg') no-repeat;
}
b.speaker.alen {
  background: url('/wp-content/uploads/2016/03/alen.jpg') no-repeat;
}</p>

<p>.post-detail-contents p { text-indent:0; } #contents #post-detail .block-contents img[width="70"] { display: inline-block; float: left; margin-right: 1em; width: 48px; } #contents #post-detail .block-contents p { overflow: hidden; } #contents #post-detail .block-contents p strong { font-weight: bold; } #contents #post-detail .block-contents p > br { display: none; } .post-detail-contents p > span { display: block; min-height: 48px; }</p>

<p></style></p>

<p>こんにちは、がねこです。この記事では先日開催された「<a href="http://webrtcconference.jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebRTC Conference Japan 2016</a>」から、2日目に行われたパネル・ディスカッション「ここがつらいよWebRTC &#8211; WebRTC開発の落とし穴」の内容をご紹介します。</p>

<p><img src="/wp-content/uploads/2016/03/webrtc-1.jpg" alt="" width="640" height="224" class="aligncenter size-full wp-image-18529" srcset="/wp-content/uploads/2016/03/webrtc-1.jpg 640w, /wp-content/uploads/2016/03/webrtc-1-300x105.jpg 300w, /wp-content/uploads/2016/03/webrtc-1-207x72.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>パネラー紹介</h2>

<p>パネラーとして、次の3名にご登壇いただきました。モデレータは私が担当させていただきました。</p>

<p><img src="/wp-content/uploads/2016/03/webrtc-5.jpg" alt="" width="100" height="100" class="alignleft size-full wp-image-18535" />源 拓洋さん<br>ソフトバンク株式会社所属。社内、グループ会社間で利用するビデオ会議システムを、WebRTCを使って構築、運用されています。主にAndroidのネイティブアプリを担当されていますが、MCU/SFUといったメディアサーバーにも詳しいです。</p>

<p><img src="/wp-content/uploads/2016/03/webrtc-4.jpg" alt="" width="100" height="100" class="alignleft size-full wp-image-18534" />吾郷 郷さん<br>ChatWork株式会社所属。クラウド型ビジネスコミュニケーションツールを提供されていて、そのサービスの一環としてWebRTCを使ったビデオ会議/音声通話を実現されています。担当はPCブラウザが中心とのことです。</p>

<p><img src="/wp-content/uploads/2016/03/webrtc-3.jpg" alt="" width="100" height="100" class="alignleft size-full wp-image-18533" />飯田 アレン 真人さん<br>NTTコミュニケーションズ株式会社所属。開発者向けにWebRTCを使うためのPaaSであるSkyWayを提供されています。PCブラウザが中心に、サーバー側も担当されているとのことです。</p>

<p><img src="/wp-content/uploads/2016/03/webrtc-2.jpg" alt="" width="100" height="100" class="alignleft size-full wp-image-18532" />我如古正志（モデレータ）<br>インフォコム株式会社所属。WebRTCを使った社内用Webチャットシステムや、イベント配信システムを構築、運用しています。クライアント側からサーバー側まで広く浅く担当しています。</p>

<p><br>
下図のように、WebRTCの使い方や担当領域がそれぞれ異なるパネラーの方に、集まっていただきました。</p>

<p><img src="/wp-content/uploads/2016/03/webrtc_panel_position1.png" alt="webrtc_panel_position" width="640" height="473" class="aligncenter size-full wp-image-18530" srcset="/wp-content/uploads/2016/03/webrtc_panel_position1.png 640w, /wp-content/uploads/2016/03/webrtc_panel_position1-300x222.png 300w, /wp-content/uploads/2016/03/webrtc_panel_position1-207x153.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>クライアントサイドでの「つらみ」</h2>

<h3>サポート対象のブラウザとOSについて</h3>

<p>
<b class="speaker ganeko">我如古</b>まずはクライアント側で苦労するポイントと、その対策を聞いてみたいと思います。クライアントサイドではブラウザによって実装が異なるなど、苦労するポイントがあると思いますが、まずどのようなクライアントをサポート対象としているか、教えていただけますか？
</p>

<p>
<b class="speaker minamoto">源</b>
私のところでは社内のツールとしてはChromeがブラウザとして採用されているので、原則的にはChromeのみに対応しています。なのでここに挙げられているFirefox, Safari, IE, Edgeはすべて切り捨てています。
</p>

<p>
<b class="speaker ago">吾郷</b> 
うちではChrome, Firefoxをメインに据えていますが、IE/Safariについてはプラグインというかたちで提供しています。Safariについてはプラグインの対応中という段階ですが。Edgeに関してはまだ手が回っていないですが、今後サポートしていきたいと考えています。
</p>

<p>
<b class="speaker alen">アレン</b> 
SkyWayではChromeとFirefoxがメインになっていますが、IEとSafariもプラグイン対応しています。Edgeはまだ手がついていません。PCアプリに関しては、Electronなどを使って実装することもできます。(iOSやAndroidといった)モバイルアプリもSDKをリリースしています。
</p>

<p>
<b class="speaker ganeko">我如古</b> SkyWay以外では、モバイルアプリは対象とされていないのでしょうか？
</p>

<p>
<b class="speaker minamoto">源</b>
うちでは、iOSアプリケーションについては提供しています。Androidに関しては幸いにしてAndroid版のChromeブラウザがWebRTCに対応しているんですね。なのでレスポンシブデザインみたいなかたちで、Androidの画面解像度に合わせたWebのインターフェイスを提供して対応しています。
</p>

<p>
<b class="speaker ago">吾郷</b> 
うちの場合はPCアプリ、モバイルアプリについてはまだ対応中というかたちです。これも追々対応していきたいというステータスになっています。
</p>

<h3>プラットフォームの差異をどう扱う？</h3>

<p>
<b class="speaker ganeko">我如古</b> ありがとうございます。今の中である程度話に出たかもしれませんが、あるブラウザを切り捨てるかどうかどうか、どんな戦略をとられていますか？　またブラウザの異なるバージョンのサポートにはどのようなポリシーを持たれていますか？
</p>

<p>
<b class="speaker minamoto">源</b>
その点に関しては、先ほど述べた通り、Chromeブラウザ以外は原則的に捨てています。「自分で頑張る」（頑張って差異を吸収する）ということも、もちろん部分部分ではやっています。一律で社内の人は同じブラウザの同じバージョンを使っているはずではあるんですけれども、個別に異なる環境を使ってらっしゃる方もいるので、そのあたりはJavaScriptで差異を吸収しています。Chromeブラウザ間のバージョン差異というのは当然あるので、そこは頑張って吸収しています。
</p>

<p>
<b class="speaker ago">吾郷</b> 
うちの場合だと「自分で頑張る」と「便利ライブラリを使う」の両方対応しているという状況です。IE/Safariのプラグインに関しては <a href="https://github.com/webrtc/adapter" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">adapter.js</a> を使うというのが一般的な手法なのでこれを利用していますが、それでも間に合わないところや、FirefoxやChromeでも特定のバージョンで動きがおかしいところは条件分岐して対応するということも、行っています。
</p>

<p>
<b class="speaker alen">アレン</b> 
SkyWayでは、利用しているライブラリ<a href="http://peerjs.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Peer.js</a>でかなり吸収されているところはあります。対応しきれていないところは、adapter.jsを使ったりして吸収しています。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
Peer.jsも独自で手を入れ、対応しているとお聞きしていますが？
</p>

<p>
<b class="speaker alen">アレン</b> 
たまに結構古いバージョン（のブラウザ）では、例えばonnegotiationneededイベントに対応していないブラウザなどで動作を変えるとか、そういうコードは入っています。
</p>

<p>
<b class="speaker minamoto">源</b>
adaptor.js って、ご存知のかた多いですか？…意外と少ないですね。adaptor.jsというのはwebrtc.orgからオープンソースで公開されているJavaScriptで、Firefox, Chrome, Opera間のWebRTC実装差異を吸収してくれます。ただ先ほど述べられた通り、Trackとか一部の扱いについては残念なところがあるので、その辺に関しては自分で一生懸命吸収しないといけないです。

付加情報としてはIEやSafariのプラグインを提供してくれる会社は、adapter.jsと互換のあるインターフェイスを提供していることが多いです。adapter.jsに対応していれば簡単にプラグインが利用できて、マルチプラットフォーム、クロスプラットフォーム対応にできるという大きな利点があります。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
こちらについては、自分で作るのと、他社のライブラリを使うのと、併せて使うということでしょうか。
</p>

<p>
<b class="speaker ago">吾郷</b> 
うちの場合は他の会社と協力して開発を行っています。でも実際のところ、お金を払えば全部お任せでうまくいく…かというとそうでもなくて、こちらでも検証して「この部分がおかしい」とフィードバックしながらお互いにやっていくしかないという状況です。どういう会社を選定するかということにもよると思いますが、費用が高い会社さんととそうでもない会社さんと、もちろんあります。（後者なら）こちらからもコスト（労力）をかけて一緒に開発していくようなかたちになるんじゃないかと、思っています。
</p>

<p>
<b class="speaker alen">アレン</b> 
SkyWayのIEとSafariプラグインは、他社のものを使っております。そこは実装コストが高いのと、すでに安定して動いているモノがあるので、それを使った方が、SkyWayとして集中すべきところに集中できると思っています。

（JavaScriptの）クライアントライブラリに関してはオープンソースがベースになっていますが、そこに本体で行われた修正のマージとか、SkyWay独自の修正とか、両方入れております。
</p>

<p>
<b class="speaker minamoto">源</b>
たまにありますよね。海外でこのあいだ話題になったのは「<strong>Peer.js（本家）の実装よりもSkyWayの実装の方が早いから、SkyWayの方を改造して使おう</strong>」という発言。それぐらいSkyWayは有名です。すごいですね！（会場笑）
</p>

<h3>デバイスの差異をどう扱う？</h3>

<p>
<b class="speaker ganeko">我如古</b> 
実際同じブラウザ、同じバージョンだとしても、デバイスや機種（スペック）によって動く動かないということがあると思いますが、その辺はサポートはどうされていますか？
</p>

<p>
<b class="speaker ago">吾郷</b> 
うちの場合はB2Cの個人宅で使われることもあるので、すべての機種をサポートするのは非常に難しい、というのが正直なところです。例えばマシンのスペックが低い状態、かつネットワークの調子がおかしい、通信している相手が多い、など重なった場合などもあります。どこからというスペックの基準を設けることもある程度検討はしていますが、正直なとろ結構難しい対応になっています。
</p>

<p>
<b class="speaker alen">アレン</b> 
SkyWayはプラットフォームなので、そこはあまり考えていないです。できるだけ広い機種で使えることは目指していますが、アプリの開発者がこの機種をサポートしたかったら、ビデオをあきらめてオーディオだけにしたり、そういうことをしていただいています。プラットフォームとしてすべてのケースをサポートするのは難しいので、アプリの開発者に任せております。
</p>

<p>
<b class="speaker minamoto">源</b>
うちの場合は社内利用なので、当然のことならが利用される機種に関しても一定の物に限られているので、そういう点に置いてはテストが簡単という部分はあります。しかしながらサポートするデバイスに関しては、iPhone/iOSは機種の数がそもそも少ないのと実装差異がほとんどないので問題ではなかったりします。Androidの方が実装差異というか、機種依存がありますので、そこの部分を一生懸命に吸収することになります。</p>

<p>
企業ユースの場合になりますが、パソコンのマイク/スピーカーはそこまでコミュニケーションに最適化された設計になっていなくて、とりあえず内蔵マイク入れてみました、というのが多いので正直言ってあまりよい動きはしません。音周りについては本来コミュニケーションするために作られた電話機（スマートフォン）というのは凄く有効に使えます。</p>

<p>パソコンに関しては映像はあまり問題が出なんですけど、音に関しては聞こえづらいなと問題がやっぱり出てきます。そういう点に関しては、USBのヘッドセットやUSBの会議用マイクスピーカーを使うということをやるだけで、まったく違うレベルの品質が提供できます。ユーザーサポートとしては会議用マイクスピーカーを一回利用したいという部署に貸し出して試してもらって、良いと思えば買ってもらう、としています。やるとだいたい購入という話になります。それぐらい変わります。</p>

<p><strong>WebRTCの音声品質はもともとものすごく良い</strong>んですね。Opusというコーデックで圧縮されているということで、VoLTEレベルの音声品質は普通に出ているはずです。音声品質が悪いのはだいたいパソコン側の要因です。オートゲインコントロールの暴走もあります。そういった現象も回避できるので、Web会議用のスピーカーを利用するというのを、原則として勧めています。
</p>

<h2>「繋がらない苦労」を共有してみる</h2>

<p>
<b class="speaker ganeko">我如古</b> 
話題が尽きないんですけれども、次の「繋がらない話」に入りたいと思います。（WebRTCを使ったシステムを）実際に動かすと「繋がらない」と言われることがよくあると思います。一言で「繋がらない」と言っても、現象や原因は様々だと思うので、その辺を聞いてみたいと思います。みなさん実際にサービスを提供されていて、「繋がらない」と言われることはよくありますか？ほとんどないですか？
</p>

<p>
<b class="speaker minamoto">源</b>
「繋がらない」と言われることは、「あるかないか」でいうと、もちろんあります。どういう要因で繋がらないかというとなかなか難しいところではありますけどね。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
じゃあ、繋がらない理由として、 よくあるケースを紹介していただけますか？
</p>

<p>
<b class="speaker ago">吾郷</b> 
うちの場合だと、よくある例としてPCのスペックというのもかなり大きくあります。ブラウザの種類の問題というのも、もちろんあるんですが、例えばChromeでつながらないという場合だと、PCのスペックが足りなくて、参加人数が多いと後から来た人が入れないことがあります。ユーザーさんから見て使っていて何が起こっているのかよく分からない状況になってしまうので、それで「繋がらない」という話になってしまいます。</p>

<p>もちろんネットワークの問題とかもあるんですが、最初から全く繋がらないという状態と、途中から入る人が入れないという状態だと、「繋がらない」という問い合わせは後者の方が多いです。
</p>

<p>
<b class="speaker minamoto">源</b>
追加の方が繋がらないと言われることが多いということですか？
</p>

<p>
<b class="speaker ago">吾郷</b> 
実際使っていると、その方が動作に違和感を覚えるという意味です。
</p>

<p>
<b class="speaker minamoto">源</b>
あー、なるほど。ということは、初期のWebRTC接続に関しては普通に抜けてしまう（繋がる）ケースの方が多い？
</p>

<p>
<b class="speaker ago">吾郷</b> 
もちろん、それでつながらないというケースもあるにはあるのですが、その場合だとこちらからもある程度サポートはしやすいというか、切り分けはかなり楽です。そうでない場合、人数が入ってくると後の人が繋がらないという状況になると、どういうふうにサポートしてよいか難しくなるという問題があります。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
プラットフォームだといろいろなケースがあると思いますが？
</p>

<p>
<b class="speaker alen">アレン</b> 
一般的に使われている方からはそんなに問い合わせはないんですけど、大企業でデモしたりする時って、やっぱり企業のネットワークってかなり制限が多いので、そこでつながらないことが非常に多いです。そもそもWebSocketが通らないからシグナリングできないとか、Man-in-the-middleで完全にブロックされているとか…。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
最悪ですね（苦笑）。
</p>

<p>
<b class="speaker alen">アレン</b> 
本当にそういうケースが多くて、ネットワークポリシーをちょっと変えてもらったら繋がるケースも多いです。やっぱり<strong>企業ネットワークはすごく難しい</strong>です。</p>

<p>ただ、社内ネットワークの内側同士だったら意外とよく繋がるんですね。弊社でも（PCのポリシーの制約で）カメラとマイクはつなげられないんですけど、DataChannelでファイル送ったりすることはできるので…（笑）。
</p>

<h3>明るい話をしよう。WebRTCは繋がる！</h3>

<p>
<b class="speaker minamoto">源</b>
一応「明るい展望の話をしよう」という話になっていたはずなので、ちょっと話の流れ変えていいですか(笑)。繋がらない話ばかりだとみんな「WebRTCはつらい」と思っちゃうでしょうし。
</p>

<p>ざっくり言うと大多数の人は繋がります。「繋がらない」と我々がしゃべっているのは、「繋がらない」ケースについて取り上げているだけ、だいたいの人は繋がります。どれぐらい繋がるかというと、</p>

<ul>
 <li>家庭-家庭間ではほぼ間違いなく繋がる</li>
 <li>家庭-携帯端末間もほぼ間違いなくつながる</li>
 <li>企業-家庭間もほぼ間違いなくつながる</li>
 <li>繋がらないのは、企業-企業間</li>
</ul>

<p>と、こんな感じでまとめられると思います。</p>

<p>
企業-企業間に関しては利用頻度が高い場合は、そこのネットワーク管理者に相談して、自分たちのサーバーだけ何とか通してくれという交渉ができると思っているので、原則的には繋がるものだと考えていただいてよいです。「繋がらないというのは、あくまでもレアケース」、ということは持ち帰っていただけると幸いです。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
企業の場合はガードされているけど、理由があれば開けてもらえる、というところがあると思います。
</p>

<p>
<b class="speaker ago">吾郷</b> 
ここでどういうふうに開けるかという問題があって、サーバーを分散しているときにそれのIPアドレスを教えてくれと言われて、つらいという話があったりもします。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
動的にIPアドレスがふられる場合ですね。
</p>

<p>
<b class="speaker ago">吾郷</b> 
はい。DNSで名前振ってるので、それを指定して開けるのが難しい場合もあって（IPアドレス指定が必要なとき）、そういう時は、結構うーん、というような状況になることがあります。
</p>

<p>
<b class="speaker minamoto">源</b>
動的な場合は難しいですね…。でもいろいろやりようはあると思っていて、例えば繋がるようにするのであれば、対象となる企業が決まっていれば、その企業向けにTURNサーバーを（固定で）立ててあげるというのも十分良いと思います。そのTURNサーバー向けの通信は全て通してくださいね、というお願いの仕方はあると思っています。
</p>

<p>
<b class="speaker ago">吾郷</b> 
うちの場合はそこまで各企業さん向けに大きくカスタマイズして提供することは難しい事情もあります。なので、どういうふうにサービスを提供したいか、だれに対してどのようなかたちでサービスを提供したいか、によってここの解決方法は選択肢があるのかな、と。</p>

<p>逆に言えばそこの部分をかなり考えないと、あとあとすごく大変になってしまうという事態はありえると思ってます。
</p>

<p>
<b class="speaker minamoto">源</b>
ちなみに弊社におけるつながらない問題に関しては、通信環境の問題で繋がらないというのは、ほぼほぼ無いです。というのは、そういう風にして繋がるように（設定や設置を）工夫しているというのはあるんですが、原則的に繋がらないというのはレアケースになります。
</p>

<p>ユーザーから繋がらないという問い合わせが来るもので一番件数が多いのは「カメラとマイク」の問題です。「カメラとマイク、(PCに)つながってませんでした～」とかも結構あるのですが、最多は最初に getUserMedia() でブラウザがユーザに許可を求めて来た際に、「今回は私は映像使わないからとか、見ているだけだから映像音声いらない」ということで一回拒否をしちゃうんですね。</p>

<h3>ユーザへの権限許可の求めかた</h3>

<p><strong>一回拒否しちゃうと、二回目そのページを開いたときも、ブラウザはその設定を読み込んじゃう</strong>んですよ。そうすると二回目以降その人が映像音声使いたくても、ブラウザとしてはポリシーに拒否が設定されているので、ユーザとしては「繋がらない」というかたちで結果が出てきます。</p>

<p>
そういうところは（世の中的にも）結構な問題になっていて、FirefoxとChromeではその警告の出方が違うんですね。なので（ユーザへの）案内の仕方とかマニュアルの作り方とかも変わってくるんですね。海外のサービスを見ていると結構おもしろくて、getUserMedia()の許可を取ってねというのは、画面いっぱいにすごくドーンと出るんですよ。あーいうのってすごく重要なんだなーと見ています。
</p>

<p>
<b class="speaker alen">アレン</b> 
サンプルアプリでChromeとFirefoxに対応して「ここをちゃんとクリックしてね」と出しても、だれも読んでくれないです（笑）。だから全画面でやらないとスルーされてしまうので、そこは注意しなければいけないです。
</p>

<p>
<b class="speaker minamoto">源</b>
辛いですねー。昨日のセッションで発表されていた Appear.in とかは、なのでちょっと見に行って参考にさせてもらうと、あー、やっぱりこうやらないと問い合わせくるよねー（と思います）。</p>

<p>利用者の多いサービスは問い合わせ件数を下げることに一生懸命になりますから、やっぱりUIとかもそういう工夫していると思います。なので「なんでこうなっているのだろう？」という疑問から入るといろいろ解決していくのかなと。
</p>

<p>
<b class="speaker ago">吾郷</b> 
うちの場合いくつかの言語に対応しているので、その部分の多言語対応が必要だったりとかします。単純にメッセージを変えるだけではなく、画面キャプチャーして「この部分のこのアイコンをクリックしてね」というのがその言語ごとに必要になったりして、それかけるブラウザ数になって、「ああああ…」ていうかたちになったりも、しています
</p>

<p>
<b class="speaker minamoto">源</b>
やっぱり標準化してほしいですよねー。
</p>

<p><br></p>

<h3>それでもやっぱり繋がらなかった時の対処法</h3>

<p>
<b class="speaker ganeko">我如古</b> 
じゃあ、いままでですごいレアな、「こんな原因でつながらなかったのか」という例があれば紹介していただけますか？
</p>

<p>
<b class="speaker minamoto">源</b>
インターネットだけ頑張って抜けるようにしている環境だと、シグナリングサーバー（チャットサーバー）までは来ているのに、その後のWebRTCは繋がらないという特殊な環境の人は、一定数あります。レアケースだとは思います。
</p>

<p>
<b class="speaker ago">吾郷</b> 
OSのファイアーウォールの設定だとか、ネットワーク上は通信はできるのに、そのPCの設定や中のファイアーウォールの設定で繋がりにくかった、それも全く繋がらないわけではない、という状況になったことはあります。
</p>

<p>
<b class="speaker alen">アレン</b> 
これは繋がらないわけではないのですがちょっと面白い話で、社内のハッカソンをやった時に、家庭用ルーターを使ってみんなアプリを作っていました。何時間か経ってアプリが動き始めたら、フルメッシュで10&#215;10の通信が家庭用ルータを通って、融けました（笑）。それ以降通信できなくなってしまいました。家庭用ルーターでむっちゃ大量通信する場合は注意してください。
</p>

<p>
<b class="speaker minamoto">源</b>
あります、あります。それはあります。社内利用の場合にはある特定のフロアでみんなが利用して、そのフロアの無線LANルーターが死亡して、解像度が下がって画質がすごく悪くなったんだけど…（と言われる）。それは皆が使うと帯域狭くなって画質が動的に下げられてしまうので、悪くなるのは当たり前なんですけど、そういうことは起こりますね。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
いろいろ原因があると思いますが、何か切り分けとか情報収集とかする仕組みって用意されていますか？　あるいはユーザーが自分で切り分けられるツールとか、そういう工夫があれば教えてください。
</p>

<p>
<b class="speaker minamoto">源</b>
そういう点に関してはtest.webrtc.orgというサイトがあって、そこで一通りのテストは通せるので、それの社内版を作って（ユーザーに）テストしてもらうということを、我々の場合にはやっています。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
自分でやってもらうということですね？
</p>

<p>
<b class="speaker minamoto">源</b>
ユーザーにやってもらう形になります。もちろん社内利用なのでブラウザから出てくるの情報であったり、接続用の交換情報であったりはログとして取ってあるので、繋がらないという連絡を受けた時はその人のログを追いかけて、その人の接続系の情報を見てそこから判断することも、実際にやっています。
</p>

<p>
<b class="speaker alen">アレン</b> 
こちらも似た感じで、シンプルなアプリでまず試してもらってます。あと Peer.js というライブラリを使っているので、開発者にログを見てもらって、setRemoteDescriptio()でコケたとかいうのが分かるので、それで見てもらいます。それでも解決しなかったら、ログを収集して、結構シンプルなところで落ちていることが多いので、例えばAPIキーが間違っているとか、そういう手段を使っています。
</p>

<p>
<b class="speaker ago">吾郷</b> 
うちの場合は一緒に開発してくださっているベンダーさんといろいろやり取りしながら、その上で状態が分かるエクステンションを使ったりすることはあるのですが、一般ユーザーの方が情報を得られるというかたちでは現状できていないです。
</p>

<p>
<b class="speaker minamoto">源</b>
この（資料のページ）の下二つは良いですね。「現地に見に行く」と、「超能力で透視する」（笑）。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
社内だと（見に行くは）ありますよね？
</p>

<p>
<b class="speaker minamoto">源</b>
そういうこともやりたいのですけど、なかなか難しいんですよね。現地見に行こうとすると片道4時間かかるからこの日飛ぶよねーとかもあるので、現地見に行くというのはなかなか厳しいなーと思います。でもそれって、情報欲しいじゃないですか？どうやって収集するのかと考えるんですけど、そこのネットワーク構成教えてくださいと言っても、ネットワーク構成した人がすでにいなかったりするので、そうすると全然わからないんですよね。なので現地見に行くっていうのはかなり難しいなと思います。
<br />
WebRTC界隈の人で集まると、<strong>だいたいの人が超能力で透視している</strong>ので、ちょっとそれはどうなんだろうなーと思ったりします（笑）。
</p>

<h2>サーバサイドもつらい？</h2>

<p>
<b class="speaker ganeko">我如古</b> 
残り時間も少なくなってきたので、最後サーバーサイドの話をしたいと思います。WebRTCでブラウザ同士がP2P通信するというので最初やろうとすると私も躓いたのですが、なんだサーバーが要るじゃないの、全然嘘じゃんと思うんですよね。
</p>

<p>いろんな環境で使おうとすると(TURNなど)サーバーの種類が増えて、さらに大規模に使おうとするとサーバーこそがちゃんと作らないと繋がらないということになりますよね。その辺を聞いてみたいと思います。
</p>

<p>シグナリングはどうされていますか？　既存の互換の仕組みを使うケースもあるし、独自の仕組みを作るケースもあるし、あるいはサービスを使うケースもあると思うんですけど？
</p>

<p>
<b class="speaker ago">吾郷</b> 
うちの場合は自社ではなくて、一緒に開発しているところの方を使っています。どこがお勧めか、と書かれているのですが、正直なところケースバイケースで、簡単に言えば金額が高いところは丸っと収まる回答になると思うのですが、なかなかそういう（高い金額を出す）のも難しかったりすると、選択は難しいです。</p>

<p>実際、シグナリングサーバーの安定性だとか、通信の繋がる/繋がらないの問題だとかに関して、どのくらいノウハウを持っていてそれが製品に反映されていくのかというのが、外から見ているとほとんど分からないというのがあるので、ここはかなり難しい問題だなと思ってます。
</p>

<p>
<b class="speaker alen">アレン</b> 
自社で持っています。おすすめするならSkyWayです（笑）。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
これで違うのが出てきたらびっくりしますね（笑）。
</p>

<p>
<b class="speaker minamoto">源</b>
SkyWayさん、すごく検証されていますもんね。えっと、うちも自社で持っています。ちょっと前まで違う物を使っていたのですが、最近(node.jsの)Socket.ioという流行りのものに変えてみようかなーと、一人で画策しています。なので、実装的にはWebSocketになります。</p>

<p>ただ、WebSocket意外と抜けないんです。WebSocket抜けないのにWebRTC抜けるというネットワークが平然と存在しているのが結構断崖でして、抜けるという点においては、XHRとかSSE(Server Sent Events)とかは意外と普通に抜けるので、接続系だけでもそっちにした方がよいのかなと思いつつも、クライアントの負荷が増大するので、難しいなと思っている今日この頃ですね。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
ありがとうございます。シグナリングが終わってもSTUN/TURNといったNAT/Firewallを超えるためのサーバーを使うと思いますが、こちらも自分で運用するか、他社のを使うか。自分で運用にするにしても（地理的に）地球上のどこに置くか、というのがあると思うのですが、その辺はどんなか考えを持たれていますか？
</p>

<p>
<b class="speaker ago">吾郷</b> 
うちの場合はシグナリングサーバーと同じように外部で提供してもらっているサーバーを使用しています。地理的なところで言うとUSのAWSの中なんですが、ただ使ってて実際に国内to国内でTURNを使った環境っていうので通信をすることがあるのですが、その辺に関して直接繋げるときと比べてすごく遅延が発生しているという感覚はそこまで大きくないですね。</p>

<p>今のところここに関しては、そんなに問題になってないです。もちろんこちらに、日本に置いてほしいという要望は上げてはいるのですが、そこに関しては現状そこまで大きな問題とは認識していないです。
</p>

<p>
<b class="speaker alen">アレン</b> 
TURNサーバーも自社で提供しております。これは弊社のCloudnというクラウドサービスに乗っているので日本にあります。
主にお客様が日本のかたが多いので、あまりそれで問題はないです。ただ今後世界中に展開したいという話があります。
</p>

<p>
<b class="speaker minamoto">源</b>
採用しているアーキテクチャの都合上TURNサーバーというのはほとんど使わない仕様にもなっているんですけれども、TURNサーバー自体は通信会社ですので、自社の基盤の上に持っています。当然日本にあります。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
そうすると次の質問はあんまり問題にならないのでしょうかね？ TURNサーバーお金かかりますよねということを聞こうと思ったのですが、基盤を持っている会社さんはあまりその辺は気にならないというところがあるのでしょうか？
</p>

<p>
<b class="speaker minamoto">源</b>
気にならないというとこももちろんあるんですけれども、そもそもTURNを使うというのはそれなりにレアケースなので、普通に提供していたとしてもそれほど気にならないです。というのは、1サーバーTURNで立っているくらいの認識ですね。
</p>

<p>
<b class="speaker alen">アレン</b> 
SkyWayでもかなり接続数がありますけども、今のところTURN 1台で足りておりますので、あんまりそこは気にしておりません。
</p>

<p>
<b class="speaker ago">吾郷</b> 
うちの場合もお願いしているので具体的にどういう風にスケール対策をしているかというところまで、こちらから大きく踏み込んで何か調査だとか依頼だとかしていることではないのですが、ただWebRTCを使うときのコストに関して言うとおそらくTURNサーバーを使うかどうかというところで非常に大きく変わるのかなと思っていまして、ここはやっぱりどんぐらいお金を払うかというところにかなり依存します。</p>

<p>最初に使うだけで結構金額がかかるっていう会社さんと、TURNサーバーを使うかどうかで金額が変わる会社さんと、2種類あって、TURNサーバーを使うかどうかはその辺でかなり変わってくるのですが。</p>

<p>この質問のスケーリングというところだけに関して言うと、外部のベンダーさんに依頼している場合はそこまで問題にならない。うちの場合もTURNサーバーが遅いだとか、止まるっていう事態に関してはそこまで問題にはなっていないので。
</p>

<p>
<b class="speaker minamoto">源</b>
平均1日1万セッションのSkyWayさんでもTURNが1台でよいというのは、何か元気が湧いてきますね（笑）。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
ほとんどTURNを使わずに済むということですね。
</p>

<p>
<b class="speaker minamoto">源</b>
でかいコスト要因だと思うんですけどもね。
</p>

<p><br></p>

<h2>会場からのQ&amp;A</h2>

<p>
<b class="speaker ganeko">我如古</b> 
この辺りで来場のみなさんの質問を受けつけたいと思います。何か質問とかある方は、手を挙げてください。
</p>

<p>
<strong>会場から1</strong> 
貴重な話ありがとうございます。つながらない問題にちょっと近いところなんですけれども、弊社で社内で利用するためにシグナリングサーバー立ててやろうとしているんですけれども、DataChannel使ったファイル転送みたいなことをやろうとしていて、ファイルのサイズがそんなに大きくない間は比較的安定稼働するんですけれども、ファイルが100MB, 1GB、10GBというふうになってくると、ネットワークの帯域の問題は置いておいたとしても、ブラウザが応答しなくなるとか、受け側が突然何にも言わなくなるみたいな事象が出てしまっていて、何をどうしたらよいのか分からないという感じになってしまっているのですが、もしそのあたり何かお知恵があれば教えていただきたいなと思っております。
</p>

<p>
<b class="speaker alen">アレン</b> 
弊社で使っているものは結構細かく、数百キロバイトぐらいに分けて送っております。たしか、そこを直接書いていないので正確には覚えていませんが、たしかバッファーが足りないとかの問題で上手くいかないので、細かく分けて送る方法の方が良いともいます。
</p>

<p>
<strong>会場から1</strong> 
いまPeer.jsに手を入れて使っているんですけども、SkyWayさんのライブラリだとそのあたりがもう少し安定するという感じなんですね？
</p>

<p>
<b class="speaker alen">アレン</b> 
そこはPeer.jsの実装と同じなので、アプリ側で分けて送信するという仕組みが必要になります。
</p>

<p>
<strong>会場から1</strong> 
ありがとうございます
</p>

<p><b class="speaker ganeko">我如古</b> 
他にいかがでしょうか？
</p></p>

<p>
<strong>会場から2</strong> 
SkyWayに関して質問です。SkyWayを使ってアプリを作ろうとしているんですが、SkyWayは同時接続に関してどれぐらいのテストをされているのですか？
</p>

<p>
<b class="speaker alen">アレン</b> 
（同時接続に関しては）テストはそれほどしておりません。ただ今のところ同時接続数が多すぎて落ちたことはないと思います。仕様上、WebSocketの接続は、同時10万セッション可能としております。ただそこまで上がったことがないので、なんとも。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
今の（質問）はシグナリングサーバーの接続数のことでしょうか？　それともブラウザ側の接続数のことでしょうか？
</p>

<p>
<strong>会場から2</strong> 
シグナリングする時にクライアント側から一気に同時接続かかった場合、サーバーがもつのかどうか？　という話なんですが
</p>

<p>
<b class="speaker alen">アレン</b> 
今のところ問題になるような接続数はないですが。
</p>

<p>
<strong>会場から2</strong> 
（今後）もしかしたらあるかもしれない、ということですよね。分かりました。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
何か最後言い残したこととか、他の人に聞いてみたいこととかあれば、一人ずつどうぞ。
</p>

<p>
<b class="speaker minamoto">源</b>
言い残したところという訳でもないのですが、原則的には繋がるテクノロジーなので、特に問題はないとは思っています。
先ほどの同時接続の話にしても、サーバー側が受け付けられる上限よりも、ブラウザー側が同時に通信できる上限の方が先に到達してしまうので、ボトルネック要素というのは常に変わっていくのかな、と思っています。
</p>

<p>
<b class="speaker ago">吾郷</b> 
実際ちゃんとしたビデオ会議システムと言いますか、すごく大手の方が作られているものと同じものを作ろうとすると、WebRTCというのは全然まだまだ発展途上で辛いという問題が多いのですが、ただそうでない方法、クラウド上で簡単に通話だとか会話だとか、もしくはP2Pのデータ送信ができるというところで捉えると、もっとかなり可能性の大きいものなんじゃないかと、思っています。

それであれば今でも十分使えるし、ユースケースもこれからももっともっと広がっていく、広げていくところに、価値があるんじゃないかと私は考えています。
</p>

<p>
<b class="speaker alen">アレン</b> 
じゃあ二人に質問があるんですけれど、WebRTCって本当に毎月何かが変わっているんですけど、変更にどうやって追い付いていくかを、ちょっとお聞きしたいんですけれど。結構いろいろ参加しているのに、結構落としているところがあるので、そこだけ。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
じゃあ、一言ずつどうでしょう？
</p>

<p>
<b class="speaker minamoto">源</b>
どうやって追い付くかという点においては、テストするしかないです。これは新しいChromeブラウザが出ると一通りの機能についてはちゃんとテストをしています。
</p>

<p>
<b class="speaker ago">吾郷</b> 
うちの場合には基本的には外部の会社さんにお願いしているというのと、弊社でも実際これを使いながら仕事をしているので、その上で見つけていく、自分たちでドッグフーディングしていく、ということしかないかなと思います。
</p>

<p>
<b class="speaker minamoto">源</b>
一言だけ追加で。http://webrtcjp.info/ というページがあるんですね。これは確かSkyWayの方々やっておられると思うんですけど、そこにslackがあります。このslack、結構今回登壇している方だとかが入っています。なので質問するとすぐ答えてくれます。WebRTC開発やろうという方は、とりあえずつまったらそのSlackに投稿してみてください。だれか答えてくれるはずです。しかも、かなり高い精度で答えてきます。
</p>

<p>
<b class="speaker ganeko">我如古</b> 
では、これで終わりたいと思います。どうもありがとうございました。
</p>
]]></content:encoded>
			</item>
		<item>
		<title>SkyWay iOS/Android SDKを使って、WebRTCアプリを開発しよう</title>
		<link>/sho-y/17863/</link>
		<pubDate>Thu, 24 Dec 2015 00:00:53 +0000</pubDate>
		<dc:creator><![CDATA[山村 奨]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[SkyWay]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">/?p=17863</guid>
		<description><![CDATA[連載： WebRTCプラットフォーム ”SkyWay” 入門 (5)連載5回目の今回は、12月にアップグレードされたSkyWayのiOS/Android用SDKのチュートリアルをお届けします。 iOS/Android用S...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/skyway-tutorial/" class="series-314" title="WebRTCプラットフォーム ”SkyWay” 入門" data-wpel-link="internal">WebRTCプラットフォーム ”SkyWay” 入門</a> (5)</div><p>連載5回目の今回は、12月にアップグレードされたSkyWayのiOS/Android用SDKのチュートリアルをお届けします。</p>

<p>iOS/Android用SDKを使うことで、SkyWayの特徴である「WebRTCを使ったP2P通信を簡単に実現」することができます。
また、APIもJavaScript版とほぼ同じで、JavaScript版をすでに利用されている方にも実装しやすく、JavaScript/iOS/Android間での通信もサポートしています。</p>

<p>この記事では、そんなiOS/AndroidのSDKの利用方法を、それぞれサンプルアプリのビルド方法や解説を交えながらご紹介していきます。</p>

<p>まずは、iOSのサンプルアプリのビルド方法からご紹介します。Androidのみ開発される方は読み飛ばしてください。</p>

<h2>iOSのサンプルアプリのビルド方法</h2>

<p>まず、まだSkyWayに登録されていない方は<a href="http://nttcom.github.io/skyway/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SkyWayのサイト</a>から開発者登録を行ってください。その際の利用可能ドメインですが、ドメインをお持ちでない方は「localhost」等、適当な文字列を指定してください。</p>

<p>次に、iOS SDKをダウンロードします。<br />
iOS SDKの<a href="https://github.com/nttcom/SkyWay-iOS-SDK/releases/latest" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ダウンロードページ</a>にアクセスして下さい。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/12/ios_sdk_DL.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/ios_sdk_DL.png" alt="iOS SDKのダウンロード方法" width="640" height="622" class="alignnone size-full wp-image-17963" srcset="/wp-content/uploads/2015/12/ios_sdk_DL.png 640w, /wp-content/uploads/2015/12/ios_sdk_DL-300x292.png 300w, /wp-content/uploads/2015/12/ios_sdk_DL-207x201.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>ページ下部のDownloadsからダウンロードして下さい。
解凍したフォルダの中に「SkyWay.framework」というものが入っており、これがiOS SDK本体になります。</p>

<p>次はサンプルアプリプログラムのダウンロードを行います。<br />
SkyWay-iOS-Sampleの<a href="https://github.com/nttcom/SkyWay-iOS-Sample" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">レポジトリ</a>をクローンするかダウンロードを行って下さい。（下図はダウンロードする場合）
<a href="https://html5experts.jp/wp-content/uploads/2015/12/ios_sample_DL.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/ios_sample_DL.png" alt="iOSサンプルアプリのダウンロード方法" width="640" height="525" class="alignnone size-full wp-image-17964" srcset="/wp-content/uploads/2015/12/ios_sample_DL.png 640w, /wp-content/uploads/2015/12/ios_sample_DL-300x246.png 300w, /wp-content/uploads/2015/12/ios_sample_DL-207x170.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>次に、サンプルアプリのフォルダにはSDKが含まれていないので、サンプルアプリプロジェクトにSDKを入れます。
<a href="https://html5experts.jp/wp-content/uploads/2015/12/ios_sample_sdkcopy.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/ios_sample_sdkcopy.png" alt="iOS SDKのコピー" width="640" height="334" class="alignnone size-full wp-image-17875" srcset="/wp-content/uploads/2015/12/ios_sample_sdkcopy.png 640w, /wp-content/uploads/2015/12/ios_sample_sdkcopy-300x157.png 300w, /wp-content/uploads/2015/12/ios_sample_sdkcopy-207x108.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>先ほどのSkyWay.frameworkを「SkyWay-iOS-Sample &gt; frameworks」内にコピーします。</p>

<p>サンプルアプリを動かすためには、開発者登録をした際のAPIキーとドメインを設定する必要があります。<br />
では、サンプルアプリプロジェクトを開いて設定してみましょう。</p>

<p>SkyWay-iOS-Sample.xcodeprojをXcode（本記事ではVersion 7.1.1）で開き、<br />
SkyWay-iOS-Sample &gt; SkyWay-iOS-Sample内の「DataConnectionViewController.m」を開きます。</p>

<p></p><pre class="crayon-plain-tag">//
// MediaConnectionViewController.m
// SkyWay-iOS-Sample
//

#import "MediaConnectionViewController.h"

#import &lt;AVFoundation/AVFoundation.h&gt;

#import &lt;SkyWay/SKWPeer.h&gt;

#import "AppDelegate.h"
#import "PeersListViewController.h"


// Enter your APIkey and Domain
// Please check this page. &gt;&gt; https://skyway.io/ds/
static NSString *const kAPIkey = @"yourAPIKEY";
static NSString *const kDomain = @"yourDomain";


typedef NS_ENUM(NSUInteger, ViewTag)
{
  TAG_ID = 1000,
  TAG_WEBRTC_ACTION,
  TAG_REMOTE_VIDEO,
  TAG_LOCAL_VIDEO,
};</pre><p></p>

<p>コードの上方部分に、上図のような箇所があるので、ここにAPIキーとドメインを設定して保存しましょう。</p>

<p>「MediaConnectionViewController.m」にも同様の箇所があるため、こちらも修正します。
<a href="https://html5experts.jp/wp-content/uploads/2015/12/ios_sample_Build.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/ios_sample_Build.png" alt="iOSサンプルアプリのビルド" width="640" height="492" class="alignnone size-full wp-image-17897" srcset="/wp-content/uploads/2015/12/ios_sample_Build.png 640w, /wp-content/uploads/2015/12/ios_sample_Build-300x231.png 300w, /wp-content/uploads/2015/12/ios_sample_Build-207x159.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>ここまで終わったら、ビルドする端末を接続・選択して、ビルドをします。
以上がiOSのサンプルアプリのビルド方法です。</p>

<p>次はAndroidのサンプルアプリのビルド方法をご紹介します。
iOSのみ開発される方は飛ばしてください。</p>

<h2>Androidのサンプルアプリのビルド方法</h2>

<p>まずはiOSと同じく、まだSkyWayに登録されていない方は<a href="http://nttcom.github.io/skyway/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SkyWayのサイト</a>から開発者登録を行ってください。その際の利用可能ドメインですが、ドメインをお持ちでない方は「localhost」等、適当な文字列を指定してください。</p>

<p>次に、Android SDKをダウンロードします。<br />
Android SDKの<a href="https://github.com/nttcom/SkyWay-Android-SDK/releases/latest" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ダウンロードページ</a>にアクセスして下さい。
<a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sdk_DL.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sdk_DL.png" alt="Android SDKのダウンロード方法" width="640" height="525" class="alignnone size-full wp-image-17966" srcset="/wp-content/uploads/2015/12/android_sdk_DL.png 640w, /wp-content/uploads/2015/12/android_sdk_DL-300x246.png 300w, /wp-content/uploads/2015/12/android_sdk_DL-207x170.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>ページ下部のDownloadsからダウンロードして下さい。
解凍したフォルダの中に「SkyWay.aar」というものが入っており、これがAndroid SDK本体になります。</p>

<p>次はサンプルアプリプログラムのダウンロードを行います。<br />
SkyWay-Android-Sampleの<a href="https://github.com/nttcom/SkyWay-Android-Sample" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">レポジトリ</a>をクローンするかダウンロードを行って下さい。（下図はダウンロードする場合）
<a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sample_DL.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sample_DL.png" alt="Androidサンプルアプリのダウンロード方法" width="640" height="525" class="alignnone size-full wp-image-17967" srcset="/wp-content/uploads/2015/12/android_sample_DL.png 640w, /wp-content/uploads/2015/12/android_sample_DL-300x246.png 300w, /wp-content/uploads/2015/12/android_sample_DL-207x170.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>次に、サンプルアプリにはSDKが含まれていないので、サンプルアプリ内にSDKを入れます。
<a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sample_sdkcopy.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sample_sdkcopy.png" alt="Android SDKのコピー" width="640" height="377" class="alignnone size-full wp-image-17911" srcset="/wp-content/uploads/2015/12/android_sample_sdkcopy.png 640w, /wp-content/uploads/2015/12/android_sample_sdkcopy-300x177.png 300w, /wp-content/uploads/2015/12/android_sample_sdkcopy-207x122.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>先ほどのSkyWay.aarを「app &gt; libs」内にコピーします。</p>

<p>サンプルアプリを動かすためには、開発者登録をした際のAPIキーとドメインを設定する必要があります。<br />
では、サンプルアプリプロジェクトを開いて設定してみましょう。</p>

<p>サンプルアプリのフォルダををAndroid Studio（本記事ではVersion 1.4）で開き、<br />
app &gt; src &gt; main &gt; java &gt; io.skyway.testpeerjava 内の「DataActivity.java」を開きます。</p>

<p></p><pre class="crayon-plain-tag">package io.skyway.testpeerjava;

import ...   //省略


public class DataActivity
    extends Activity
{
  private static final String TAG = DataActivity.class.getSimpleName();

  private Peer           _peer;
  private DataConnection _data;
  private Handler _handler;
  private String   _id;
  private String[] _listPeerIds;
  private Boolean  _bConnecting;
  private Runnable     _runAddLog;
  private List&lt;String&gt; _aryLogs;
  private Bitmap _image;


  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);

    Window wnd = getWindow();
    wnd.addFlags(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.activity_chat);
    _handler = new Handler(Looper.getMainLooper());

    Context context = getApplicationContext();


    //////////////////////////////////////////////////////////////////////
    //////////////////  START: Initialize Peer ///////////////////////////
    //////////////////////////////////////////////////////////////////////


    // connect option
    PeerOption options = new PeerOption();

    // Please check this page. &gt;&gt; https://skyway.io/ds/
    //Enter your API Key and registered Domain.
    options.key = "";
    options.domain = "";

    // PeerOption has many options. Please check the document. &gt;&gt; http://nttcom.github.io/skyway/docs/

    _peer = new Peer(context, options);
    setPeerCallback(_peer);</pre><p></p>

<p>コードの上方部分に、上図のような箇所があるので、ここにAPIキーとドメインを設定して保存しましょう。</p>

<p>「MediaActivity.java」にも同様の箇所があるため、こちらも修正します。
<a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sample_Build.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sample_Build.png" alt="Androidサンプルアプリのビルド" width="640" height="471" class="alignnone size-full wp-image-17913" srcset="/wp-content/uploads/2015/12/android_sample_Build.png 640w, /wp-content/uploads/2015/12/android_sample_Build-300x221.png 300w, /wp-content/uploads/2015/12/android_sample_Build-207x152.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>ここまで終わったらビルドを行い、端末を選択します。
以上がAndroidのサンプルアプリのビルド方法です。</p>

<p>では、コードを参考にしながら、簡単にAPIの使い方を見ていきましょう。</p>

<h2>ビデオチャットのコード</h2>

<p>iOSとAndroidの二種類のSDKをご紹介をしましたが、この二つのAPIは細かいところを除いては、ほぼ同じです。また、サンプルアプリのコードもほぼ似通ったものとなっています。<br />
そのため、ここではAndroidのビデオチャットのコードを参考にしながら、簡単にAPIの使い方をご紹介します。</p>

<p>また、WebRTC技術についての説明は割愛します。
詳しいWebRTCの仕組みについては、がねこまさしさんが書かれたコチラの記事をお読みください: <a href="https://html5experts.jp/mganeko/5554/" data-wpel-link="internal">壁を越えろ！WebRTCでNAT/Firewallを越えて通信しよう</a></p>

<p>ではまず、APIの使い方の前に、サンプルアプリの動作を確認します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sample_seq1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sample_seq1.png" alt="android_sample_seq1" width="640" height="569" class="alignnone size-full wp-image-17940" srcset="/wp-content/uploads/2015/12/android_sample_seq1.png 640w, /wp-content/uploads/2015/12/android_sample_seq1-300x267.png 300w, /wp-content/uploads/2015/12/android_sample_seq1-207x184.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/12/android_sample_seq2.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/12/android_sample_seq2.png" alt="android_sample_seq2" width="640" height="569" class="alignnone size-full wp-image-17937" srcset="/wp-content/uploads/2015/12/android_sample_seq2.png 640w, /wp-content/uploads/2015/12/android_sample_seq2-300x267.png 300w, /wp-content/uploads/2015/12/android_sample_seq2-207x184.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>このように、</p>

<ul>
<li>シグナリングサーバ<sup>*1</sup>との接続とPeerIDの取得</li>
<li>自分の映像の取得と表示</li>
<li>PeerIDの一覧取得</li>
<li>選択したPeerIDへの通話呼び出し</li>
<li>相手の映像の取得と表示</li>
</ul>

<p>を行う、とてもシンプルなアプリです。</p>

<p>では、この動作に沿ってコードを見ていきましょう。<br />
まずは、SkyWayとのサーバとの接続です。</p>

<p></p><pre class="crayon-plain-tag">//////////////////////////////////////////////////////////////////////
    //////////////////  START: Initialize SkyWay Peer ////////////////////
    //////////////////////////////////////////////////////////////////////

    // Please check this page. &gt;&gt; https://skyway.io/ds/
    PeerOption options = new PeerOption();

    //Enter your API Key.
    options.key = "";
    //Enter your registered Domain.
    options.domain = "";


    // SKWPeer has many options. Please check the document. &gt;&gt; http://nttcom.github.io/skyway/docs/

    _peer = new Peer(context, options);
    setPeerCallback(_peer);

    //////////////////////////////////////////////////////////////////////
    ////////////////// END: Initialize SkyWay Peer ///////////////////////
    //////////////////////////////////////////////////////////////////////</pre><p></p>

<p>ここではSkyWayのシグナリングサーバとの接続を行っています。</p>

<p>まず、接続を行う時のオプションをPeerOptionクラスで設定します。<br />
このクラスでまず必須なのは、SkyWayを利用するためには必須となる「APIキー」や「ドメイン」の設定です。<br />
そのほかにも、SkyWayが提供するTURNサーバの利用を選択する「turn」プロパティや、自前のSTUN/TURNサーバを設定する「config」プロパティ等の設定が可能です。もっと詳しく知りたい方は<a href="https://nttcom.github.io/skyway/docs/#Android-peeroption" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ドキュメント</a>をご参照ください。</p>

<p>次に16行目では、このオプションを使ってシグナリングサーバと接続を行っています。<br />
このPeerクラスはシグナリングサーバとの接続を管理しており、「connect/call」メソッドでのP2Pのデータ/メディア通信の開始や、「listAllPeers」メソッドでのAPIキー毎のアクティブなPeerIDを取得、などができます。<br />
実際にサンプルアプリでは、「Calling」というボタンを押すとlistAllPeersメソッドを呼び出し、PeerID一覧の取得を行っています。</p>

<p>続いて17行目では、このPeerオプジェクトのコールバックを設定しています。<br />
コールバックの説明の前に、ローカルの映像取得部分を見てみます。</p>

<p></p><pre class="crayon-plain-tag">//////////////////////////////////////////////////////////////////////
    ////////////////// START: Get Local Stream   /////////////////////////
    //////////////////////////////////////////////////////////////////////
    Navigator.initialize(_peer);
    MediaConstraints constraints = new MediaConstraints();
    MediaStream _msLocal = Navigator.getUserMedia(constraints); 

    Canvas canvas = (Canvas) findViewById(R.id.svSecondary);
    canvas.addSrc(_msLocal, 0);

    //////////////////////////////////////////////////////////////////////
    //////////////////// END: Get Local Stream   /////////////////////////
    //////////////////////////////////////////////////////////////////////</pre><p></p>

<p>ここでは、ローカルの映像取得を行って、得た映像ストリームをViewに表示しています。<br />
NavigatorオブジェクトのgetUserMediaメソッドを呼び出すことで、MediaSteamオブジェクトの映像ストリームを得ることができます。その際に、MediaConstraintsというオプションを指定することで、映像/音声の利用可否の指定、インカメラ/アウトカメラの指定、などを行うことができます。</p>

<p>また、CanvasクラスはGLSurfaceViewを継承しており、得た映像ストリームはCanvasオブジェクトのaddSrcメソッドで表示することができます(iOSのSKWVideoオブジェクトはUIViewを継承しています)。</p>

<p>では、話を戻してPeerオブジェクトのコールバックを見てみましょう。</p>

<p></p><pre class="crayon-plain-tag">//////////////////////////////////////////////////////////////////////////////////
    ///////////////////// START: Set SkyWay peer callback   //////////////////////////
    //////////////////////////////////////////////////////////////////////////////////
    // 簡単のため、適宜、省略しています

    // !!!: Event/Open
    peer.on(Peer.PeerEventEnum.OPEN, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // シグナリングサーバと接続された
        _id = (String) object;

        updateUI();
      }
    });

    // !!!: Event/Call
    peer.on(Peer.PeerEventEnum.CALL, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // 相手から通話がかかってきた
        _media = (MediaConnection) object;

        _media.answer(_msLocal);

        setMediaCallback(_media);

        updateUI();
      }
    });

    // !!!: Event/Close
    peer.on(Peer.PeerEventEnum.CLOSE, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // シグナリングサーバとの接続ステータスがdestroyedとなった
      }
    });

    // !!!: Event/Disconnected
    peer.on(Peer.PeerEventEnum.DISCONNECTED, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // シグナリングサーバとの接続ステータスがdisconnectedとなった
      }
    });

    // !!!: Event/Error
    peer.on(Peer.PeerEventEnum.ERROR, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // 何かしらのエラーが発生した
      }
    });

    //////////////////////////////////////////////////////////////////////////////////
    /////////////////////// END: Set SkyWay peer callback   //////////////////////////
    //////////////////////////////////////////////////////////////////////////////////</pre><p></p>

<p>ここでは、シグナリングサーバから送られたイベントに対し、処理を行っています。</p>

<p>7行目は、シグナリングサーバとの接続が確立した際の「OPEN」イベントでの処理です。<br />
ここでのObjectは、シグナリングサーバから自分に割り当てられたPeerIDが格納されており、サンプルアプリでは、そのPeerIDを表示しています。PeerIDはnew Peer時にIDを指定することもできますし、指定せずにランダムなIDを取得することもできます。</p>

<p>20行目では、他のPeerから通話がかかってきた際の「CALL」イベントでの処理です。<br />
ここでのObjectはMediaConnectionクラスであり、answerメソッドを呼ぶことで、先ほど作成した自分の映像ストリームを返しています。引数を与えないことで、映像ストリームを返さないことも可能です。<br />
そのあと、30行目でMediaConnectionのコールバックを設定しています。</p>

<p>このように、相手からの通話を受ける際は、Peerオブジェクトのコールバック内で「CALL」イベントで処理を行います。<br />
自分から通話する場合は、下記のようにPeerオブジェクトのcallメソッドを呼びます。</p>

<p></p><pre class="crayon-plain-tag">//////////////////////////////////////////////////////////////////////
    ////////////////// START: Calling SkyWay Peer   //////////////////////
    //////////////////////////////////////////////////////////////////////
    // 簡単のため、適宜、省略しています

    CallOption option = new CallOption();

    _media = _peer.call(strPeerId, _msLocal, option);

    setMediaCallback(_media);

    //////////////////////////////////////////////////////////////////////
    /////////////////// END: Calling SkyWay Peer   ///////////////////////
    //////////////////////////////////////////////////////////////////////</pre><p></p>

<p>この部分は、listAllPeersメソッドで得られたPeerIdの一覧から、通話したいPeerIDをタップした時に呼ばれます。</p>

<p>このように、呼び出し時のオプションを設定し（このコードでは何も設定していませんが）、通話をしたいPeerIDと自分の映像ストリームを指定してcallメソッドを実行します。返り値は通話がかかってきた際と同様、MediaConnectionクラスで、MediaConnectionのコールバックを設定しています。</p>

<p>では、MediaConnectionのコールバックを見てみましょう。</p>

<p></p><pre class="crayon-plain-tag">//////////////////////////////////////////////////////////////////////////////////
    //////////////  START: Set SkyWay peer Media connection callback   ///////////////
    //////////////////////////////////////////////////////////////////////////////////
    // 簡単のため、適宜、省略しています

    // !!!: MediaEvent/Stream
    media.on(MediaConnection.MediaEventEnum.STREAM, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        _msRemote = (MediaStream) object;

        Canvas canvas = (Canvas) findViewById(R.id.svPrimary);
        canvas.addSrc(_msRemote, 0);
      }
    });

    // !!!: MediaEvent/Close
    media.on(MediaConnection.MediaEventEnum.CLOSE, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        Canvas canvas = (Canvas) findViewById(R.id.svPrimary);
        canvas.removeSrc(_msRemote, 0);

        _msRemote = null;
        _media = null;

        updateUI();
      }
    });

    // !!!: MediaEvent/Error
    media.on(MediaConnection.MediaEventEnum.ERROR, new OnCallback()
    {
      @Override
      public void onCallback(Object object)
      {
        // 何かしらのエラーが発生した
      }
    });

    //////////////////////////////////////////////////////////////////////////////////
    ///////////////  END: Set SkyWay peer Media connection callback   ////////////////
    //////////////////////////////////////////////////////////////////////////////////</pre><p></p>

<p>7行目は、通話相手の映像ストリームを取得した際の「STREAM」イベントでの処理です。ここでのObjectは、MediaStreamオブジェクトです。自分の映像ストリームと同じくCanvasオブジェクトを利用して表示しています。</p>

<p>20行目では、通話相手との通話が切断された際の「CLOSE」イベントでの処理です。</p>

<p>ここまでが、簡単なSkyWayを使ったWebRTCの処理になります。</p>

<p>最後に、最近のアップデートで追加されたメソッドについてご紹介します。</p>

<p></p><pre class="crayon-plain-tag">Button switchCameraAction = (Button)findViewById(R.id.switchCameraAction);
    switchCameraAction.setOnClickListener(new View.OnClickListener()
    {
      @Override
      public void onClick(View v)
      {
        Boolean result = _msLocal.switchCamera();
        if(true == result)
        {
          //Success
        }else
        {
          //Failed
        }
      }
    });</pre><p></p>

<p>MediaStreamオブジェクトがローカルの映像ストリームの場合、switchCameraメソッドを呼び出すことができます。<br />
これにより、今まではできなかった、「getUserMedia後のインカメラ/アウトカメラ切り替え」が可能になります。</p>

<p>以上が、サンプルアプリの簡単なコード解説になります。今回はビデオチャットだけの紹介でしたが、ほぼ同じようなAPIでテキストや画像が送れるデータチャットも可能です。</p>

<h2>おわりに</h2>

<p>今回は、SkyWayのiOS/Android用SDKのチュートリアルをお届けしました。</p>

<p>JavaScript版と同じように、手軽にWebRTCが利用可能です。
是非ご自身のアプリケーションに組み込んでみてください！</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTCプラットフォーム ”SkyWay” 入門]]></series:name>
	</item>
		<item>
		<title>SkyWay ScreenShareを使ってWebRTCの画面共有機能を実装しよう</title>
		<link>/yusuke-naka/16445/</link>
		<pubDate>Fri, 28 Aug 2015 00:00:15 +0000</pubDate>
		<dc:creator><![CDATA[仲 裕介]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[SkyWay]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[Webアプリ]]></category>

		<guid isPermaLink="false">/?p=16445</guid>
		<description><![CDATA[連載： WebRTCプラットフォーム ”SkyWay” 入門 (4)連載4回目の今回は、7月28日にリリースされた、SkyWay ScreenShareのチュートリアルをお届けします。 SkyWay ScreenShar...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/skyway-tutorial/" class="series-314" title="WebRTCプラットフォーム ”SkyWay” 入門" data-wpel-link="internal">WebRTCプラットフォーム ”SkyWay” 入門</a> (4)</div><p>連載4回目の今回は、7月28日にリリースされた、<a href="https://github.com/nttcom/SkyWay-ScreenShare" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">SkyWay ScreenShare</a>のチュートリアルをお届けします。</p>

<p>SkyWay ScreenShareは、WebRTCのWebアプリケーションで画面共有を簡単に実装できるライブラリ、画面共有に必要なChrome・Firefox向けのExtensionが簡単に実装できるソースコードが含まれています。</p>

<h1>画面共有機能の概要</h1>

<p>WebRTCの画面共有機能は、ブラウザ画面やPCのデスクトップ画面をリアルタイムで相手に配信できる機能です。</p>

<div id="attachment_16475" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/08/skyway_ss_sc1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/skyway_ss_sc1-640x262.png" alt="Chromeでの画面共有の様子" width="640" height="262" class="size-large wp-image-16475" srcset="/wp-content/uploads/2015/08/skyway_ss_sc1.png 640w, /wp-content/uploads/2015/08/skyway_ss_sc1-300x123.png 300w, /wp-content/uploads/2015/08/skyway_ss_sc1-207x85.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Chromeでの画面共有の様子</p></div>

<p>WebRTCの画面共有機能はChrome 34以上または、Firefox 33以上で利用可能です。</p>

<h4>Chromeでの実装</h4>

<p>画面共有機能は、Chrome 26で初めてブラウザに実装されました。当初は、Chromeの<code>chrome://flags</code>から<code>Enable screen capture support in getUserMedia()</code>というフラグをONにし、<code>getUserMedia()</code>のオプションを指定することで、実現できていました。しかし、セキュリティ上の問題からChrome 34でそのフラグが削除され、代わりにChrome Extensionをインストールするか、Chrome Appsからしか利用できなくなりました。</p>

<h4>Firefoxでの実装</h4>

<p>Firefoxについては、Firefox 33から画面共有機能が実装されています。Firefoxの場合は、Chromeとは方式が異なり、<code>about:config</code>の<code>media.getusermedia.screensharing.enabled</code>という設定を<code>true</code>に設定し、<code>media.getusermedia.screensharing.allowed_domains</code>という設定項目に、画面共有機能を許可するWebサイトのドメインを追加することで利用できるようになります。また、<code>media.getusermedia.screensharing.allowed_domains</code>には、Mozillaが許可したサービスのドメインが予め設定されています。こちらにドメインを追加してもらいたい場合は、<a href="https://wiki.mozilla.org/Screensharing" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">このサイト</a>の下部に掲載されているフォームから申請が可能です。（筆者は申請したことはありませんが、恐らく審査があると思われます）</p>

<h4>標準化の状況</h4>

<p>WebRTCのJavaScriptAPIの標準化はW3Cで行われています。この画面共有機能についても、今年の２月に仕様書が作られて標準化が進められています。仕様書は<a href="http://w3c.github.io/mediacapture-screen-share/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">「Screen Capture」</a>です。仕様書についての詳細な解説は割愛しますが、現在、ChromeとFirefoxで実装されている画面共有機能はブラウザベンダごとの独自実装であり、今後実装が変更になる可能性は高いと考えられます。</p>

<h1>SkyWay ScreenShareの使い方〜ビルド編〜</h1>

<p>ここからSkyWay ScreenShareの使い方を説明します。はじめに、<a href="https://github.com/nttcom/SkyWay-ScreenShare/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">github.com/nttcom/SkyWay-ScreenShare</a>からファイル一式をローカル環境にcloneして下さい。また、ここに書いている内容の詳細は<a href="https://github.com/nttcom/SkyWay-ScreenShare/blob/master/README_ja.md" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">README</a>にも掲載していますので、合わせてご覧ください。</p>

<h4>Chrome Extensionの作成</h4>

<p>まずはマニフェストファイルを修正します。JSONファイルのひな形にそって必要な項目を入力して下さい。アイコンファイルも必要です。</p>

<p></p><pre class="crayon-plain-tag">{
  "name": "Your extension name here",
  "short_name": "Your extension short_name here",
  "version": "Your extension version number here",
  "manifest_version": 2,
  "description": "Your extension description here",
  "icons": {
    "16": "icon16.png",
    "48": "icon48.png",
    "128": "icon128.png"
  },
  "permissions": [
    "desktopCapture",
    "tabs"
  ],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "content_scripts": [{
    "matches": [""],
    "js": ["content.js"],
    "all_frames": true,
    "run_at": "document_end"
  }]
}</pre><p></p>

<p>尚、ここで重要なのは <code>matches</code>です。ここには、このExtensionのりようを許可するWebサイトのURLを記載します。必ずご自身のWebサイトのURLを指定して下さい。ワイルドカードを利用して複数のURLにマッチさせることも可能ですが、その場合は、あなたのExntensionを他のWebサイトで利用される可能性があります。セキュリティ上もよろしくありません。</p>

<p></p><pre class="crayon-plain-tag">例："matches": ["https://*.skyway.io/*"]</pre><p></p>

<p>次にビルドしましょう。SkyWay-ScreenShareではビルド用のgulpタスクとnpm-scriptでエイリアスコマンドを用意しています。SkyWay-ScreenShareディレクトリの直下で、次の２行のコマンドを実行します。npmコマンドは事前に使えるようにしておいて下さい。</p>

<p></p><pre class="crayon-plain-tag">npm install
npm run build-chrome</pre><p></p>

<p>ビルドが完了したら、出来上がったファイルをChromeに読み込ませましょう。<code>chrome://extensions/</code> にアクセスし、<code>デベロッパーモード</code>を有効にします。そして、<code>パッケージ化されていない拡張機能を読み込む</code>をクリックし、以下のディレクトリを指定します。</p>

<p></p><pre class="crayon-plain-tag">SkyWay-ScreenShare/chrome-extension/screenshare_chrome_extension/</pre><p></p>

<p>読み込むと以下のようになります。（この画像はChromeウェブストアからダウンロードしたものが写っています）</p>

<div id="attachment_16513" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/08/skyway_ss_sc2.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/skyway_ss_sc2-640x386.png" alt="Chrome Extensionを読み込みます" width="640" height="386" class="size-large wp-image-16513" srcset="/wp-content/uploads/2015/08/skyway_ss_sc2.png 640w, /wp-content/uploads/2015/08/skyway_ss_sc2-300x181.png 300w, /wp-content/uploads/2015/08/skyway_ss_sc2-207x125.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Chrome Extensionを読み込みます</p></div>

<p>また、ディレクトリと同一フォルダにある<code>screenshare_chrome_extension.zip</code>は、Chromeウェブストアにアップロードする際に利用できます。</p>

<p>これでChrome Extensionの作成は完了です。</p>

<h4>Firefox Extensionの作成</h4>

<p><small>（注意）SkyWay-ScreenShareのリポジトリには、「Firefox Add-On」という表記で記載しておりますが、画面共有機能を利用するために作成するモノは、Firefox Extension（拡張機能）となります。Add-OnはFirefoxの拡張機能やテーマ等全ての総称となるため、リポジトリの表記とは異なりますが、本記事中では、Firefox Extensionと表記を統一させて頂きます。</small></p>

<p>Firefox Extensionでは、メインプログラムとパッケージファイルの二つを修正します。まずは、メインプログラムです。</p>

<p></p><pre class="crayon-plain-tag">var pageMod = require('sdk/page-mod');
var self = require('sdk/self');
var __temp = require('chrome');
var Cc = __temp.Cc;
var Ci = __temp.Ci;

var domains_to_add = [''];
var addon_domains = [];
var allowed_domains_pref = 'media.getusermedia.screensharing.allowed_domains';
var enable_screensharing_pref = 'media.getusermedia.screensharing.enabled';

 ~~ 省略 ~~</pre><p></p>

<p>ここでは<code>domains_to_add = [''];</code>に、画面共有機能を有効にするWebサイトのドメインを指定して下さい。指定方法は以下のようになります。</p>

<p></p><pre class="crayon-plain-tag">例：domains_to_add = ['*.skyway.io']</pre><p></p>

<p>次にパッケージファイルを修正します。ここではExtensionの基本情報を入力していきます。ひな形にそって必要な情報を入力して下さい。アイコンファイルも必要です。</p>

<p></p><pre class="crayon-plain-tag">{
    "name": "your_add-on_name_here",
    "title": "Your add-on title here",
    "description": "Your add-on description here",
    "author": "Your add-on author here",
    "version": "Your add-on version number here",
    "license": "Your add-on license here",
    "homepage": "Your add-on homepage url here",
    "icon64": "icon64.png",
    "icon": "icon48.png"
}</pre><p></p>

<p>次にFirefox Extensionのビルドに必要なツール「cfx」をインストールします。インストール方法は<a href="https://dev.mozilla.jp/addon-sdk-docs/dev-guide/tutorials/installation.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">この</a>サイトを参考にして下さい。</p>

<p>ツールのインストールが完了したら、まずはプレビルド（pre build）を行います。ExtensionをビルドするためにはランダムなIDを予めパッケージファイルに記載しておく必要があるため、初回のプレビルドで、パッケージファイルにIDを挿入しています。</p>

<p></p><pre class="crayon-plain-tag">npm install
npm run pre-build-firefox</pre><p></p>

<p>初回のプレビルドでIDが挿入された場合、以下の様なエラーが発生します。これは問題ありません。</p>

<p></p><pre class="crayon-plain-tag">No 'id' in package.json: creating a new ID for you.
package.json modified: please re-run 'cfx xpi'</pre><p></p>

<p>再度以下の通り、ビルドを行って下さい。</p>

<p></p><pre class="crayon-plain-tag">npm run build-firefox</pre><p></p>

<p>ビルドが完了したら、Firefoxに読み込ませて動作確認を行いましょう。<code>about://addons</code>にアクセスし、作成したExtension本体である、<code>SkyWay-ScreenShare/firefox-addon/screenshare_firefox_addon.xpi</code>をドラッグ・アンド・ドロップさせます。</p>

<div id="attachment_16512" style="width: 650px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2015/08/skyway_ss_sc3.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/skyway_ss_sc3-640x484.png" alt="Firefox Extensionを読み込みます" width="640" height="484" class="size-large wp-image-16512" srcset="/wp-content/uploads/2015/08/skyway_ss_sc3.png 640w, /wp-content/uploads/2015/08/skyway_ss_sc3-300x227.png 300w, /wp-content/uploads/2015/08/skyway_ss_sc3-207x157.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">Firefox Extensionを読み込みます</p></div>

<p>Firefox Extensionの配布は、通常のWebサーバ上に上記xpiファイルを設置し行って下さい。</p>

<p>これでFirefox Extensionの作成は完了です。</p>

<h4>JavaScriptライブラリの作成</h4>

<p>SkyWay-ScreenShareには今まで作成したExtensionを利用するためのJavaScriptライブラリ「screenshare.js」が同梱されています。自分でビルドする場合は、以下のように行って下さい。</p>

<p></p><pre class="crayon-plain-tag">npm install
npm run build-library</pre><p></p>

<p>ビルドに成功すると、以下の通りライブラリが生成されます。</p>

<p></p><pre class="crayon-plain-tag">SkyWay-ScreenShare/dist/screenshare.js
SkyWay-ScreenShare/dist/screenshare.min.js</pre><p></p>

<p>また、ライブラリはCDNでも提供しています。</p>

<p></p><pre class="crayon-plain-tag">&lt;script src="https://skyway.io/dist/screenshare.js"&gt;&lt;/script&gt;
&lt;script src="https://skyway.io/dist/screenshare.min.js"&gt;&lt;/script&gt;</pre><p></p>

<p>最後に、ライブラリの修正や機能追加などは大歓迎です。TypeScriptのソースファイルを同梱していますので、その際はご利用下さい。Pull Reqestもお待ちしています！</p>

<h1>SkyWay ScreenShareの使い方〜アプリ開発編〜</h1>

<p>ExtensionとJavaScriptライブラリの準備ができたところで、同梱している<a href="https://github.com/nttcom/SkyWay-ScreenShare/blob/master/sample" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">サンプルアプリケーション</a>を例に、画面共有機能を使ったアプリの開発方法をご紹介します。</p>

<p>まず、newでオブジェクトを作成します。debugオプションを指定するとコンソールログにデバッグログが出力されます。</p>

<p></p><pre class="crayon-plain-tag">// スクリーンキャプチャの準備
var screen = new SkyWay.ScreenShare({debug: true});</pre><p></p>

<p>次に、<code>startScreenShare()メソッド</code>を利用して、画面共有機能を開始するためのコードを実装していきます。このメソッドの第一引数には、取得する映像の縦横サイズとフレームレートを指定します。第二引数のコールバック関数は、正しく取得できた場合に呼ばれ引数として<code>Stream Object</code>が返ってきます。これをVideo要素に入れてあげれば画面が表示されます。</p>

<p>また、第四引数についてはChromeのみ利用できるオプショナルなコールバック関数で、画面共有が何らかの方法で終了した場合に呼ばれます。Firefoxでは現状終了検知が出来ないため、Chrome限定です。</p>

<p><code>screen.isEnabledExtension()</code> はExtensionが利用しているブラウザで有効かどうか（インストール済みかどうかも含めて）を判定します。</p>

<p></p><pre class="crayon-plain-tag">// スクリーンシェアを開始
$('#start-screen').click(function () {
	if(screen.isEnabledExtension()){
			screen.startScreenShare({
					Width: $('#Width').val(),
					Height: $('#Height').val(),
					FrameRate: $('#FrameRate').val()
			},function (stream){
					$('#my-video').prop('src', URL.createObjectURL(stream));
					if(existingCall != null){
							var _peerid = existingCall.peer;
							existingCall.close();
							var call = peer.call(_peerid, stream);
							step3(call);
					}
					localStream = stream;

			},function(error){
					console.log(error);
			},function(){
					alert('ScreenShareを終了しました');
			});
	}else{
			alert('ExtensionまたはAddonをインストールして下さい');
	}

});</pre><p></p>

<p>次に、画面共有をプログラム側で終了させる場合のコードを実装していきます。現在は終了のための専用メソッドは用意していません。先ほど取得した<code>Stream Object</code>を保持しておき、終了したいタイミングで<code>stop()メソッド</code>を読んで下さい。これで、画面共有が止まります。いずれ、<code>Stream Object</code>の管理機能を実装する予定なので、その時には専用のメソッドを用意します。</p>

<p></p><pre class="crayon-plain-tag">// スクリーンシェアを終了
$('#stop-screen').click(function () {
	localStream.stop();
});</pre><p></p>

<p>アプリ開発方法の紹介は以上です。</p>

<h1>おわりに</h1>

<p>今回は、SkyWay-ScreenShareを使った、WebRTCの画面共有機能の実装方法をご紹介しました。画面共有機能は様々なユースケースで活用できる機能ですので、是非ご自身のアプリケーションに組み込んでみてください！</p>

<p>次回は、同じく7月28日にリリースされたSkyWay-DrivingVehicleについてのチュートリアルをお届けいたします。</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTCプラットフォーム ”SkyWay” 入門]]></series:name>
	</item>
		<item>
		<title>SkyWay音声認識機能を使ってみよう！</title>
		<link>/iwase/16439/</link>
		<pubDate>Wed, 26 Aug 2015 00:00:22 +0000</pubDate>
		<dc:creator><![CDATA[岩瀬 義昌]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[SkyWay]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[Webアプリ]]></category>

		<guid isPermaLink="false">/?p=16439</guid>
		<description><![CDATA[連載： WebRTCプラットフォーム ”SkyWay” 入門 (3)連載3回目の今回は、SkyWayの付加機能としてリリースされているSkyWay音声認識機能の利用方法についてお届けいたします。SkyWay音声認識機能と...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/skyway-tutorial/" class="series-314" title="WebRTCプラットフォーム ”SkyWay” 入門" data-wpel-link="internal">WebRTCプラットフォーム ”SkyWay” 入門</a> (3)</div><p>連載3回目の今回は、SkyWayの付加機能としてリリースされているSkyWay音声認識機能の利用方法についてお届けいたします。SkyWay音声認識機能とは、クライアント（ブラウザ側）でマイク等を通じて入力した自由発話音声を、サーバ（SkyWay側）と連携して、文字列として受け取る機能のことです。いますぐ試してみたい方は、<a href="https://nttcom.github.io/SkyWay-SpeechRec/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">デモサイト</a>から試用可能です。(注：WebSocketが疎通する環境でないと、正常に動作しません)</p>

<p>同様の機能を実現するAPIとして、Speech Recognition APIがありますが、<a href="http://caniuse.com/#feat=speech-recognition" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">caniuse.com</a>でも示されるように対応するブラウザが限定されています。SkyWay音声認識機能では、標準では対応していないFirefox等のブラウザも対応可能です。</p>

<h2>準備</h2>

<p>以降で記載するサンプルコードの中で、SkyWayが提供しているAPIキーが必要となります。実際にお手元で試される場合は、<a href="http://nttcom.github.io/skyway/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SkyWay公式サイト</a>から開発者登録を行ってください。本記事のサンプルで利用するには、利用可能ドメインに「localhost」と書いた、APIキーを取得する必要があります。</p>

<h2>今回作成するサンプル</h2>

<p>作成するサンプルは、「音声認識を開始するボタン」と「認識結果を表示するエリア」の2要素のみで構成するシンプルな音声認識アプリケーションです。</p>

<p>スクリーンショットはこちらです。</p>

<div id="attachment_16440" style="width: 583px" class="wp-caption alignnone"><a href="https://html5experts.jp/wp-content/uploads/2015/08/Screen-Shot-2015-08-11-at-11.40.08.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/Screen-Shot-2015-08-11-at-11.40.08.png" alt="SkyWay音声認識スクリーンショット" width="573" height="212" class="size-full wp-image-16440" srcset="/wp-content/uploads/2015/08/Screen-Shot-2015-08-11-at-11.40.08.png 573w, /wp-content/uploads/2015/08/Screen-Shot-2015-08-11-at-11.40.08-300x111.png 300w, /wp-content/uploads/2015/08/Screen-Shot-2015-08-11-at-11.40.08-207x77.png 207w" sizes="(max-width: 573px) 100vw, 573px" /></a><p class="wp-caption-text">SkyWay音声認識スクリーンショット</p></div>

<p>こちらを構成しているサンプルコードは以下の通りです。</p>

<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html lang="ja"&gt;
&lt;head&gt;
	&lt;title&gt;SkyWay Speech Recognition Sample&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;!-- 音声認識開始用のボタン、および結果表示用のエリア --&gt;
&lt;button id="start_rec"&gt;start&lt;/button&gt;
&lt;div id="result"&gt;&lt;/div&gt;

&lt;!-- 必要なライブラリ群の読み込み  --&gt;
&lt;script src="https://code.jquery.com/jquery-1.11.3.min.js"&gt;&lt;/script&gt;
&lt;script src="https://skyway.io/dist/msgpack.codec.js"&gt;&lt;/script&gt;
&lt;script src="https://skyway.io/dist/libspeexdsp.js"&gt;&lt;/script&gt;
&lt;script src="https://skyway.io/dist/resampler.min.js"&gt;&lt;/script&gt;
&lt;script src="https://skyway.io/dist/speechrec.min.js"&gt;&lt;/script&gt;

&lt;!-- 音声認識用のコードサンプル --&gt;
&lt;script&gt;
SpeechRec.config({
   'SkyWayKey':'3969c30a-2789-4e46-9155-79a188256633',
   'OpusWorkerUrl':'libopus.worker.js'
});

$("#start_rec").click(function(){
	SpeechRec.start();
	console.log("音声認識を開始します");
});

SpeechRec.on_proc(function(info){
	console.log(info.volume);
});

SpeechRec.on_result(function(result){
    console.log(result.candidates);
    $("#result").text(result.candidates[0].speech);
});
&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p>上記HTMLを任意の名前で保存してください。本記事ではsample.htmlという名前で保存します。また、htmlを格納するディレクトリと同じ階層に</p>

<ul>
<li><a href="https://skyway.io/dist/libopus.js" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">libopus.js</a></li>
<li><a href="https://skyway.io/dist/libopus.worker.js" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">libopus.worker.js</a></li>
</ul>

<p>の2ファイルを保存して置いてください。音声認識に必要なライブラリとなります。　</p>

<h2>動かしてみよう</h2>

<p>既にApacheやNginxをインストールされている場合はそちらも活用できますが、今回はpythonからシンプルなWebサーバを起動してみます。コマンドは<code>python -m SimpleHTTPServer</code>です。</p>

<p>localhostの8000番でWebサーバが起動するので、<code>http://localhost:8000/sample.html</code>へ、Chrome/Firefox/Operaのいずれかでアクセスしてみましょう。画面が表示されたら、「start」ボタンをクリックすると、マイク使用許可確認のポップアップが表示されますので、Allow/許可を押下します。その後に自由に発話して、適当なタイミングで発話をやめてください。音声認識結果が上手くいくと、数秒以内に音声認識結果の文字列が表示されます。</p>

<h2>コードのポイント解説</h2>

<p>SkyWay音声認識機能を利用するためには、大きく分けて2つの処理が必要になります。</p>

<h3>1. コンフィグの設定・コールバックの設定</h3>

<p>まず<code>SpeechRec.config</code>関数を利用して、SkyWayKeyおよびlibopus.worker.jsへのパスを設定します。サンプルでは、以下のようにconfigを設定しています。</p>

<p></p><pre class="crayon-plain-tag">SpeechRec.config({
   'SkyWayKey':'3969c30a-2789-4e46-9155-79a188256633',
   'OpusWorkerUrl':'libopus.worker.js'
});</pre><p></p>

<p><code>SpeechRec.config</code>には、その他のパラメータも設定可能であり、<a href="https://github.com/nttcom/SkyWay-SpeechRec/blob/gh-pages/README.md#speechrecconfig" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ドキュメント</a>から確認できます。</p>

<p>次に各種コールバックの設定をします。サンプルでは2種類のコールバックを設定しています。</p>

<p></p><pre class="crayon-plain-tag">SpeechRec.on_proc(function(info){
	console.log(info.volume);
});

SpeechRec.on_result(function(result){
    console.log(result.candidates);
    $("#result").text(result.candidates[0].speech);
});</pre><p></p>

<p>1つ目の<code>on_proc</code>は、発話時の音声ボリュームを取得できた場合に発火するコールバック関数です。サンプルでは、コンソール画面に音量を表示するようにしています。</p>

<p>2つ目の<code>on_result</code>は、音声認識結果を取得できた場合に発火するコールバック関数です。サンプルでは、結果をコンソール画面に表示する処理、および<code>#result</code>で指定されるdivエリアに、音声認識結果を書き込む処理をしています。</p>

<p>サンプルでは分かりやすいように、コールバックを2つのみしか設定していませんが、実際にはさらに多くのコールバックを設定可能です。詳細は<a href="https://github.com/nttcom/SkyWay-SpeechRec/blob/gh-pages/README.md#コールバック関数一覧" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">コールバック関数一覧</a>をご確認ください。</p>

<h3>2. 開始・停止の実行</h3>

<p>コンフィグおよびコールバックの設定が完了したら、実際に音声認識を開始・停止するための関数を呼び出します。サンプルでは、<code>#start_rec</code>ボタンがクリックされた際に呼び出す<code>SpeechRec.start</code>が、音声認識を開始するための処理に該当します。</p>

<p></p><pre class="crayon-plain-tag">$("#start_rec").click(function(){
	SpeechRec.start();
	console.log("音声認識を開始します");
});</pre><p></p>

<p>なお、開始だけではなく任意のタイミングで音声認識を終了させる<code>SpeechRec.stop</code>等もあります(サンプルでは省略)。その他の関数は<a href="https://github.com/nttcom/SkyWay-SpeechRec#音声認識制御用関数の一覧" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ドキュメント</a>から確認いただけます。</p>

<h2>おわりに</h2>

<p>いかがでしたでしょうか。今回はSkyWayの付加機能である、音声認識機能について解説いたしました。</p>

<p>次回は画面共有を簡単に実現するSkyWayScreenShareライブラリについてお届けします。</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTCプラットフォーム ”SkyWay” 入門]]></series:name>
	</item>
		<item>
		<title>SkyWay MultiPartyを使ってグループチャットを作ろう</title>
		<link>/sakkuru/16397/</link>
		<pubDate>Mon, 24 Aug 2015 00:00:21 +0000</pubDate>
		<dc:creator><![CDATA[本間 咲来]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[SkyWay]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[Webアプリ]]></category>

		<guid isPermaLink="false">/?p=16397</guid>
		<description><![CDATA[連載： WebRTCプラットフォーム ”SkyWay” 入門 (2)連載2回目の今回は、7月28日にリリースされたライブラリ、SkyWay MultiPartyのチュートリアルをお届けします。 SkyWay MultiP...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/skyway-tutorial/" class="series-314" title="WebRTCプラットフォーム ”SkyWay” 入門" data-wpel-link="internal">WebRTCプラットフォーム ”SkyWay” 入門</a> (2)</div><p>連載2回目の今回は、7月28日にリリースされたライブラリ、SkyWay MultiPartyのチュートリアルをお届けします。
SkyWay MultiPartyは、一言で言うと多人数によるビデオ・テキストチャットを『簡単に』作るためのライブラリです。</p>

<p>本ライブラリを使用することで、グループビデオチャットやテキストチャットを、
ほんの20行程度のJavaScriptコードで実装をすることができます。</p>

<p>サンプルコードを用意していますので、手元で実行しながら進めてみましょう。</p>

<h2>10行ビデオチャット</h2>

<p>以下のスクリーンショットをご覧ください。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/08/video-top.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/video-top-640x464.png" alt="videoチャットサンプル" width="640" height="464" class="alignnone size-large wp-image-16407" srcset="/wp-content/uploads/2015/08/video-top.png 640w, /wp-content/uploads/2015/08/video-top-300x218.png 300w, /wp-content/uploads/2015/08/video-top-207x150.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>まずはこのような複数人が参加できるビデオチャットシステムを、10行程度のJavaScriptコードで実装してみましょう。
サンプルコードを以下に記載します。</p>

<p></p><pre class="crayon-plain-tag">&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;script src="https://code.jquery.com/jquery-1.11.3.min.js"&gt;&lt;/script&gt;
  &lt;script src="https://skyway.io/dist/0.3/peer.min.js"&gt;&lt;/script&gt;
  &lt;script src="https://skyway.io/dist/multiparty.min.js"&gt;&lt;/script&gt;
  
  &lt;style&gt; video { width:200px; } &lt;/style&gt;

&lt;/head&gt;
&lt;body&gt;

  &lt;div id="streams"&gt;&lt;/div&gt;

&lt;script&gt;

  // MultiParty インスタンスを生成
  multiparty = new MultiParty( {
    "key": "********-****-****-****-************"  /* SkyWay keyを指定 */
  });

  multiparty.on('my_ms', function(video) {
    // 自分のvideoを表示
    var vNode = MultiParty.util.createVideoNode(video);
    $(vNode).appendTo("#streams");
  }).on('peer_ms', function(video) {
    // peerのvideoを表示
    var vNode = MultiParty.util.createVideoNode(video);
    $(vNode).appendTo("#streams");
  }).on('ms_close', function(peer_id) {
    // peerが切れたら、対象のvideoノードを削除する
    $("#"+peer_id).remove();
  });

  // サーバとpeerに接続
  multiparty.start()

&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p>早速動かしてみましょう。</p>

<p>上のコードを、<code>videochat.html</code>という名前で保存します。</p>

<p>19行目でSkyWayのAPIキーが必要となりますので、使用する際は<a href="http://nttcom.github.io/skyway/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SkyWay</a>から開発者登録を行ってください。
本サンプルで使用するには、利用可能ドメインに『localhost』と書いて、APIキーを取得する必要があります。</p>

<p>PCにApacheやNginxなどのサーバがインストールされている場合は、そちらで動かしても問題ありませんが、
入っていない場合は、以下の様にPythonのコマンドでWebサーバを起動できます。</p>

<p></p><pre class="crayon-plain-tag">python -m SimpleHTTPServer</pre><p></p>

<p>localhostの8000番ポートでWebサーバが起動するので、Chrome、Firefox、Operaのいずれかのブラウザでアクセスしてみましょう。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/08/video1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/video1-640x464.png" alt="videoチャットサンプル" width="640" height="464" class="alignnone size-large wp-image-16406" srcset="/wp-content/uploads/2015/08/video1.png 640w, /wp-content/uploads/2015/08/video1-300x218.png 300w, /wp-content/uploads/2015/08/video1-207x150.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>次に別のタブやブラウザで、もう2、3個同じページを開いてみます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/08/video-all.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/video-all-640x309.png" alt="複数人のグループvideoチャット" width="640" height="309" class="alignnone size-large wp-image-16404" srcset="/wp-content/uploads/2015/08/video-all.png 640w, /wp-content/uploads/2015/08/video-all-300x145.png 300w, /wp-content/uploads/2015/08/video-all-207x100.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>複数人参加のビデオチャットが実装できていることがわかります。</p>

<h2>ビデオチャットのコード</h2>

<p>それではコードを見てみましょう。</p>

<p>今回はjQueryを使用するので、4行目でjQueryを読み込んでいます。
(SkyWay MultiPartyを使用するのにjQueryが必須というわけではありません)
5行目と6行目で、SkyWayライブラリ(peer.min.js)とSkyWay MultiPartyライブラリ(multiparty.min.js)を読み込んでいます。
13行目で、ビデオを表示するためのdivを1つ用意しています。</p>

<p>18〜33行目がJavaScriptコードです。大きくMultiPartyオブジェクトの生成部分と、イベントハンドラ部分に分かれています。</p>

<p>SkyWay MultiPartyでは、最初にコンストラクタを呼ぶことで MultiPartyオブジェクトを生成します。引数にはAPIキーが必要となります。</p>

<p></p><pre class="crayon-plain-tag">// MultiParty インスタンスを生成
  multiparty = new MultiParty( {
    "key": "********-****-****-****-************"  /* SkyWay keyを指定 */
  });</pre><p></p>

<p>続くコードがmultipartyオブジェクトのイベントハンドラになります。</p>

<p></p><pre class="crayon-plain-tag">multiparty.on('my_ms', function(video) {
    // 自分のvideoを表示
    var vNode = MultiParty.util.createVideoNode(video);
    $(vNode).appendTo("#streams");

  }).on('peer_ms', function(video) {
    // peerのvideoを表示
    var vNode = MultiParty.util.createVideoNode(video);
    $(vNode).appendTo("#streams");

  }).on('ms_close', function(peer_id) {
    // peerが切れたら、対象のvideoノードを削除する
    $("#"+peer_id).remove();
  });</pre><p></p>

<p>SkyWay MultiPartyでは、</p>

<p></p><pre class="crayon-plain-tag">multiparty.on('イベント名', コールバック関数)</pre><p></p>

<p>の形式で、イベントハンドラを設定することができます。</p>

<p>サンプルでは3つのイベントに対し、ハンドラを定義していることがわかります。</p>

<p>1つ目が<code>'my_ms'</code>で、これは自分のメディアストリームの準備が整った際に発生するイベントです。メディアストリームとは取得した映像や音声を扱うためのオブジェクトで、例えばPCのカメラやマイクから取得した映像・音声がこれにあたります。
コールバックとして呼ばれる関数には、メディアストリームから生成したオブジェクトURLとidがオブジェクトとして渡されます。
ライブラリにはそのオブジェクトからvideoノードを生成するユーティリティが用意されていますので、それを使用しvideoノードを生成・表示しています。</p>

<p>2つ目は、<code>'peer_ms'</code>というイベントに対するコールバックで、これはチャットの相手(peer)のメディアストリームを取得する準備が整った際に発生するイベントです。
こちらも自分のメディアストリームと場合と同様、videoノードを生成・表示しています。</p>

<p>3つ目のイベントは<code>'ms_close'</code>で、peerのメディアストリームの切断を検知した際に発生します。
このコールバックでは、peerのvideoノードを削除する処理を書いています。</p>

<p>以上で、ビデオチャット機能を実装することができました。</p>

<h2>10行テキストチャット</h2>

<p>続いてテキストチャット機能も実装してみましょう。</p>

<p>まず、テキストの入力と表示を行うためのHTML要素を追加します。
以下のコードを『&lt;div id=&quot;streams&quot;&gt;&lt;/div&gt;』の下に追加してみましょう。</p>

<p></p><pre class="crayon-plain-tag">&lt;div&gt;
    &lt;form&gt;
      &lt;input type="text"&gt;&lt;button type="submit"&gt;send&lt;/button&gt;
    &lt;/form&gt;
    &lt;div id="message"&gt;&lt;/div&gt;
  &lt;/div&gt;</pre><p></p>

<p>次に、以下のJavaScriptコードを、『&lt;/script&gt;』の前に追加します。</p>

<p></p><pre class="crayon-plain-tag">//テキストを入力し、submitしたとき
  $("form").on("submit", function(ev) {

    //onsubmitのデフォルト動作（reload）を抑制
    ev.preventDefault();

    //テキストを取得
    var $input = $(this).find("input[type=text]"); 
    var data = $input.val();
    $input.val("");

    //テキストを表示
    $("#message").append(data + "&lt;br&gt;");

    //peerにメッセージを送信
    multiparty.send(data);

  });

  // peerからテキストメッセージを受信したとき
  multiparty.on('message', function(mesg) {
    $("#message").append(mesg.data + "&lt;br&gt;");
  });</pre><p></p>

<p>それでは先ほどのページをリロードしてみましょう。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/08/text11.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/text11-640x536.png" alt="textチャットサンプル" width="640" height="536" class="alignnone size-large wp-image-16416" srcset="/wp-content/uploads/2015/08/text11.png 640w, /wp-content/uploads/2015/08/text11-300x251.png 300w, /wp-content/uploads/2015/08/text11-207x173.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>入力フォームが追加されたことがわかります。
文字を入力し、エンターキーを押すと、そのテキストが表示されます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/08/text-all.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/text-all-640x382.png" alt="複数人のグループチャット" width="640" height="382" class="alignnone size-large wp-image-16403" srcset="/wp-content/uploads/2015/08/text-all.png 640w, /wp-content/uploads/2015/08/text-all-300x179.png 300w, /wp-content/uploads/2015/08/text-all-207x124.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>他のタブや、ブラウザから入力したテキストも表示できることが確認できます。</p>

<h2>テキストチャットのコード</h2>

<p>それではコードを見てみましょう。
テキストチャットのコードは、データを送信する際の処理と、データを受信する際の処理に分かれています。</p>

<p>以下のコードで、テキストが入力され、送信されるまでの処理を記述しています。</p>

<p></p><pre class="crayon-plain-tag">//テキストを入力し、submitしたとき
$("form").on("submit", function(ev) {

  //onsubmitのデフォルト動作（reload）を抑制
  ev.preventDefault();

  //テキストを取得
  var $input = $(this).find("input[type=text]"); 
  var data = $input.val();
  $input.val("");

  //テキストを表示
  $("#message").append(data + "&lt;br&gt;");

  //peerにメッセージを送信
  multiparty.send(data);

});</pre><p></p>

<p>multiparty.send()で、テキストをそのまま送信していることがわかります。</p>

<p>そして以下の部分で、メッセージを受信した際に発生するイベント<code>'message'</code>に対する、コールバックを設定しています。</p>

<p></p><pre class="crayon-plain-tag">// peerからテキストメッセージを受信したとき
multiparty.on('message', function(mesg) {
  $("#message").append(mesg.data + "&lt;br&gt;");
});</pre><p></p>

<p>簡易ではありますが、テキストチャットを実現することができました。</p>

<h3>おわりに</h3>

<p>今回は、SkyWay MultiPartyを使ったビデオ・テキストチャットの作り方をお届けしました。
少しのコードで簡単に実装できることがお分かりいただけたかと思います。</p>

<p>次回は、同じく7月28日にリリースされたSkyWay音声認識APIについてのチュートリアルをお届けいたします。</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTCプラットフォーム ”SkyWay” 入門]]></series:name>
	</item>
		<item>
		<title>ビデオチャット＆テキストチャット作成チュートリアル！WebRTCを簡単＆柔軟に使える「SkyWay」を使ってみよう</title>
		<link>/katsura/16331/</link>
		<pubDate>Thu, 06 Aug 2015 00:00:06 +0000</pubDate>
		<dc:creator><![CDATA[桂健太]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[SkyWay]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[Webアプリ]]></category>

		<guid isPermaLink="false">/?p=16331</guid>
		<description><![CDATA[連載： WebRTCプラットフォーム ”SkyWay” 入門 (1)WebRTCを簡単に利用するためのプラットフォームSkyWayをご存知ですか？本連載では、WebRTCを簡単に利用するためのプラットフォームSkyWay...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/skyway-tutorial/" class="series-314" title="WebRTCプラットフォーム ”SkyWay” 入門" data-wpel-link="internal">WebRTCプラットフォーム ”SkyWay” 入門</a> (1)</div><p>WebRTCを簡単に利用するためのプラットフォームSkyWayをご存知ですか？本連載では、WebRTCを簡単に利用するためのプラットフォームSkyWayについて、基本的なチュートリアルから、各種ライブラリの紹介までしていきます。</p>

<p>連載第1回目である今回は、まず、WebRTCの基本的な説明をした後に、実際にSkyWayを使って、ビデオチャットの作成とデータチャンネルを使ったチャットの作成をしていきます。</p>

<h2>WebRTCとは</h2>

<p>WebRTCとは、ブラウザやアプリ間でビデオや音声、データのやり取りをP2P(Peer to Peer)で行うことを可能にする規格です。
従来のビデオチャットは互換性のない独自技術で実装されていましたが、WebRTCはオープン標準として仕様が作成・公開されており、相互接続が保証されています。</p>

<p>また、ブラウザで動作することから特別なアプリケーションをインストールする必要がありませんし、すでにあるウェブアプリケーションに埋め込むことで、シームレスにビデオチャットを動かすこともできます。さらに、オープンソースのコードを利用することで、ブラウザだけに限らず、ネイティブアプリにWebRTCを組み込むことも可能です。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/image_webrtc.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/image_webrtc.png" alt="image_webrtc" width="640" height="193" class="alignnone size-full wp-image-16352" srcset="/wp-content/uploads/2015/07/image_webrtc.png 640w, /wp-content/uploads/2015/07/image_webrtc-300x90.png 300w, /wp-content/uploads/2015/07/image_webrtc-207x62.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h2>WebRTCの仕組み</h2>

<p>WebRTCはビデオ等のデータをP2Pでやり取りすることが出来ますが、実際にブラウザ間で直接接続をするためには、まず、互いに自分のIPアドレス／ポート番号等の情報を教え合わなければなりません。一般的に、この情報交換を行うためにシグナリングサーバというサーバを用意する必要があります。
<div id="attachment_16353" style="width: 650px" class="wp-caption alignnone"><a href="https://html5experts.jp/wp-content/uploads/2015/07/skyway_signaling.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/skyway_signaling-640x226.png" alt="交換する情報はIPアドレス、ポート番号以外にもいくつかあります。" width="640" height="226" class="size-large wp-image-16353" srcset="/wp-content/uploads/2015/07/skyway_signaling.png 640w, /wp-content/uploads/2015/07/skyway_signaling-300x106.png 300w, /wp-content/uploads/2015/07/skyway_signaling-207x73.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">※交換する情報はIPアドレス、ポート番号以外にもいくつかあります。</p></div></p>

<p>また、お互いがNATの内側に存在する場合やFirewallの内側にいる場合、シグナリングサーバだけでは接続することができません。そのために利用するのが、STUN／TURNサーバです。ここでは具体的な説明は省略しますが、作成したアプリケーションをユーザに広く使ってもらうためには、これらのサーバも用意する必要があります。</p>

<p>(詳細を知りたい方は、がねこまさしさんが書かれたコチラの記事をお読みください: <a href="https://html5experts.jp/mganeko/5554/" target="_blank" data-wpel-link="internal">壁を越えろ！WebRTCでNAT/Firewallを越えて通信しよう</a>)</p>

<h2>SkyWayとは</h2>

<p>今までの説明を見てWebRTCは「大変そうだ」と思った方は多いと思います。実際、シグナリングサーバやSTUN/TURNサーバを用意するのは容易ではないです。</p>

<p>そこで登場するのがWebRTC開発者向けプラットフォーム「SkyWay」です。SkyWayは、以下の図で示す通り、複雑なシグナリング処理を担うAPI郡とJavascriptライブラリ／Android,iOSライブラリ、STUN/TURNサーバで構成されています。</p>

<p>このSkyWayを利用することで、シグナリングサーバやSTUN/TURNサーバを独自に用意する必要はなく、開発者はP2P通信部分のプログラミングにのみ集中することができます。</p>

<h2>利用者登録が必要です</h2>

<p>SkyWayは現在トライアルサービス中で、誰でも無料で使うことができます。さっそくウェブサイトから利用者登録をしてみましょう。</p>

<p><a href="http://skyway.io/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">http://skyway.io/</a></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss01.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss01.png" alt="ss01" width="640" height="445" class="alignnone size-full wp-image-16355" srcset="/wp-content/uploads/2015/07/ss01.png 640w, /wp-content/uploads/2015/07/ss01-300x209.png 300w, /wp-content/uploads/2015/07/ss01-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>「登録を行う」ボタンをクリックして、開発者登録画面に向かいます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss02.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss02.png" alt="ss02" width="640" height="445" class="alignnone size-full wp-image-16356" srcset="/wp-content/uploads/2015/07/ss02.png 640w, /wp-content/uploads/2015/07/ss02-300x209.png 300w, /wp-content/uploads/2015/07/ss02-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>必要事項を入力します。ここで入力するドメイン名は、セキュリティ向上を目的として行っているOriginチェックのために必要となっています。ここの<b>ドメイン名は開発者登録後に変更可能</b>ですので、まずは「localhost」とだけ入力しておいてください。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss03.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss03.png" alt="ss03" width="640" height="445" class="alignnone size-full wp-image-16357" srcset="/wp-content/uploads/2015/07/ss03.png 640w, /wp-content/uploads/2015/07/ss03-300x209.png 300w, /wp-content/uploads/2015/07/ss03-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>登録が正常に完了したら、ログインページへ行き、ログインしてください。ログインが完了すると以下の画面のような開発者ダッシュボードが表示されます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss04.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss04-640x445.png" alt="ss04" width="640" height="445" class="alignnone size-large wp-image-16358" srcset="/wp-content/uploads/2015/07/ss04.png 640w, /wp-content/uploads/2015/07/ss04-300x209.png 300w, /wp-content/uploads/2015/07/ss04-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>右に表示されいるのがAPIキーです（上図ではマスクしています）。こちらをJavaScriptやiOS/Androidのコード内に埋め込み、SkyWayのAPIにアクセスします。</p>

<p>ちなみに、設定変更ボタンをクリックすると、利用ドメインの編集やRestAPIの有効無効の切り替え、そしてAPIキーの削除が可能です。</p>

<p>これでSkyWayを利用するための準備が整いました。早速ビデオチャットを実装してみましょう。</p>

<h2>簡易ビデオチャットの作成と実行</h2>

<p>まず、ビデオチャットを実装するにあたり、以下の環境をご用意ください。</p>

<ul>
<li>Chorme, Firefox, Operaのいずれかのブラウザ</li>
<li>カメラ／マイク （PCに接続可能なもの）</li>
</ul>

<p>まずは以下の内容で、HTMLを書きます。適当なフォルダに「videochat.html」というファイル名でHTMLファイルを作成してください。</p>

<p></p><pre class="crayon-plain-tag"><html>
<head>
    <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
    <script type="text/javascript" src="https://skyway.io/dist/v2/0.3/peer.js"></script>
    <script type="text/javascript" src="videochat.js"></script>
</head>
<body>
    <h1>Simple Video Chat</h1>
    <div>
        <video id="my-video" style="width: 300px;" autoplay></video>
        <video id="peer-video" style="width: 300px;" autoplay></video>
    </div>
    <div>
        <p>MyID: <span id="my-id">-</span></p>
        <p>PeerID: <span id="peer-id">-</span></p>
    </div>
    <div>
        <input type="text" placeholder="PeerID" id="peer-id-input">
        <button id="call-start">Start Call</button>
        <button id="call-end">End Call</button>
    </div>
</body>
</html></pre><p></p>

<p>HEADタグ内で、jQueryとSkyWayライブラリ、そして今回作成するビデオチャット用のJavaScriptを読み込んでいます。jQueryはボタンクリック時のイベントを設定するときに使用します。SkyWayライブラリは今まで説明してきたとおり、シグナリング部分の処理を全部行ってくれるライブラリです。</p>

<p>次にJavaScriptのコードを書きます。先ほどのHTMLと同じフォルダに、「videochat.js」というファイル名でJavaScriptのファイルを作成してください。ここで、APIキーは先ほど入手したものに置き変えて入力してください。</p>

<p></p><pre class="crayon-plain-tag">// カメラ／マイクにアクセスするためのメソッドを取得しておく
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;

var localStream;    // 自分の映像ストリームを保存しておく変数
var connectedCall;  // 接続したコールを保存しておく変数

// SkyWayのシグナリングサーバーへ接続する (APIキーを置き換える必要あり）
var peer = new Peer({ key: 'YourApiKey', debug: 3});

// シグナリングサーバへの接続が確立したときに、このopenイベントが呼ばれる
peer.on('open', function(){
    // 自分のIDを表示する
    // - 自分のIDはpeerオブジェクトのidプロパティに存在する
    // - 相手はこのIDを指定することで、通話を開始することができる
    $('#my-id').text(peer.id);
});

// 相手からビデオ通話がかかってきた場合、このcallイベントが呼ばれる
// - 渡されるcallオブジェクトを操作することで、ビデオ映像を送受信できる
peer.on('call', function(call){
  　
    // 切断時に利用するため、コールオブジェクトを保存しておく
    connectedCall = call;

    // 相手のIDを表示する
    // - 相手のIDはCallオブジェクトのpeerプロパティに存在する
    $("#peer-id").text(call.peer);

    // 自分の映像ストリームを相手に渡す
    // - getUserMediaで取得したストリームオブジェクトを指定する
    call.answer(localStream);

    // 相手のストリームが渡された場合、このstreamイベントが呼ばれる
    // - 渡されるstreamオブジェクトは相手の映像についてのストリームオブジェクト
    call.on('stream', function(stream){

        // 映像ストリームオブジェクトをURLに変換する
        // - video要素に表示できる形にするため変換している
        var url = URL.createObjectURL(stream);

        // video要素のsrcに設定することで、映像を表示する
        $('#peer-video').prop('src', url);
    });
});

// DOM要素の構築が終わった場合に呼ばれるイベント
// - DOM要素に結びつく設定はこの中で行なう
$(function() {

    // カメラ／マイクのストリームを取得する
    // - 取得が完了したら、第二引数のFunctionが呼ばれる。呼び出し時の引数は自身の映像ストリーム
    // - 取得に失敗した場合、第三引数のFunctionが呼ばれる
    navigator.getUserMedia({audio: true, video: true}, function(stream){

        // このストリームを通話がかかってき場合と、通話をかける場合に利用するため、保存しておく
        localStream = stream;

        // 映像ストリームオブジェクトをURLに変換する
        // - video要素に表示できる形にするため変換している
        var url = URL.createObjectURL(stream);

        // video要素のsrcに設定することで、映像を表示する
        $('#my-video').prop('src', url);

    }, function() { alert("Error!"); });

    // Start Callボタンクリック時の動作
    $('#call-start').click(function(){

        // 接続先のIDをフォームから取得する
        var peer_id = $('#peer-id-input').val();

        // 相手と通話を開始して、自分のストリームを渡す
        var call = peer.call(peer_id, localStream);
            
        // 相手のストリームが渡された場合、このstreamイベントが呼ばれる
        // - 渡されるstreamオブジェクトは相手の映像についてのストリームオブジェクト
        call.on('stream', function(stream){
            // 相手のIDを表示する
            $("#peer-id").text(call.peer);

            // 映像ストリームオブジェクトをURLに変換する
            // - video要素に表示できる形にするため変換している
            var url = URL.createObjectURL(stream);

            // video要素のsrcに設定することで、映像を表示する
            $('#peer-video').prop('src', url);
        });
    });

    // End　Callボタンクリック時の動作
    $('#call-end').click(function(){
        // ビデオ通話を終了する
        connectedCall.close();
    });
});</pre><p></p>

<p>これらはローカルのファイルとして開いても動作しません。ローカルPC上にサーバを立ててファイルをホスティングしてあげる必要があります。このためだけにローカルPCにApacheやNginxを入れるのもの大変なので、今回はPHP付属のビルトインサーバを利用します。
ターミナルを開いて次のコマンドを入力してください (要PHP5.4.0以上)</p>

<p></p><pre class="crayon-plain-tag">$ cd {HTML/Javascriptのあるフォルダ}
$ php -S localhost:8888</pre><p></p>

<p>これで準備が全て整いました。早速ブラウザで開いてみましょう。WebRTCは現在のところChrome, Firefox, Operaでしか動作しないため、それらのブラウザを利用する必要があります。また現在も開発が続けられている分野ですので、最新バージョンを利用するのが望ましいです。</p>

<p>今回は、ビデオ通話を開始する側と受ける側の両方を自分で試してみます。ですので、以下のURLを2つのウィンドウ（またはタブ）で開いてみてください。</p>

<p><a href="http://localhost:8888/videochat.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">http://localhost:8888/videochat.html</a></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss05.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss05.png" alt="ss05" width="640" height="445" class="alignnone size-full wp-image-16359" srcset="/wp-content/uploads/2015/07/ss05.png 640w, /wp-content/uploads/2015/07/ss05-300x209.png 300w, /wp-content/uploads/2015/07/ss05-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>無事に表示されたでしょうか？</p>

<p>アクセス時に、カメラとマイクへのアクセスについて許可を求められるので、許可しておきましょう。許可すると、カメラ映像が画面左に表示されます。</p>

<p>それでは、早速通話を開始してみたいと思います。まず、接続相手のIDを渡す必要があります。ビデオ通話を受ける側のIDをコピーして、かける側のテキストボックスに貼り付けてください。相手のIDをちゃんと貼り付けることができたなら、隣の「Start Call」を押します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss06.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss06.png" alt="ss06" width="640" height="445" class="alignnone size-full wp-image-16360" srcset="/wp-content/uploads/2015/07/ss06.png 640w, /wp-content/uploads/2015/07/ss06-300x209.png 300w, /wp-content/uploads/2015/07/ss06-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>2つの映像が表示されれば成功です。</p>

<p>以上が簡単なビデオチャットのチュートリアルでした。非同期処理が中心でかつ、通話を開始する側と受ける側の両方の処理を書く必要があるため、慣れるまでコードの理解が難しいですが、ここさえ乗り越えればスムーズにコードを書くことができますので、少しづつ理解してみてください。</p>

<h2>データ通信を使った文字ベースチャット</h2>

<p>続いてWebRTCを用いたデータ通信を使ったチャットアプリを作ってみたいと思います。既にビデオチャットを理解できていれば、全く難しいことはありません。</p>

<p>先ほどと同様に、以下の内容で、HTMLを書きます。適当なフォルダに「datachat.html」というファイル名でHTMLファイルを作成してください。</p>

<p></p><pre class="crayon-plain-tag"><html>
<head>
    <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
    <script type="text/javascript" src="https://skyway.io/dist/v2/0.3/peer.js"></script>
    <script type="text/javascript" src="datachat.js"></script>
</head>
<body>
    <h1>Chat</h1>
    <div>
        <input type="text" placeholder="PeerID" id="peer-id-input">
        <button id="connect">Connect</button>
        <button id="close">Close</button>
    </div>
    <div>
        <p>MyID: <span id="my-id">-</span></p>
        <p>PeerID: <span id="peer-id">-</span></p>
    </div>
    <hr>
    <div>
        <input type="text" placeholder="Chat Message" id="message">
        <button id="send">Send</button>
    </div>
    <div id="messages"></div>
</body>
</html></pre><p></p>

<p>次はJavaScriptです。先ほどのHTMLと同じフォルダに「datachat.js」というファイル名でJavaScriptのファイルを作成してください。
APIキーについてもビデオ通話と同様に、先ほど入手したものに置き変えてください。</p>

<p></p><pre class="crayon-plain-tag">var conn;     // データ通信用connectionオブジェクトの保存用変数 

// SkyWayのシグナリングサーバーへ接続する  (APIキーを置き換える必要あり）
var peer = new Peer({ key: 'YourApiKey', debug: 3});

// シグナリングサーバへの接続が確立したときに、このopenイベントが呼ばれる
peer.on('open', function(){
    // 自分のIDを表示する
    // - 自分のIDはpeerオブジェクトのidプロパティに存在する
    // - 相手はこのIDを指定することで、通信を開始することが出来る
    $('#my-id').text(peer.id);
});
 
// 相手からデータ通信の接続要求イベントが来た場合、このconnectionイベントが呼ばれる
// - 渡されるconnectionオブジェクトを操作することで、データ通信が可能
peer.on('connection', function(connection){
  　
    // データ通信用に connectionオブジェクトを保存しておく
    conn = connection;

    // 接続が完了した場合のイベントの設定
    conn.on("open", function() {
        // 相手のIDを表示する
        // - 相手のIDはconnectionオブジェクトのidプロパティに存在する
        $("#peer-id").text(conn.id);
    });

    // メッセージ受信イベントの設定
    conn.on("data", onRecvMessage);
});

// メッセージ受信イベントの設定
function onRecvMessage(data) {
    // 画面に受信したメッセージを表示
    $("#messages").append($("<p>").text(conn.id + ": " + data).css("font-weight", "bold"));
}

// DOM要素の構築が終わった場合に呼ばれるイベント
// - DOM要素に結びつく設定はこの中で行なう
$(function() {

    // Connectボタンクリック時の動作
    $("#connect").click(function() {
        // 接続先のIDをフォームから取得する
        var peer_id = $('#peer-id-input').val();

        // 相手への接続を開始する
        conn = peer.connect(peer_id);

        // 接続が完了した場合のイベントの設定
        conn.on("open", function() {
            // 相手のIDを表示する
            // - 相手のIDはconnectionオブジェクトのidプロパティに存在する
            $("#peer-id").text(conn.id);
        });

        // メッセージ受信イベントの設定
        conn.on("data", onRecvMessage);
    });

    // Sendボタンクリック時の動作
    $("#send").click(function() {
        // 送信テキストの取得
        var message = $("#message").val();

        // 送信
        conn.send(message);

        // 自分の画面に表示
        $("#messages").append($("<p>").html(peer.id + ": " + message));

        // 送信テキストボックスをクリア
        $("#message").val("");
    });

    // Closeボタンクリック時の動作
    $("#close").click(function() {
        conn.close();
    });
});</pre><p></p>

<p>では、ローカルにHTTPサーバを立てて開いてみましょう。</p>

<p></p><pre class="crayon-plain-tag">$ cd {HTML/Javascriptのあるフォルダ}
$ php -S localhost:8888</pre><p></p>

<p><a href="http://localhost:8888/datachat.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">http://localhost:8888/datachat.html</a></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss07.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss07.png" alt="ss07" width="640" height="445" class="alignnone size-full wp-image-16361" srcset="/wp-content/uploads/2015/07/ss07.png 640w, /wp-content/uploads/2015/07/ss07-300x209.png 300w, /wp-content/uploads/2015/07/ss07-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>先程と同様に、接続を開始する側と接続を受ける側の両方が必要なため、2つ開いてください。無事に表示されましたでしょうか？</p>

<p>それでは、データ通信を開始してみたいと思います。接続相手のIDをコピーして、接続を開始する側のテキストボックスに貼り付けて、Connectボタンを押してください。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss08.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss08.png" alt="ss08" width="640" height="445" class="alignnone size-full wp-image-16362" srcset="/wp-content/uploads/2015/07/ss08.png 640w, /wp-content/uploads/2015/07/ss08-300x209.png 300w, /wp-content/uploads/2015/07/ss08-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>相手のIDがお互いの画面に表示されれば接続できています。では、チャット欄に文字を入力してSendボタンを押してみましょう。
相手の画面と自分の画面、両方に表示されれば成功です。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/07/ss09.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/07/ss09.png" alt="ss09" width="640" height="445" class="alignnone size-full wp-image-16363" srcset="/wp-content/uploads/2015/07/ss09.png 640w, /wp-content/uploads/2015/07/ss09-300x209.png 300w, /wp-content/uploads/2015/07/ss09-207x144.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>以上が簡単なテキストチャットのチュートリアルでした。WebRTCを使えば、テキストだけじゃなく、JavaScriptのオブジェクトやファイル等も送ることが可能です。</p>

<h2>おわりに</h2>

<p>今回はSkyWayを使った、簡単なビデオチャット／文字ベースチャットのチュートリアルをお届けしました。WebRTCは便利で高機能な反面、自分で実装しようとすると大変ですが、SkyWayを使うことで手軽に利用可能です。</p>

<p>次回はSkyWayを使って、Android/iPhoneでWebRTCを簡単に使う方法をお伝えしたいと思います。</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTCプラットフォーム ”SkyWay” 入門]]></series:name>
	</item>
		<item>
		<title>WebRTC開発者向けライブラリ「PeerJS」はこうして作られた</title>
		<link>/yusuke-naka/3693/</link>
		<pubDate>Thu, 09 Jan 2014 02:00:26 +0000</pubDate>
		<dc:creator><![CDATA[仲 裕介]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[PeerJS]]></category>
		<category><![CDATA[SkyWay]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[海外]]></category>

		<guid isPermaLink="false">/?p=3693</guid>
		<description><![CDATA[NTT Communications（以下、NTT Com）が提供するWebRTC開発用プラットフォーム SkyWayはPeerJSをベースに構成されています。この記事ではPeerJS開発者であるEric Zhang氏の...]]></description>
				<content:encoded><![CDATA[<p>NTT Communications（以下、NTT Com）が提供するWebRTC開発用プラットフォーム SkyWayはPeerJSをベースに構成されています。この記事ではPeerJS開発者であるEric Zhang氏の素顔に迫ります！</p>

<p><span id="more-3693"></span></p>

<h2>はじめに</h2>

<p>2013年11月19日から21日にアメリカで開催された<a href="http://www.webrtcworld.com/conference/west-13/default.aspx" title="webrtcworld" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">WebRTC Conference &amp; Expo</a>に合わせて、NTT ComのSkyWay開発担当者がアメリカを訪れ、PeerJS開発者の一人であるEric Zhang氏にインタビューを行いました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/01/7f8e62ed58e439286515234c8d8f655f2.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/01/7f8e62ed58e439286515234c8d8f655f2.jpg" alt="アレンとエリック" width="512" height="385" class="aligncenter size-full wp-image-4444" srcset="/wp-content/uploads/2014/01/7f8e62ed58e439286515234c8d8f655f2.jpg 512w, /wp-content/uploads/2014/01/7f8e62ed58e439286515234c8d8f655f2-300x225.jpg 300w, /wp-content/uploads/2014/01/7f8e62ed58e439286515234c8d8f655f2-207x155.jpg 207w" sizes="(max-width: 512px) 100vw, 512px" /></a></p>

<p style="text-align:center;"><small>（写真左：NTT com SkyWay開発チームの飯田アレン真人氏、写真右：PeerJS開発者のEric Zhang氏）</small></p>

<p><strong>──PeerJSとは？</strong></p>

<p>WebRTCを活用したアプリケーションを開発できるようにするためのJavaScriptライブラリ。<a href="http://peerjs.com/peerserver" title="PeerServer Cloud service" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">PeerServer Cloud service</a>というWebRTCを実現するための仲介サーバ機能も提供している。</p>

<p><a href="http://peerjs.com/" title="PeerJS" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">http://peerjs.com/</a></p>

<p><strong>──SkyWayとは？</strong></p>

<p>Web開発者が高度な知識の習得や環境の整備をすることなく、WebRTCを活用したアプリケーションを開発できるように、PeerJS互換のJavaScriptライブラリ、仲介サーバ機能、WebAPI、日本語の開発ドキュメントを提供している。</p>

<p><a href="http://nttcom.github.io/skyway/" title="SkyWay" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">http://nttcom.github.io/skyway/</a></p>

<h2>学生時代に二人で開発をスタート</h2>

<p><strong>──どのような方が開発に携わられているのですか？</strong></p>

<p>私とMichelle Buの二人で開発しています。私は、過去にBinaryJSやNowJSなどを開発していました。特に、ネットワーク系の技術を簡単に使いやすくするためのライブラリ開発が得意です。MichelleはGoogleでインターンシップをしていたこともあり、JavaScriptを用いた開発経験が豊富なんです。</p>

<p><strong>──PeerJSはいつごろから開発を始めたのですか？</strong></p>

<p>私やMichelleがカリフォルニア大学バークレー校に在籍していた、2012年の12月にスタートしました。</p>

<h2>WebRTCが流行るのはわかっていた</h2>

<p><strong>──WebRTCという技術に触れてみて、最初はどう思いましたか？</strong></p>

<p>WebRTC DataChannelを利用してみると、多くの問題があることがわかりました。APIはブラウザごとに互換性がない、データのシリアライゼーションができない、そもそもシグナリングサーバが存在しないため利用するハードルが高いなど、とにかく使いにくい印象でした。しかし、ブラウザ上で動くWebアプリケーションはネイティブアプリケーションに比べて、ネットワーク技術を活用した開発を苦手としています。そのため、今後WebRTCは間違いなく流行る技術だと確信しました。</p>

<p><strong>──なぜPeerJSを開発しようと考えたのですか？</strong></p>

<p>私はもともと、JavaScriptの機能を簡単に利用できるようにするJavaScriptライブラリが好きでした。だからWebRTCの機能をみんなが簡単に使えるライブラリが、もっとあれば便利だと考え、開発をスタートしました。当初は開発者向けのチュートリアルも少なく、W3Cの仕様も毎週のように変わっていたこともあってかなり苦労しましたが、なんとか公開することができました。頑張ったかいあって、公開初日にGitHubにて700スターを頂きました。私が今までに開発したJavaScriptライブラリの中で、最も大規模なライブラリになりましたね。</p>

<h2>PeerJS開発の日々</h2>

<p><strong>──開発はどのように進めているのですか？</strong></p>

<p>私とMichelleは仕事をしながら、プライベートの時間でPeerJSの開発を進めてきました。現在も、毎日仕事から帰ってきたらメールと<a href="https://groups.google.com/forum/#!forum/peerjs" title="peerjs-googlegroup" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Peerjs &#8211; Google Group</a>を確認し、個別の質問への回答やバグ修正などを行っています。Chromeのコミットログも定期的に確認し、WebRTCに関する実装の進み具合も把握するようにしています。</p>

<h2>PeerJSに求めることは互換性と安定性</h2>

<p><strong>──今後PeerJSに新しい機能追加を行う予定はありますか？</strong></p>

<p>PeerJSへの機能追加は最小限にしたいと考えています。WebRTCの仕様自体が変化し続けているため、ブラウザのバージョンが上がるたびに使えなくなるという事態は避けなければなりません。WebRTC Working Groupの動向をウォッチし、仕様の変化に迅速に対応するとともに、高い安定性と互換性を維持していく方針です。もちろん、私達以外の開発者によるPeerJSへの機能追加は大歓迎です。そのためにMITライセンスで公開していますので、ぜひ、新しい機能をいろいろと追加してみてください。</p>

<p><strong>──最近はどのような開発をしているのでしょうか？</strong></p>

<p>PeerJSは2013年9月20日に、Version 0.2.xから0.3.xへ<a href="https://github.com/peers/peerjs/blob/master/changelog.md#version-030-beta-20-sept-2013" title="changelog" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">メジャーバージョンアップ</a>を行いました。主な変更は、WebRTCのMediaChannelへの対応です。2ヶ月ほどの開発で、同時にコア部分のリファクタリングも行いました。ループ処理を極力省き、信頼性や処理速度の向上などを目的にしたコードの最適化を行っています。処理速度向上のアプローチとしては、WebScoketsによる接続を行う前に、XHRにて通信することで、50msほど処理を速くすることができました。これは価値があることだと考えています。</p>

<p>今はバグ修正と処理速度の高速化に注力しています。例えば、Chrome 31からSCTP DataChannelがデフォルトで有効になりました。Chromeの実装ではデータを一時保管するバッファーサイズが1MBしかないため、データ転送速度が速いとデータが溢れてしまう可能性があります。そのため、これに対処するためのバッファーインターフェースを実装する必要があります。（※1）その他にもエラー処理や、ユーザのイベント処理を改善していきたいと考えています。</p>

<p><small>※１・・・この機能は<a href="https://github.com/peers/peerjs/blob/master/changelog.md#version-036-beta-3-dec-2013" title="peerjs-changelog" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Version 0.3.6 Beta (3 Dec 2013)</a>にて実装されました。</small></p>

<p><strong>──PeerJSのマネタイズはどう考えていますか？</strong></p>

<p>公開している<a href="http://peerjs.com/peerserver" title="PeerServer Cloud service" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">PeerServer Cloud service</a>の運用には、費用はかかります。ですが、開発者の方に素早くサービスを開発してもらうことに重点を置いているため、私達でサーバを維持できるかぎり、有償化するつもりはありません。</p>

<h2>WebRTCは課題も多いけど、新しい可能性を秘めた技術</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/01/be8bdbdab642932ea12f5e7795c4fa781.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/01/be8bdbdab642932ea12f5e7795c4fa781.png" alt="エリック" width="383" height="421" class="alignright size-full wp-image-4441" srcset="/wp-content/uploads/2014/01/be8bdbdab642932ea12f5e7795c4fa781.png 383w, /wp-content/uploads/2014/01/be8bdbdab642932ea12f5e7795c4fa781-272x300.png 272w, /wp-content/uploads/2014/01/be8bdbdab642932ea12f5e7795c4fa781-188x207.png 188w" sizes="(max-width: 383px) 100vw, 383px" /></a><strong>──WebRTCに関して課題だと感じていることはありますか？</strong></p>

<p>WebRTCはPeer-to-Peerを前提にしているので、グループビデオチャットを簡単に実装することができません。サーバ側でミキシングを行い、複数人でチャットなどができる商用サービスはいくつか存在します。しかし、オープンソースで公開されているものはありません。今後はnpm installで簡単にインストールできる、オープンソースのサーバプロダクトが出てくることを願っています。</p>

<p><strong>──WebRTCを活用した新しいユースケースはありますか？</strong></p>

<p><a href="https://peercdn.com/" title="PeerCDN" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">PeerCDN</a>というサービスは面白いと思います。これは、Webサイト上の画像や音声、動画などのコンテンツを、その時に同じようにWebサイトを閲覧しているユーザ同士でシェアしあうサービスです。WebRTCの機能を使い、Peer-to-Peerの片方がCDNの役割を果たし、コンテンツを他方に配信します。サーバからダウンロードするよりも高速にコンテンツが取得できるようになれば、多くの人から注目されるでしょう。</p>

<p>WebRTCは新しくてとても魅力的なAPIです。今後の可能性に期待しています。</p>

<h2>終わりに</h2>

<p>今回はPeerJSの開発者であるEric Zhang氏へのインタビューをお送りしました。残念ながら、Michelle Bu氏には時間が合わずお話を伺うことができませんでしたが、Eric氏は一人のエンジニアとしてすごくバイタリティにあふれている方でした。また、HTML5とJavaScriptでつくるエコシステムにすごい可能性を感じており、ちょっと大げさかもしれませんが、同時にWeb技術への愛が感じられました。今後の活躍を大いに期待したいと思います。</p>

<p>NTT ComのSkyWay開発チームは、今後もSkyWayをはじめとするWebRTCに関する情報発信を行っていきますので、ご期待ください。</p>

<p><small>ここだけの話、ErichとMichelleはお付き合いしているそうです。二人がこの先もうまくいくといいですね。</small></p>

<p><style><!--
.exp-comment {   border-top: 1px solid lightgray; } .exp-thumbnail { } .exp-info {   font-size: 1.1em !important;   margin-bottom: 0 !important; } .exp-comment-pubdate {   font-size: .8em !important;   margin-bottom: 4px !important; } .exp-comment-main {   border: 1px solid lightgray;   border-radius: 8px;   padding: 1em;   min-height: 70px;   margin-bottom: 16px; } .exp-thumbnail {   width: 70px;   float: left; } .exp-comment-body {   margin-left: 80px;  } .editor-comment {   clear: left; } .exp-question {   font-weight: bold;   margin-bottom: 8px; } .post-detail-contents blockquote { background-image: none; }
--></style><article class="exp-comment"></p>

<div class="exp-comment-main">
<div class="exp-thumbnail"><a href="https://html5experts.jp/wp-content/uploads/2014/01/4b543d265860b1af3bffec4cf3b91272.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/01/4b543d265860b1af3bffec4cf3b91272.png" alt="エリック顔_small" width="47" height="71" class="aligncenter size-full wp-image-4491" /></a></div>
<blockquote class="exp-comment-body">[Eric Zhang/エリック・ザング]

中国生まれで2000年からアメリカに在住。2009年にカリフォルニア大学バークレー校に入学。在学中にFlotype incにて<a href="https://github.com/Flotype" title="Flotype - Github" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">NowJS</a>の開発に携わる。2012年には同じく学生だったMichelle Buと共にPeerJSの開発を始める。現在は<a href="https://lever.co/" title="Lever inc." target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Lever inc</a>の開発に携わりつつ、PeerJSの開発も継続して行っている。JavaScriptライブラリの開発が得意で<a href="http://binaryjs.com/" title="binaryjs" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">BinaryJS</a>の開発なども行っている。<a href="http://ericzhang.com/" title="ericzhang.com" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">http://ericzhang.com/</a>
</blockquote>
</div>

<p></article></p>
]]></content:encoded>
			</item>
	</channel>
</rss>
