<?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>カメラ &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/カメラ/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入門2016</title>
		<link>/mganeko/19728/</link>
		<pubDate>Fri, 24 Jun 2016 00:00:28 +0000</pubDate>
		<dc:creator><![CDATA[がねこまさし]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[カメラ]]></category>

		<guid isPermaLink="false">/?p=19728</guid>
		<description><![CDATA[連載： WebRTC入門2016 (1)こんにちは！ がねこまさしです。2014年に連載した「WebRTCを使ってみよう！」シリーズですが、内容がすっかり古くなってしまいました。そこで2016年6月の最新情報に基づき、内...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/webrtc2016/" class="series-380" title="WebRTC入門2016" data-wpel-link="internal">WebRTC入門2016</a> (1)</div><p>こんにちは！ がねこまさしです。2014年に連載した<a href="https://html5experts.jp/series/webrtc-beginner/" target="_blank" data-wpel-link="internal">「WebRTCを使ってみよう！」シリーズ</a>ですが、内容がすっかり古くなってしまいました。そこで2016年6月の最新情報に基づき、内容をアップデートして改めてお届けしたいと思います。</p>

<h2>WebRTCとは？</h2>

<p>WebRTCとは”Web Real-Time Communication”の略で、Webブラウザ上でビデオ/オーディオの通信や、データ通信を行うための規格です。HTML5で新しく策定されたもので、複数の技術の連携で成り立っています。 ちなみに策定には複数の団体が絡んでいています。</p>

<ul>
<li>API → <a href="https://www.w3.org/TR/webrtc/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">W3C</a></li>
<li>ビデオ/オーディオのコーデック → <a href="http://tools.ietf.org/wg/rtcweb/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">IETF</a></li>
</ul>

<p>APIの策定作業はWebRTC 1.0に向けて大詰めに入っています。またより詳細な低レベルのAPIを定義している<a href="http://ortc.org/wp-content/uploads/2016/05/ortc.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ORTC</a>も登場し、将来の統合に向けた動きも始まっています。</p>

<p>コーデックの選定では、ブラウザがサポートしなければならないビデオコーデックに、既にデファクトスタンダードともいえるH.264が加わりました。また、Googleが開発しているオープンソースのビデオコーデック「VP9」をサポートするブラウザも増えています。</p>

<h2>WebRTCで何ができるの？</h2>

<p>WebRTCは厳密に言うとビデオ/オーディオ/データ通信を行うための仕組みですが、他にも関連が深い技術があります。この連載では3つをまとめてWebRTC（とその仲間たち）ということで扱います。</p>

<ul>
<li>カメラ、マイクといったデバイスへのアクセスする &#8230; <a href="https://www.w3.org/TR/mediacapture-streams/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Media Capture and Streams</a></li>
<li>ビデオ/オーディオ/データ通信を行う &#8230; <a href="https://www.w3.org/TR/webrtc/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">WebRTC 1.0: Real-time Communication Between Browsers</a></li>
<li>ビデオ/オーディオの録画/録音を行う &#8230; <a href="https://www.w3.org/TR/mediastream-recording/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">MediaStream Recording</a></li>
</ul>

<p>この3兄弟に、HTML5の様々な要素を組み合わせて活用することができます。</p>

<ul>
<li>JavaScript（大前提）</li>
<li>videoタグ、audioタグ</li>
<li>CSS3</li>
<li>Canvas</li>
<li>WebGL</li>
<li>Web Audio API</li>
<li>WebSocket</li>
</ul>

<h2>新しいAPIでカメラを使ってみよう</h2>

<p>カメラやマイクと言ったデバイスにアクセスするには、従来は<code>navigator.getUserMedia()</code>というAPIを使いました。2016年6月現在では、これに代わる新しいAPIが登場しています。</p>

<ul>
<li><code>navigator.mediaDevices.getUserMedia()</code> になった</li>
<li>ベンダープレフィックスが取れた</li>
<li>コールバックではなく<code>Promise</code>ベースになった</li>
</ul>

<p>またデスクトップブラウザの場合は次のブラウザで利用することができます。</p>

<ul>
<li>Firefox 47 &#8230; 利用可能</li>
<li>Chrome 51 &#8230; 利用する場合にはフラグ設定が必要

<ul>
<li>chrome://flagsというURLを開く</li>
<li>「試験運用版のウェブ プラットフォームの機能 #enable-experimental-web-platform-features」を有効に</li>
<li>Chromeを再起動</li>
</ul></li>
<li>Edge 25 &#8230; Windows 10 のEdgeでも利用可能</li>
</ul>

<h3>サンプルコード</h3>

<p>それではカメラから映像を取得してみましょう。サンプルコードはこちらです。
</p><pre class="crayon-plain-tag">&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
 &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
 &lt;title&gt;Camera with mediaDevice&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;button onclick="startVideo()"&gt;Start&lt;/button&gt;
  &lt;br /&gt;
  &lt;video id="local_video" autoplay style="width: 320px; height: 240px; border: 1px solid black;"&gt;&lt;/video&gt;
&lt;/body&gt;
&lt;script type="text/javascript"&gt;
  let localVideo = document.getElementById('local_video');
  let localStream;
  
  // start local video
  function startVideo() {
    navigator.mediaDevices.getUserMedia({video: true, audio: false})
    .then(function (stream) { // success
      localStream = stream;
      localVideo.src = window.URL.createObjectURL(localStream);
    }).catch(function (error) { // error
      console.error('mediaDevice.getUserMedia() error:', error);
      return;
    });
  }
&lt;/script&gt;
&lt;/html&gt;</pre><p></p>

<p>このHTMLファイルに、（Webサーバ経由で）ブラウザからアクセスしてみてください。GitHub Pagesでも公開していますので、すぐに試すことができます。</p>

<ul>
<li>GitHub Pages で試す <a target="_blank" href="https://mganeko.github.io/webrtcexpjp/basic2016/camera_new.html" data-wpel-link="external" rel="follow external noopener noreferrer">camera_new.html</a>（※Chromeの場合は、上記のフラグ設定が必要です）</li>
<li>GitHub でソースを見る <a target="_blank" href="https://github.com/mganeko/webrtcexpjp/blob/master/basic2016/camera_new.html" data-wpel-link="external" rel="follow external noopener noreferrer">camera_new.html</a></li>
</ul>

<p>ブラウザで[Start]ボタンをクリックすると、カメラへのアクセスの許可を求めるダイアログが表示されますので、許可してください。<br />
<strong>Firefoxの場合</strong>
<a href="https://html5experts.jp/wp-content/uploads/2016/06/getusermedia_ff.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/getusermedia_ff-300x144.png" alt="getusermedia_ff" width="300" height="144" class="alignnone size-medium wp-image-19758" srcset="/wp-content/uploads/2016/06/getusermedia_ff-300x144.png 300w, /wp-content/uploads/2016/06/getusermedia_ff-207x100.png 207w, /wp-content/uploads/2016/06/getusermedia_ff.png 322w" sizes="(max-width: 300px) 100vw, 300px" /></a><br /></p>

<p><strong>Chromeの場合</strong>
<a href="https://html5experts.jp/wp-content/uploads/2016/06/getusermedia_chrome.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/getusermedia_chrome-300x112.png" alt="getusermedia_chrome" width="300" height="112" class="alignnone size-medium wp-image-19759" srcset="/wp-content/uploads/2016/06/getusermedia_chrome-300x112.png 300w, /wp-content/uploads/2016/06/getusermedia_chrome-207x77.png 207w, /wp-content/uploads/2016/06/getusermedia_chrome.png 354w" sizes="(max-width: 300px) 100vw, 300px" /></a><br /></p>

<p><strong>Edgeの場合</strong><br />
<a href="https://html5experts.jp/wp-content/uploads/2016/06/getusermedia_edge.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/getusermedia_edge-300x45.png" alt="getusermedia_edge" width="300" height="45" class="alignnone size-medium wp-image-19789" srcset="/wp-content/uploads/2016/06/getusermedia_edge-300x45.png 300w, /wp-content/uploads/2016/06/getusermedia_edge.png 640w, /wp-content/uploads/2016/06/getusermedia_edge-207x31.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a><br />
ウィンドウの下の部分にこのように表示されます。他のブラウザと違うので、ちょっと気が付きにくいかもしれません。</p>

<p>すると、このようにカメラの映像が表示されるはずです。
<a href="https://html5experts.jp/wp-content/uploads/2016/06/camera_ff.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/camera_ff-300x247.png" alt="camera_ff" width="300" height="247" class="alignnone size-medium wp-image-19768" srcset="/wp-content/uploads/2016/06/camera_ff-300x247.png 300w, /wp-content/uploads/2016/06/camera_ff-207x171.png 207w, /wp-content/uploads/2016/06/camera_ff.png 428w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h3>HTMLファイルの置き場所</h3>

<p>カメラやマイクにアクセスするには、サンプルのHTMLファイルをWebサーバーに配置する必要がありますが、実はブラウザによって条件が異なります。</p>

<ul>
<li>Chromeの場合 &#8230; 原則 https://～/ のみ。例外として http://localhost/～ でも利用可能</li>
<li>Firefoxの場合 &#8230; https://～/ および http://～/ の両方で利用可能。さらに file://～ でも利用可能</li>
<li>Edgeの場合 &#8230; https://～/ および http://～/ の両方で利用可能。さらに file://～ でも利用可能</li>
</ul>

<p>FirefoxやEdgeの場合は、ローカルのHTMLファイルを直接読み込んでも、利用可能です。</p>

<h3>トラブルシューティング</h3>

<p>カメラのアクセスの許可を求められた際に「常に拒否」すると、そのサイトからはカメラの映像を取得することができなくなります。その場合は明示的に再許可してあげる必要があります。</p>

<p><strong>Firefoxの場合</strong><a href="https://html5experts.jp/wp-content/uploads/2016/06/getusermedia_ff_ng.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/getusermedia_ff_ng-300x204.png" alt="getusermedia_ff_ng" width="300" height="204" class="alignnone size-medium wp-image-19761" srcset="/wp-content/uploads/2016/06/getusermedia_ff_ng-300x204.png 300w, /wp-content/uploads/2016/06/getusermedia_ff_ng-207x141.png 207w, /wp-content/uploads/2016/06/getusermedia_ff_ng.png 403w" sizes="(max-width: 300px) 100vw, 300px" /></a>で「許可」または「毎回確認する」を選択</p>

<p><strong>Chromeの場合</strong><a href="https://html5experts.jp/wp-content/uploads/2016/06/getusermedia_chrome_ng.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/getusermedia_chrome_ng-300x151.png" alt="getusermedia_chrome_ng" width="300" height="151" class="alignnone size-medium wp-image-19762" srcset="/wp-content/uploads/2016/06/getusermedia_chrome_ng-300x151.png 300w, /wp-content/uploads/2016/06/getusermedia_chrome_ng-207x104.png 207w, /wp-content/uploads/2016/06/getusermedia_chrome_ng.png 471w" sizes="(max-width: 300px) 100vw, 300px" /></a>「常に許可する」を選択</p>

<p><strong>Edgeの場合</strong><br />
※いまのところ「常に拒否」することはできないようなので、このケースは発生しません。</p>

<h2>新旧 getUserMedia() をラップしてみると</h2>

<p>新しいAPIである navigator.mediaDevices.getUserMedia()は、まだChromeではデフォルトの状態では使えません。これは、引数で渡すオプションの指定方法が、まだ新しい書き方に沿っていないことが原因です。
</p><pre class="crayon-plain-tag">let deviceID = getSelectedIDsomehow(); // デバイスIDを指定する

// Firefoxの場合
let constraints = {
  audio: false,
  video: { 
   deviceId: {exact: deviceID}
  }
};

// Chromeの場合
let constraintsForChrome = {
  audio: false,
  video: {
    optional: [{sourceId: deviceID}]
  }
};</pre><p></p>

<p>そのため、Chromeではしばらく新しいAPIはデフォルトでは使えない状態が続くと思われます。そこで古いAPIをPromise型にラップする例を用意してみました。（オプション指定の違いは吸収できていません）
</p><pre class="crayon-plain-tag">// --- prefix -----
  navigator.getUserMedia  = navigator.getUserMedia    || navigator.webkitGetUserMedia ||
                            navigator.mozGetUserMedia || navigator.msGetUserMedia;

  // ---- 新旧APIをPromiseでラップする ----
  function getDeviceStream(option) {
    if ('getUserMedia' in navigator.mediaDevices) {
      console.log('navigator.mediaDevices.getUserMadia');
      return navigator.mediaDevices.getUserMedia(option);
    }
    else {
      console.log('wrap navigator.getUserMadia with Promise');
      return new Promise(function(resolve, reject){    
        navigator.getUserMedia(option,
          resolve,
          reject
        );
      });      
    }
  }

  // 利用例
  function startVideo() {
    getDeviceStream({video: true, audio: false})
    .then(function (stream) { // success
      localStream = stream;
      localVideo.src = window.URL.createObjectURL(localStream);
    }).catch(function (error) { // error
      console.error('getUserMedia error:', error);
      return;
    });
  }</pre><p> 
これを使ってカメラ映像を取得する例もご用意しました。Chrome 51でもデフォルトのままで利用できます。</p>

<ul>
<li>GitHub Pages で試す <a target="_blank" href="https://mganeko.github.io/webrtcexpjp/basic2016/camera_old_new.html" data-wpel-link="external" rel="follow external noopener noreferrer">camera_old_new.html</a></li>
<li>GitHub でソースを見る <a target="_blank" href="https://github.com/mganeko/webrtcexpjp/blob/master/basic2016/camera_old_new.html" data-wpel-link="external" rel="follow external noopener noreferrer">camera_old_new.html</a></li>
</ul>

<p>様々なWebRTC関連のブラウザの違いを吸収する <code>adapter.js</code> が <a href="https://github.com/webrtc/adapter" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">本家のGitHub</a>で公開されています。より便利に使いたい場合は、<a href="http://webrtc.github.io/adapter/adapter-latest.js" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">そちらを</a>ご利用ください。</p>

<h2>CSS3と組み合わせてみよう</h2>

<p>WebRTCは他の要素と組み合わせて使うことができると書きました。実際にCSS3と組み合わせてみましょう。</p>

<p></p><pre class="crayon-plain-tag">&lt;!-- 通常 --&gt;
  &lt;video id="local_video" autoplay style="width: 320px; height: 240px; border: 1px solid black;"&gt;&lt;/video&gt;

  &lt;!-- 左右反転 --&gt;
  &lt;video id="flip_video" autoplay style="transform: scaleX(-1); width: 320px; height: 240px; border: 1px solid black;"&gt;&lt;/video&gt;

  &lt;!-- 角丸 --&gt;
  &lt;video id="round_video" autoplay style="border-radius: 80px 80px 80px 80px; width: 320px; height: 240px; border: 1px solid black;"&gt;&lt;/video&gt;

  &lt;!-- セピア --&gt;
  &lt;video id="filter_video" autoplay style="filter: sepia(100%); -webkit-filter: sepia(100%); width: 320px; height: 240px; border: 1px solid black;"&gt;&lt;/video&gt;</pre><p> 
ほかにも様々なバリエーションが考えられます。ぜひ自分でもいろいろ試してみてください。</p>

<p>また、CSS3アニメーションを使うこともできます。例えばこんな感じです。
</p><pre class="crayon-plain-tag">&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
 &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
 &lt;title&gt;Camera with mediaDevice&lt;/title&gt;
 &lt;style type="text/css"&gt;
   #rotate_video
   {
    animation-duration:4s;
    animation-iteration-count:infinite;
    animation-timing-function:linear;
    animation-name:rotate360;     
   }

   #shake_video
   {
    animation-duration:0.5s;
    animation-iteration-count:infinite;
    animation-timing-function:ease-in-out;
    animation-name:shake;     
   }
   
   @keyframes rotate360
   {
    0%{transform:rotate(0deg);}
    100%{transform:rotate(360deg);}
   }

   @keyframes shake
   {
    0%{transform:rotate(-20deg);}
    50%{transform:rotate(20deg);}
    100%{transform:rotate(-20deg);}
   }
  &lt;/style&gt; 
&lt;/head&gt;
&lt;body&gt;
  Camera with mediaDevice.getUserMedia()&lt;br /&gt;
  &lt;button onclick="startVideo()"&gt;Start&lt;/button&gt;
  &lt;br /&gt;
  &lt;!-- 通常 --&gt;
  &lt;video id="local_video" autoplay style="width: 320px; height: 240px; border: 1px solid black;"&gt;&lt;/video&gt;
  &lt;br /&gt;

  &lt;!-- 回転アニメーション --&gt;
  &lt;video id="rotate_video" autoplay style="width: 320px; height: 240px; border: 1px solid black;"&gt;&lt;/video&gt;

  &lt;!-- 振動アニメーション --&gt;
  &lt;video id="shake_video" autoplay style="width: 320px; height: 240px; border: 1px solid black;"&gt;&lt;/video&gt;
  
&lt;/body&gt;
&lt;script type="text/javascript"&gt;
  // --- prefix -----
  navigator.getUserMedia  = navigator.getUserMedia    || navigator.webkitGetUserMedia ||
                            navigator.mozGetUserMedia || navigator.msGetUserMedia;

  let localVideo = document.getElementById('local_video');
  let localStream;
  
  // start local video
  function startVideo() {
    getDeviceStream({video: true, audio: false})
    .then(function (stream) { // success
      localStream = stream;
      localVideo.src = window.URL.createObjectURL(localStream);
	  
      document.getElementById('rotate_video').src = localVideo.src;
      document.getElementById('shake_video').src = localVideo.src;
    }).catch(function (error) { // error
      console.error('mediaDevice.getUserMedia() error:', error);
      return;
    });
  }

  // ---- 新旧APIをPromiseでラップする ----
  function getDeviceStream(option) {
    if ('getUserMedia' in navigator.mediaDevices) {
      console.log('navigator.mediaDevices.getUserMadia');
      return navigator.mediaDevices.getUserMedia(option);
    }
    else {
      console.log('wrap navigator.getUserMadia with Promise');
      return new Promise(function(resolve, reject){    
        navigator.getUserMedia(option,
          resolve,
          reject
        );
      });      
    }
  }
&lt;/script&gt;
&lt;/html&gt;</pre><p> 
<a href="https://html5experts.jp/wp-content/uploads/2016/06/camera_css_animation.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/camera_css_animation-300x123.png" alt="camera_css_animation" width="300" height="123" class="alignnone size-medium wp-image-19778" srcset="/wp-content/uploads/2016/06/camera_css_animation-300x123.png 300w, /wp-content/uploads/2016/06/camera_css_animation.png 640w, /wp-content/uploads/2016/06/camera_css_animation-207x85.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>CSS3と組み合わせたサンプルも、GitHub Pagesでも公開していますので、試してみてください。（ラップ関数を使っているので、デフォルトのChrome 51でも利用できます）</p>

<ul>
<li>GitHub Pages で試す <a target="_blank" href="https://mganeko.github.io/webrtcexpjp/basic2016/camera_css_wrap.html" data-wpel-link="external" rel="follow external noopener noreferrer">camera_css_wrap.html</a></li>
<li>GitHub でソースを見る <a target="_blank" href="https://github.com/mganeko/webrtcexpjp/blob/master/basic2016/camera_css_wrap.html" data-wpel-link="external" rel="follow external noopener noreferrer">camera_css_wrap.html</a></li>
</ul>

<h2>次回は</h2>

<p>今回は新しいAPIを使って、カメラの映像を取得してみました。次回はWebRTCによる通信を手動で接続してみます。</p>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTC入門2016]]></series:name>
	</item>
		<item>
		<title>HTML5でWebRTCを使ってみよう！「カメラを使ってみよう」編</title>
		<link>/mganeko/5098/</link>
		<pubDate>Wed, 05 Feb 2014 01:00:04 +0000</pubDate>
		<dc:creator><![CDATA[がねこまさし]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[WebRTC]]></category>
		<category><![CDATA[カメラ]]></category>

		<guid isPermaLink="false">/?p=5098</guid>
		<description><![CDATA[連載： WebRTCを使ってみよう！ (1)こんにちは！ がねこまさしです。これから数回に渡って、WebRTCについて書かせていただきます。 内容は2013年10月にNode学園祭2013で発表したプレゼンを、再構成した...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/webrtc-beginner/" class="series-158" title="WebRTCを使ってみよう！" data-wpel-link="internal">WebRTCを使ってみよう！</a> (1)</div><p>こんにちは！ がねこまさしです。これから数回に渡って、WebRTCについて書かせていただきます。
内容は2013年10月にNode学園祭2013で発表したプレゼンを、再構成したものになる予定です。</p>

<p><strong>※こちらの記事は2014年に書かれました。<a href="https://html5experts.jp/mganeko/19728/" data-wpel-link="internal">2016年6月現在のアップデート記事</a>がありますので、そちらもご参照ください。</strong></p>

<h2>WebRTCとは？</h2>

<p><a href="http://www.webrtc.org/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">WebRTC</a>とは&#8221;Web Real-Time Communication&#8221;の略で、Webブラウザ上でビデオ/オーディオの通信や、データ通信を行うための規格です。HTML5で新しく策定されたもので、複数の技術の連携で成り立っています。
ちなみに策定には複数の団体が絡んでいています。</p>

<ul>
    <li>API → <a href="http://www.w3.org/TR/webrtc/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">WWW</a></li>
    <li>ビデオ/オーディオのコーデック  → <a href="http://tools.ietf.org/wg/rtcweb/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">IETF</a></li>
</ul>

<h2>WebRTCで何ができるの？</h2>

<p>WebRTCには大きく分けて2つの要素があります。</p>

<ul>
    <li>カメラ、マイクといったメディアへのアクセス(UserMedia)</li>
    <li>Peer-to-Peer通信を行うための仕組み(RTCPeerConnection)</li>
</ul>

<p>このほかにもHTML5の様々な要素と組み合わせて活用することができます。</p>

<ul>
    <li>JavaScript（大前提）</li>
    <li>videoタグ、audioタグ</li>
    <li>CSS3</li>
    <li>Canvas</li>
    <li>WebGL</li>
    <li>Web Audio API</li>
    <li>WebSocket</li>
</ul>

<h2>ユーザーメディアを使ってみよう</h2>

<p>それでは、さっそく使ってみましょう。ユーザーメディアで一番わかりやすいカメラを使います。Webカメラと最新のChromeかFirefoxをご用意ください。<br>
※今回はChrome 32, Firefox 26で動作確認しています。</p>

<p></p><pre class="crayon-plain-tag">&lt;!doctype html&gt;
&lt;html&gt;
 &lt;head&gt;
  &lt;title&gt;Self Camera&lt;/title&gt;
 &lt;/head&gt;
 &lt;body&gt;
   &lt;video id="myVideo" width="400" height="300" autoplay="1" &gt;&lt;/video&gt;

   &lt;script type="text/javascript"&gt;
    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || window.navigator.mozGetUserMedia;
    window.URL = window.URL || window.webkitURL;

    var video = document.getElementById('myVideo');
    var localStream = null;
    navigator.getUserMedia({video: true, audio: false}, 
     function(stream) { // for success case
      console.log(stream);
      video.src = window.URL.createObjectURL(stream);
     },
     function(err) { // for error case
      console.log(err);
     }
    );
   &lt;/script&gt;
 &lt;/body&gt;
&lt;/html&gt;</pre><p> 
こちらをお好きなWebサーバーに保存し、ChromeないしFirefoxでアクセスしてみてください。カメラにアクセスしても良いかどうか確認のダイアログが表示されますので、OKすればカメラの映像が表示されるはずです。<br />
FireFoxの場合：<a href="https://html5experts.jp/wp-content/uploads/2014/02/firefox_getusermedia.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/02/firefox_getusermedia-300x130.png" alt="firefox_getusermedia" width="300" height="130" class="alignnone size-medium wp-image-5120" srcset="/wp-content/uploads/2014/02/firefox_getusermedia-300x130.png 300w, /wp-content/uploads/2014/02/firefox_getusermedia-207x89.png 207w, /wp-content/uploads/2014/02/firefox_getusermedia.png 380w" sizes="(max-width: 300px) 100vw, 300px" /></a><br /><br />
Chromeの場合：<a href="https://html5experts.jp/wp-content/uploads/2014/02/chrome_getusermedia.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/02/chrome_getusermedia-300x40.png" alt="chrome_getusermedia" width="300" height="40" class="alignnone size-medium wp-image-5123" srcset="/wp-content/uploads/2014/02/chrome_getusermedia-300x40.png 300w, /wp-content/uploads/2014/02/chrome_getusermedia-207x27.png 207w, /wp-content/uploads/2014/02/chrome_getusermedia.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>上手く動けば、このように自分の顔が映ると思います。<br />
<a href="https://html5experts.jp/wp-content/uploads/2014/02/chrome_selfcamera.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/02/chrome_selfcamera-300x294.png" alt="chrome_selfcamera" width="300" height="294" class="alignnone size-medium wp-image-5126" srcset="/wp-content/uploads/2014/02/chrome_selfcamera-300x294.png 300w, /wp-content/uploads/2014/02/chrome_selfcamera-207x203.png 207w, /wp-content/uploads/2014/02/chrome_selfcamera.png 470w" sizes="(max-width: 300px) 100vw, 300px" /></a><br />
※上手くいかない場合は、JavaScriptコンソールを表示してエラーを確認してくださいね。<br>
ちなみに、HTMLをWebサーバーに置かずに直接開いた場合(file:// ～ )、Chromeではセキュリティ制限に引っかかりカメラにアクセスするこができません。FireFoxは現状の実装ではアクセスできるようです。</p>

<h2>CSS3 と組み合わせてみる</h2>

<p>WebRTCは他の要素と組み合わせて使うことができると、最初に書きました。実際にやってみましょう。<br>
※コードを単純にするために、ここからはChrome用のコードを掲載します。Firefoxの場合は適宜プレフィックスを変更してください。
</p><pre class="crayon-plain-tag">&lt;video id="myVideo" style="-webkit-transform: scaleX(-1);" width="400" height="300" autoplay="1" &gt;&lt;/video&gt;</pre><p> 
このようにvideoタグを変更すると、左右反転した鏡の状態になります。この方が自分では見慣れた姿に映ります。skypeなど多くのビデオチャットアプリは、左右反転状態がデフォルトになっているものが多いようです。</p>

<p>ほかにも様々なバリエーションが考えられます。ぜひ自分でもいろいろ試してみてください。</p>

<p></p><pre class="crayon-plain-tag">&lt;video id="myVideo" style="-webkit-transform: scaleY(-1);" width="400" height="300" autoplay="1" &gt;&lt;/video&gt;</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;video id="myVideo" style="-webkit-transform: scaleX(0.5);" width="400" height="300" autoplay="1" &gt;&lt;/video&gt;</pre><p></p>

<p></p><pre class="crayon-plain-tag">&lt;video id="myVideo" style="-webkit-filter: sepia(80%);" width="400" height="300" autoplay="1" &gt;&lt;/video&gt;</pre><p></p>

<p>CSS3のアニメーション機能も利用できます。たとえばこんな風に。</p>

<p></p><pre class="crayon-plain-tag">&lt;!doctype html&gt;
&lt;html&gt;
 &lt;head&gt;
  &lt;title&gt;Rotate Camera&lt;/title&gt;
  &lt;style type="text/css"&gt;
   #rotateVideo
   {
    position: absolute;
    -webkit-animation-duration:2s;
    -webkit-animation-iteration-count:infinite;
    -webkit-animation-timing-function:linear;
    -webkit-animation-name:rectRotate;     
   }
 
   @-webkit-keyframes rectRotate
   {
    0%{-webkit-transform:rotate(0deg);}
    99%,100%{-webkit-transform:rotate(360deg);}
   }
  &lt;/style&gt;
 &lt;/head&gt;
 &lt;body&gt;
   &lt;video id="rotateVideo" width="400" height="300" autoplay="1" &gt;&lt;/video&gt;

   &lt;script type="text/javascript"&gt;
    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || window.navigator.mozGetUserMedia;
    window.URL = window.URL || window.webkitURL;

    var video = document.getElementById('rotateVideo');
    navigator.getUserMedia({video: true, audio: false}, 
     function(stream) { // for success case
      console.log(stream);
      video.src = window.URL.createObjectURL(stream);
     },
     function(err) { // for error case
      console.log(err);
     }
    );
   &lt;/script&gt;
 &lt;/body&gt;
&lt;/html&gt;</pre><p> 
<a href="https://html5experts.jp/wp-content/uploads/2014/02/chrome_rotate.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/02/chrome_rotate-300x263.png" alt="chrome_rotate" width="300" height="263" class="alignnone size-medium wp-image-5134" srcset="/wp-content/uploads/2014/02/chrome_rotate-300x263.png 300w, /wp-content/uploads/2014/02/chrome_rotate-207x181.png 207w, /wp-content/uploads/2014/02/chrome_rotate.png 497w" sizes="(max-width: 300px) 100vw, 300px" /></a><br /></p>

<p>以上、ユーザメディア（カメラ）を使ってみました。次回は通信関連の要素についてご説明する予定です。</p>

<h3>続編を読む</h3>

<ul>
<li><a href="https://html5experts.jp/mganeko/5181/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebRTCに触ってみたいエンジニア必見！手動でWebRTC通信をつなげてみよう</a></li>
<li><a href="https://html5experts.jp/mganeko/5349/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebRTC初心者でも簡単にできる！Node.jsで仲介（シグナリング）を作ってみよう編</a></li>
</ul>
]]></content:encoded>
		
		<series:name><![CDATA[WebRTCを使ってみよう！]]></series:name>
	</item>
	</channel>
</rss>
