<?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>WebRTCプラットフォーム ”SkyWay” 入門 &#8211; HTML5Experts.jp</title>
	<atom:link href="/series/skyway-tutorial/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>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>
	</channel>
</rss>
