SlideShare ist ein Scribd-Unternehmen logo
1 von 108
Downloaden Sie, um offline zu lesen
WebRTC +
              Web Audio API =
              スーパーサイヤ人

                  2013/02/23 #daiNagoyaJS vol.5


13年2月23日土曜日
いつもぎりぎり、
              @girigiribauerです




13年2月23日土曜日
本日のネタは、
              大なごやJS Vol.3で
              話したネタの
              完全版です


13年2月23日土曜日
今日話す内容



13年2月23日土曜日
今日話す内容

              1. 作ってきたコンテンツの概要
              2. デモ
              3. WebRTC, Web Audio API などの話
              4. まとめ



13年2月23日土曜日
13年2月23日土曜日
今日話す内容

              1. 作ってきたコンテンツの概要
              2. デモ
              3. WebRTC, Web Audio API などの話
              4. まとめ



13年2月23日土曜日
WebRTC +




13年2月23日土曜日
WebRTC +
              Web Audio API =




13年2月23日土曜日
WebRTC +
              Web Audio API =
              スーパーサイヤ人


13年2月23日土曜日
ドラゴンボールとは
              • みんな大好きドラゴンボール
              • サイヤ人は、金色の髪のスーパーサイ
                  ヤ人に変身する

              •   変身すると
                  強くなるのは
                  男のロマン
                            映画あるよ! http://www.dragonball2013.com/




13年2月23日土曜日
スーパーサイヤ人に
               なってみたかった


13年2月23日土曜日
元ネタ



13年2月23日土曜日
•    i'm a super saiyan
              http://www.youtube.com/watch?v=lIv88cC86r0


13年2月23日土曜日
•    i'm a super saiyan
              http://www.youtube.com/watch?v=lIv88cC86r0


13年2月23日土曜日
•    i'm a super saiyan
              http://www.youtube.com/watch?v=lIv88cC86r0


13年2月23日土曜日
•    i'm a super saiyan
              http://www.youtube.com/watch?v=lIv88cC86r0


13年2月23日土曜日
•    i'm a super saiyan
              http://www.youtube.com/watch?v=lIv88cC86r0


13年2月23日土曜日
•   i'm a super saiyan
                  http://www.youtube.com/watch?v=lIv88cC86r0


13年2月23日土曜日
•   i'm a super saiyan
                  http://www.youtube.com/watch?v=lIv88cC86r0


13年2月23日土曜日
•   i'm a super saiyan
                  http://www.youtube.com/watch?v=lIv88cC86r0


13年2月23日土曜日
respect!




              •   i'm a super saiyan
                  http://www.youtube.com/watch?v=lIv88cC86r0


13年2月23日土曜日
全力投球の
                中二病は
              coolだと思う


13年2月23日土曜日
そして前回・・・



13年2月23日土曜日
リベンジネタ
              • 実は大なごやJS Vol.3 でやったネタ
               (2012/07/21)

              • 前回は、ホントに軽く作ってみた



13年2月23日土曜日
リベンジネタ
              • あれ、音声がとれない → まだ未実装
              • (本番当日)
               「ク、クリックで・・・
                 代用しました・・・」




13年2月23日土曜日
13年2月23日土曜日
13年2月23日土曜日
まさかのクリック



13年2月23日土曜日
ユーザー体験と
               しては 0点


13年2月23日土曜日
それも
              今や昔の話・・・


13年2月23日土曜日
君もなれる!
        スーパーサイヤ人に!


13年2月23日土曜日
13年2月23日土曜日
今日話す内容

              1. 作ってきたコンテンツの概要
              2. デモ
              3. WebRTC, Web Audio API などの話
              4. まとめ



13年2月23日土曜日
デモ
              •   なれる!スーパーサイヤ人!
                  http://girigiribauer.com/dragonball-super-saiyan/




13年2月23日土曜日
満 足

13年2月23日土曜日
13年2月23日土曜日
今日話す内容

              1. 作ってきたコンテンツの概要
              2. デモ
              3. WebRTC, Web Audio API などの話
              4. まとめ



13年2月23日土曜日
使用した主なAPIなど

              •WebRTC (getUserMedia)

              • Web Audio API
              • Canvas




13年2月23日土曜日
このあたりの話を
               ピンポイントで
                抜粋して紹介


13年2月23日土曜日
使用した主なAPIなど

              •WebRTC (getUserMedia)

              • Web Audio API
              • Canvas




13年2月23日土曜日
WebRTC
                (getUserMedia)
              • RTCは、Real Time Communication
               の略

              • その中の getUserMedia は、
               ローカルにあるカメラ、マイクに
               アクセスできる




13年2月23日土曜日
対応状況
                  (※2013/02/23時点)




              • http://caniuse.com/stream
13年2月23日土曜日
対応状況
                     (※2013/02/23時点)


         •    Chrome, Operaに続いて
              Firefoxも getUserMedia が使える!

         •    Firefoxはabout:configのフラグ付き

         • IEは、そもそもCU-RTC-Webという
              別仕様を推進してる
              (CU: Customizable, Ubiquitous)



13年2月23日土曜日
getUserMedia の
                  基本的な使い方

              • navigatorオブジェクトにある
               getUserMedia メソッド

              • 引数を3つ取る
              • 1つ目は、デバイスの種別指定のオブ
               ジェクト(テキストではない)




13年2月23日土曜日
getUserMedia の
                  基本的な使い方
              • 2つ目は、ローカルデバイスに
               アクセスが出来たときに生成される、
               mediaStream オブジェクトを
               引数にもつ、コールバック関数

              • 3つ目は、上記失敗したときの
               コールバック関数




13年2月23日土曜日
getUserMedia の
                  基本的な使い方
              • そこまで複雑じゃない、数行レベル
              • クロスブラウザな書き方は、
               navigator.getUserMediaに対して
               上書きできないので、
               ちょっと工夫する




13年2月23日土曜日
getUserMedia の
                             基本的な使い方
                     var getUserMedia = function(t, onsuccess, onerror) {
                   if (navigator.getUserMedia) {
                      return navigator.getUserMedia(t, onsuccess, onerror);
                   } else if (navigator.webkitGetUserMedia) {
                      return navigator.webkitGetUserMedia(t, onsuccess, onerror);
                   } else if (navigator.mozGetUserMedia) {
                      return navigator.mozGetUserMedia(t, onsuccess, onerror);
                   } else if (navigator.msGetUserMedia) {
                      return navigator.msGetUserMedia(t, onsuccess, onerror);
                   } else {
                      throw new Error('No getUserMedia implementation found.');
                   }
              };



         •         navigator.getUserMediaごと返す

         • あとはfunctionでラッピングするなり
13年2月23日土曜日
getUserMedia の
                 基本的な使い方
         •    デバイスへの接続がうまくいった後、
              とりあえず表示させるまでの話
              (前回の資料をさらっと再紹介)




13年2月23日土曜日
取得した LocalMediaStream オブジ
         ェクトをきちんと表示するところまで
                    (1)


              • canvas要素を作る、もしくは予め作っ
                た要素を参照する
              • var canvas =
                document.getElementById('canvas');
                var context = canvas.getContext('2d');




13年2月23日土曜日
取得した LocalMediaStream オブジ
         ェクトをきちんと表示するところまで
                    (2)


              •   createObjectURL にさっきの
                  LocalMediaStream オブジェクトを
                  ぶちこんで、BlobURL(リソースを参
                  照してる)を取得する
              • var videoUrl = createObjectURL(stream);


13年2月23日土曜日
取得した LocalMediaStream オブジ
         ェクトをきちんと表示するところまで
                    (2)


              •   デバイスをBlobURLとして受け取るこ
                  とで、同様のインターフェースで扱え
                  る(URL参照 ≒ デバイス参照)

              • Blobは Binary Large OBject の略、
                  FileAPI 周りでよく使われてる



13年2月23日土曜日
取得した LocalMediaStream オブジ
         ェクトをきちんと表示するところまで
                    (3)

              • video タグの src 属性に、
                  さっきの BlobURL をつっこむ
              •   var video = document.getElementById('video');
                  video.src = videoUrl;
                  video.autoplay = true;

              • ※autoplay 属性がないと最初の1コマ
                  だけで止まっちゃうのでつける

              • 単に表示のみなら、ここまででOK
13年2月23日土曜日
取得した LocalMediaStream オブジ
         ェクトをきちんと表示するところまで
                    (4)

              •   あとは連続して canvas に video 要
                  素を反映してやるだけ
              • var render = function() {
                   context.drawImage(video, 0, 0, w, h);
                   requestAnimationFrame(render);
                  };
                  requestAnimationFrame(render);



13年2月23日土曜日
video は分かった
              では audio は?


13年2月23日土曜日
その前に、
               Web Audio API
              を考える必要がある


13年2月23日土曜日
使用した主なAPIなど

              •WebRTC (getUserMedia)

              • Web Audio API
              • Canvas




13年2月23日土曜日
Web Audio API
              • 文字通り、Web の Audio の API
              • ノードというオブジェクト同士を
                  つなぎ合わせることで制御する

              •   中にはAnalyserノード、数値として
                  解析できちゃうものもある

              •   仕様が幅広くて、まだまだ全容把握で
                  きてない

13年2月23日土曜日
対応状況
                  (※2013/02/23時点)




              • http://caniuse.com/audio-api
13年2月23日土曜日
対応状況
                     (※2013/02/23時点)



         •    Chrome, Safari, iOS Safari が使える

         • つい数日前に、Firefox Nightly にて
              Web Audio API がフラグ付きで導入

         • Firefox21 か 22 あたりで
              Web Audio API が正式実装される?



13年2月23日土曜日
対応状況
                     (※2013/02/23時点)




         • Firefox では、about:config から
              media.webaudio.enabled を true に

         • ただし、Firefoxはまだ完全じゃないと
              ころもある(詳しくは後述)
13年2月23日土曜日
Web Audio API で
                    今回やりたいこと
              •   今回やりたいのは、
                  入力から数値として取れるところまで

              •   出力側は必ずしも必要ではない

              • ライブ入力の音声を、リアルタイムに
                  周波数として取れれば良いので、
                  AnalyserNode を使えばOK



13年2月23日土曜日
少し戻って・・・



13年2月23日土曜日
前回の資料より




13年2月23日土曜日
ここでようやく
               今回のキモ


13年2月23日土曜日
WebRTC +




13年2月23日土曜日
WebRTC +
              Web Audio API =




13年2月23日土曜日
WebRTC +
              Web Audio API =
              スーパーサイヤ人


13年2月23日土曜日
WebRTC +
              Web Audio API =
              スーパーサイヤ人
              (=ライブ音声入力)

13年2月23日土曜日
ドコとドコが
                     繋がっているの?
              •   先ほどの getUserMedia で出てきた
                  mediaStream オブジェクトを対象の
                  メソッドに渡して連携させる

              • video側は、
                  createObjectURL(stream) を使って
                  BlobURLを取得し、video.src として
                  利用していた


13年2月23日土曜日
ドコとドコが
                   繋がっているの?

              • audio側は、AudioContext オブジェ
                クトを用いる

              • audio周りの処理が、AudioContext
                オブジェクトのメソッドを介して行わ
                れる

              • なので、まず AudioContext を作る

              • var context = getAudioContext();
13年2月23日土曜日
ドコとドコが
                   繋がっているの?
              • video側の createObjectURL(stream)
               の、audio側に相当しているものは、
               context.createMediaStreamSource(s
               tream)

              • 意味はそのまんま、mediaStream を
               入力として作ります、と書いてある

              • 2つの仕様が連携することで、逆に
               videoよりもシンプルで分かりやすい

13年2月23日土曜日
ライブ音声入力の
              周波数ごとの値を
                取得できる
              ところまでの流れ


13年2月23日土曜日
取得した LocalMediaStream
               オブジェクトを、値として処理
                 できるところまで (1)
         var context = getAudioContext();
         var source = context.createMediaStreamSource(stream);
         var audioAnalyser = context.createAnalyser();
         var audioAnalyzedData =
         new Uint8Array(audioAnalyser.frequencyBinCount);
         source.connect(audioAnalyser);
         audioAnalyser.getByteFrequencyData(audioAnalyzedData);



              • AudioContext を作る



13年2月23日土曜日
取得した LocalMediaStream
               オブジェクトを、値として処理
                 できるところまで (2)
         var context = getAudioContext();
         var source = context.createMediaStreamSource(stream);
         var audioAnalyser = context.createAnalyser();
         var audioAnalyzedData =
         new Uint8Array(audioAnalyser.frequencyBinCount);
         source.connect(audioAnalyser);
         audioAnalyser.getByteFrequencyData(audioAnalyzedData);



              • AudioContext に対して、
               createMediaStreamSource メソッド
               を呼ぶと、
               MediaStreamAudioSourceNode とい
               う 出力用のノードが取得できる

13年2月23日土曜日
取得した LocalMediaStream
               オブジェクトを、値として処理
                 できるところまで (3)
         var context = getAudioContext();
         var source = context.createMediaStreamSource(stream);
         var audioAnalyser = context.createAnalyser();
         var audioAnalyzedData =
         new Uint8Array(audioAnalyser.frequencyBinCount);
         source.connect(audioAnalyser);
         audioAnalyser.getByteFrequencyData(audioAnalyzedData);



              • 先ほどとは別に、
               AudioContext に対して
               createAnalyser メソッドを呼ぶと、
               AnalyserNode という、音データの解
               析ができるノードが取得できる

13年2月23日土曜日
取得した LocalMediaStream
               オブジェクトを、値として処理
                 できるところまで (4)
         var context = getAudioContext();
         var source = context.createMediaStreamSource(stream);
         var audioAnalyser = context.createAnalyser();
         var audioAnalyzedData =
         new Uint8Array(audioAnalyser.frequencyBinCount);
         source.connect(audioAnalyser);
         audioAnalyser.getByteFrequencyData(audioAnalyzedData);




              • (今すぐ必要ではないけど、)
               あらかじめ周波数分のUint8Array型の
               型付き配列(Typed Array)を
               作っておく

              • ただの配列でも良いけど、速度の問題
13年2月23日土曜日
取得した LocalMediaStream
               オブジェクトを、値として処理
                 できるところまで (5)
         var context = getAudioContext();
         var source = context.createMediaStreamSource(stream);
         var audioAnalyser = context.createAnalyser();
         var audioAnalyzedData =
         new Uint8Array(audioAnalyser.frequencyBinCount);
         source.connect(audioAnalyser);
         audioAnalyser.getByteFrequencyData(audioAnalyzedData);




              • source は出力オンリーなので、
               audioAnalyserノードの入力につなぐ

              • mediaStream オブジェクトから、
               audioAnalyserノードの入力までが
               つながった

13年2月23日土曜日
取得した LocalMediaStream
               オブジェクトを、値として処理
                 できるところまで (6)
         var context = getAudioContext();
         var source = context.createMediaStreamSource(stream);
         var audioAnalyser = context.createAnalyser();
         var audioAnalyzedData =
         new Uint8Array(audioAnalyser.frequencyBinCount);
         source.connect(audioAnalyser);
         audioAnalyser.getByteFrequencyData(audioAnalyzedData);




              • audioAnalyserノードの
               getByteFrequencyData メソッドを
               任意のタイミングで呼ぶことで、
               型付き配列 audioAnalyzedData に
               毎回データが入る

13年2月23日土曜日
取得した LocalMediaStream
               オブジェクトを、値として処理
                 できるところまで (7)

              • 後はただの配列に対する処理
              • 今回のコンテンツでは、簡素化するた
               めに周波数ごとの平均値を取り、それ
               を時間軸に対しても平均化
               (一瞬だけ音がでかくなることがある
               のを反応しないようにならす)

              • 平均化された数値をしきい値と比較
13年2月23日土曜日
Web Audio API
              •   まだまだ機能は豊富にあるけど、
                  きりがないので一旦この辺で・・・

              •   AnalyserNode だけでも、
                  色々応用考えられそう

              •   例:音声入力だけで操作するゲーム

              • 例:絶対音感を再現するとか
13年2月23日土曜日
おまけ

              • Q. Firefoxではライブ音声入力できな
               いの?

              • A. まだAudioContext のメソッドが
               足りないっぽいです




13年2月23日土曜日
おまけ
         • context.create
              MediaStreamS
              ource がないで
              すね・・・

         • これがないと、
              ライブ音声入力
              をつなぐことが
              出来ません


13年2月23日土曜日
使用した主なAPIなど

              •WebRTC (getUserMedia)

              • Web Audio API
              • Canvas




13年2月23日土曜日
Canvas

              •   前回もちょっと使ったけど、今回は
                  よりCanvasに向いている表現にトライ

              •   気が溜まっていく表現は、下から上に
                  放射線上に変化していってほしい

              •   (ここから先はおまけです)



13年2月23日土曜日
Canvas

              • 先行して検証用コンテンツを
                  作ってみた

              •   radical arrow
                  http://jsdo.it/pypupypa/radical-arrow




13年2月23日土曜日
Canvas




13年2月23日土曜日
Canvas における
                   save(), restore()
              • 自分も最初に Canvas を触ったころ、
                  勘違いして理解できなかったところ

              • context.save() は、Canvasのピクセ
                  ル情報を保持するのではなく、
                  contextを保持する

              •   ここでいうcontextの保持とは、
                  Canvasの回転、変形具合や色など


13年2月23日土曜日
Canvas における
                   save(), restore()

              •   実はこの矢印の座標計算、x軸を
                  プラスにすることだけやっている

              •   回転角度から、sin, cosを使って
                  x, yがいくつで、次の移動が・・・
                  みたいなことはやってない



13年2月23日土曜日
Canvas における
                     save(), restore()
               context.save();
               ...
               context.translate(canvasWidth / 2, canvasHeight / 2);
               context.rotate(rad);
               context.translate(-canvasWidth / 2, -canvasHeight / 2);
               context.drawImage(image, x, y);
               ...
               context.restore();




         •    まず context.save() で 今のcontext
              を保存しておく(あとで戻すため)




13年2月23日土曜日
Canvas における
              save(), restore()




13年2月23日土曜日
Canvas における
                     save(), restore()
               context.save();
               ...
               context.translate(canvasWidth / 2, canvasHeight / 2);
               context.rotate(rad);
               context.translate(-canvasWidth / 2, -canvasHeight / 2);
               context.drawImage(image, x, y);
               ...
               context.restore();




         •    context に対して様々な処理をして
              drawImage で矢印を描画する




13年2月23日土曜日
Canvas における
              save(), restore()




13年2月23日土曜日
Canvas における
                     save(), restore()
               context.save();
               ...
               context.translate(canvasWidth / 2, canvasHeight / 2);
               context.rotate(rad);
               context.translate(-canvasWidth / 2, -canvasHeight / 2);
               context.drawImage(image, x, y);
               ...
               context.restore();




         •    context.restore() を呼ぶと、context
              に対して回転や移動などの処理をする前
              の状態に戻る

         • 元通りの座標に戻るので、オブジェクト
              ごとに処理が固定化できる
13年2月23日土曜日
Canvas における
              save(), restore()




13年2月23日土曜日
Canvas その他

              •   一定フレームごとの描画処理で、
                  前に描いたものに対して、半透明の背
                  景色で塗りつぶすと、残像っぽくなる

              • これだけたくさんのオブジェクトを
                  DOM要素でやったらたぶんつらい
                  (つらそうなのでやってない)



13年2月23日土曜日
エフェクトも
               それなりに


13年2月23日土曜日
13年2月23日土曜日
13年2月23日土曜日
13年2月23日土曜日
すげーそれっぽい!



13年2月23日土曜日
エンジニアでも
              これくらいまでなら
               誰でもできるはず


13年2月23日土曜日
今日話す内容

              1. 作ってきたコンテンツの概要
              2. デモ
              3. WebRTC, Web Audio API などの話
              4. まとめ



13年2月23日土曜日
リアルタイムWeb!


              • リアルタイムに色々できるように
               なってきた、素敵な時代

              • ブラウザの進化すごい


13年2月23日土曜日
ライブ音声入力


              • 声というユーザーインターフェース
              • Web Audio API は、
               いじりがいがありそう




13年2月23日土曜日
くだらないことに
                  全力投球するの楽しい

              •   元ネタは、茶化すわけではなくて
                  本当にリスペクトしてる

              •   あそこまで熱くなれるものを、
                  なんとかして他の人にも体験させられ
                  ないだろうか?

              • 体験の共有

13年2月23日土曜日
これからも
         くだらないことに
        全力投球でいきます!


13年2月23日土曜日
ありがとう
              ございました!


13年2月23日土曜日

Weitere ähnliche Inhalte

Was ist angesagt?

「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステムSEGADevTech
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術Takuto Wada
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはJun-ichi Sakamoto
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
SQLアンチパターン - 開発者を待ち受ける25の落とし穴SQLアンチパターン - 開発者を待ち受ける25の落とし穴
SQLアンチパターン - 開発者を待ち受ける25の落とし穴Takuto Wada
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについてkumake
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理torisoup
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTakuto Wada
 
Jenkinsを使ったコンシューマゲームでのデプロイとテスト
Jenkinsを使ったコンシューマゲームでのデプロイとテストJenkinsを使ったコンシューマゲームでのデプロイとテスト
Jenkinsを使ったコンシューマゲームでのデプロイとテストHiroyuki Tanaka
 
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~Yuki Hirano
 
Sonar qubeでちょっと楽しい静的解析
Sonar qubeでちょっと楽しい静的解析Sonar qubeでちょっと楽しい静的解析
Sonar qubeでちょっと楽しい静的解析政雄 金森
 
はじめてのUniRx
はじめてのUniRxはじめてのUniRx
はじめてのUniRxtorisoup
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術Unity Technologies Japan K.K.
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMPYusuke Kagata
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
ウェブパフォーマンスの基礎とこれから
ウェブパフォーマンスの基礎とこれからウェブパフォーマンスの基礎とこれから
ウェブパフォーマンスの基礎とこれからHiroshi Kawada
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 

Was ist angesagt? (20)

「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
SQLアンチパターン - 開発者を待ち受ける25の落とし穴SQLアンチパターン - 開発者を待ち受ける25の落とし穴
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
UE4 MultiPlayer Online Deep Dive 実践編2 (ソレイユ株式会社様ご講演) #UE4DD
UE4 MultiPlayer Online Deep Dive 実践編2 (ソレイユ株式会社様ご講演) #UE4DDUE4 MultiPlayer Online Deep Dive 実践編2 (ソレイユ株式会社様ご講演) #UE4DD
UE4 MultiPlayer Online Deep Dive 実践編2 (ソレイユ株式会社様ご講演) #UE4DD
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
 
Jenkinsを使ったコンシューマゲームでのデプロイとテスト
Jenkinsを使ったコンシューマゲームでのデプロイとテストJenkinsを使ったコンシューマゲームでのデプロイとテスト
Jenkinsを使ったコンシューマゲームでのデプロイとテスト
 
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
 
【Unity道場】使って覚えるTileMap
【Unity道場】使って覚えるTileMap【Unity道場】使って覚えるTileMap
【Unity道場】使って覚えるTileMap
 
Sonar qubeでちょっと楽しい静的解析
Sonar qubeでちょっと楽しい静的解析Sonar qubeでちょっと楽しい静的解析
Sonar qubeでちょっと楽しい静的解析
 
はじめてのUniRx
はじめてのUniRxはじめてのUniRx
はじめてのUniRx
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
ウェブパフォーマンスの基礎とこれから
ウェブパフォーマンスの基礎とこれからウェブパフォーマンスの基礎とこれから
ウェブパフォーマンスの基礎とこれから
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 

Andere mochten auch

WebRTCのオーディオ処理の謎、誰か教えて!
WebRTCのオーディオ処理の謎、誰か教えて!WebRTCのオーディオ処理の謎、誰か教えて!
WebRTCのオーディオ処理の謎、誰か教えて!mganeko
 
ラズパイでWebRTC ヾ(*´∀`*)ノキャッキャ uv4l-webrtc 軽くハックしてみたよ!
ラズパイでWebRTC ヾ(*´∀`*)ノキャッキャ    uv4l-webrtc 軽くハックしてみたよ!ラズパイでWebRTC ヾ(*´∀`*)ノキャッキャ    uv4l-webrtc 軽くハックしてみたよ!
ラズパイでWebRTC ヾ(*´∀`*)ノキャッキャ uv4l-webrtc 軽くハックしてみたよ!Kensaku Komatsu
 
H.264で相互接続 - WebRTC Meetup Tokyo #10
H.264で相互接続 - WebRTC Meetup Tokyo #10H.264で相互接続 - WebRTC Meetup Tokyo #10
H.264で相互接続 - WebRTC Meetup Tokyo #10goforbroke
 
あのアプリの動きをUIKitのみでDIYしてみる(part2)
あのアプリの動きをUIKitのみでDIYしてみる(part2)あのアプリの動きをUIKitのみでDIYしてみる(part2)
あのアプリの動きをUIKitのみでDIYしてみる(part2)Fumiya Sakai
 
SFUの話
SFUの話SFUの話
SFUの話tnoho
 
第59回 HTML5とか勉強会 ーIoT/WoT発表資料「Web Controller for V-Sido CONNECT:WebRTCとWebGLで作...
第59回 HTML5とか勉強会 ーIoT/WoT発表資料「Web Controller for V-Sido CONNECT:WebRTCとWebGLで作...第59回 HTML5とか勉強会 ーIoT/WoT発表資料「Web Controller for V-Sido CONNECT:WebRTCとWebGLで作...
第59回 HTML5とか勉強会 ーIoT/WoT発表資料「Web Controller for V-Sido CONNECT:WebRTCとWebGLで作...Akihiko Kodama
 
WebRTC SFU mediasoup sample
WebRTC SFU mediasoup sampleWebRTC SFU mediasoup sample
WebRTC SFU mediasoup samplemganeko
 
WebRTC Boot Camp (WebRTC Conference Japan 2016) 事前公開版
WebRTC Boot Camp (WebRTC Conference Japan 2016) 事前公開版WebRTC Boot Camp (WebRTC Conference Japan 2016) 事前公開版
WebRTC Boot Camp (WebRTC Conference Japan 2016) 事前公開版You_Kinjoh
 
WebRTC on Edge
WebRTC on EdgeWebRTC on Edge
WebRTC on EdgeSaki Homma
 
WebRTC NextVersion時代のJavaScript開発
WebRTC NextVersion時代のJavaScript開発WebRTC NextVersion時代のJavaScript開発
WebRTC NextVersion時代のJavaScript開発Yusuke Naka
 
MediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live StreamingMediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live Streamingmganeko
 
色々なデバイスの映像を使ったWebブラウザでのWebRTC映像中継(GotAPIからのWebRTC利用)
色々なデバイスの映像を使ったWebブラウザでのWebRTC映像中継(GotAPIからのWebRTC利用) 色々なデバイスの映像を使ったWebブラウザでのWebRTC映像中継(GotAPIからのWebRTC利用)
色々なデバイスの映像を使ったWebブラウザでのWebRTC映像中継(GotAPIからのWebRTC利用) Device WebAPI Consortium
 
Web of Thingsの現状とWebRTC活用の可能性
Web of Thingsの現状とWebRTC活用の可能性Web of Thingsの現状とWebRTC活用の可能性
Web of Thingsの現状とWebRTC活用の可能性Kensaku Komatsu
 

Andere mochten auch (13)

WebRTCのオーディオ処理の謎、誰か教えて!
WebRTCのオーディオ処理の謎、誰か教えて!WebRTCのオーディオ処理の謎、誰か教えて!
WebRTCのオーディオ処理の謎、誰か教えて!
 
ラズパイでWebRTC ヾ(*´∀`*)ノキャッキャ uv4l-webrtc 軽くハックしてみたよ!
ラズパイでWebRTC ヾ(*´∀`*)ノキャッキャ    uv4l-webrtc 軽くハックしてみたよ!ラズパイでWebRTC ヾ(*´∀`*)ノキャッキャ    uv4l-webrtc 軽くハックしてみたよ!
ラズパイでWebRTC ヾ(*´∀`*)ノキャッキャ uv4l-webrtc 軽くハックしてみたよ!
 
H.264で相互接続 - WebRTC Meetup Tokyo #10
H.264で相互接続 - WebRTC Meetup Tokyo #10H.264で相互接続 - WebRTC Meetup Tokyo #10
H.264で相互接続 - WebRTC Meetup Tokyo #10
 
あのアプリの動きをUIKitのみでDIYしてみる(part2)
あのアプリの動きをUIKitのみでDIYしてみる(part2)あのアプリの動きをUIKitのみでDIYしてみる(part2)
あのアプリの動きをUIKitのみでDIYしてみる(part2)
 
SFUの話
SFUの話SFUの話
SFUの話
 
第59回 HTML5とか勉強会 ーIoT/WoT発表資料「Web Controller for V-Sido CONNECT:WebRTCとWebGLで作...
第59回 HTML5とか勉強会 ーIoT/WoT発表資料「Web Controller for V-Sido CONNECT:WebRTCとWebGLで作...第59回 HTML5とか勉強会 ーIoT/WoT発表資料「Web Controller for V-Sido CONNECT:WebRTCとWebGLで作...
第59回 HTML5とか勉強会 ーIoT/WoT発表資料「Web Controller for V-Sido CONNECT:WebRTCとWebGLで作...
 
WebRTC SFU mediasoup sample
WebRTC SFU mediasoup sampleWebRTC SFU mediasoup sample
WebRTC SFU mediasoup sample
 
WebRTC Boot Camp (WebRTC Conference Japan 2016) 事前公開版
WebRTC Boot Camp (WebRTC Conference Japan 2016) 事前公開版WebRTC Boot Camp (WebRTC Conference Japan 2016) 事前公開版
WebRTC Boot Camp (WebRTC Conference Japan 2016) 事前公開版
 
WebRTC on Edge
WebRTC on EdgeWebRTC on Edge
WebRTC on Edge
 
WebRTC NextVersion時代のJavaScript開発
WebRTC NextVersion時代のJavaScript開発WebRTC NextVersion時代のJavaScript開発
WebRTC NextVersion時代のJavaScript開発
 
MediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live StreamingMediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live Streaming
 
色々なデバイスの映像を使ったWebブラウザでのWebRTC映像中継(GotAPIからのWebRTC利用)
色々なデバイスの映像を使ったWebブラウザでのWebRTC映像中継(GotAPIからのWebRTC利用) 色々なデバイスの映像を使ったWebブラウザでのWebRTC映像中継(GotAPIからのWebRTC利用)
色々なデバイスの映像を使ったWebブラウザでのWebRTC映像中継(GotAPIからのWebRTC利用)
 
Web of Thingsの現状とWebRTC活用の可能性
Web of Thingsの現状とWebRTC活用の可能性Web of Thingsの現状とWebRTC活用の可能性
Web of Thingsの現状とWebRTC活用の可能性
 

Ähnlich wie WebRTC + Web Audio API = スーパーサイヤ人

GREE github-enterprise
GREE github-enterpriseGREE github-enterprise
GREE github-enterpriseKoichiro Ohba
 
Webアプリのマークアップ、どうすればいいの?
Webアプリのマークアップ、どうすればいいの?Webアプリのマークアップ、どうすればいいの?
Webアプリのマークアップ、どうすればいいの?girigiribauer
 
マルチデバイス対応のコーディング・マークアップのポイント
マルチデバイス対応のコーディング・マークアップのポイントマルチデバイス対応のコーディング・マークアップのポイント
マルチデバイス対応のコーディング・マークアップのポイントMasayuki Maekawa
 
10分で分かるr言語入門ver2.2 13 0223
10分で分かるr言語入門ver2.2 13 022310分で分かるr言語入門ver2.2 13 0223
10分で分かるr言語入門ver2.2 13 0223Nobuaki Oshiro
 
アクセス解析システムの裏側 (公開用)
アクセス解析システムの裏側 (公開用)アクセス解析システムの裏側 (公開用)
アクセス解析システムの裏側 (公開用)shunsuke Mikami
 

Ähnlich wie WebRTC + Web Audio API = スーパーサイヤ人 (8)

GREE github-enterprise
GREE github-enterpriseGREE github-enterprise
GREE github-enterprise
 
Webアプリのマークアップ、どうすればいいの?
Webアプリのマークアップ、どうすればいいの?Webアプリのマークアップ、どうすればいいの?
Webアプリのマークアップ、どうすればいいの?
 
Kddi mugen lab
Kddi mugen labKddi mugen lab
Kddi mugen lab
 
CocosBuilderの紹介
CocosBuilderの紹介CocosBuilderの紹介
CocosBuilderの紹介
 
マルチデバイス対応のコーディング・マークアップのポイント
マルチデバイス対応のコーディング・マークアップのポイントマルチデバイス対応のコーディング・マークアップのポイント
マルチデバイス対応のコーディング・マークアップのポイント
 
10分で分かるr言語入門ver2.2 13 0223
10分で分かるr言語入門ver2.2 13 022310分で分かるr言語入門ver2.2 13 0223
10分で分かるr言語入門ver2.2 13 0223
 
アクセス解析システムの裏側 (公開用)
アクセス解析システムの裏側 (公開用)アクセス解析システムの裏側 (公開用)
アクセス解析システムの裏側 (公開用)
 
2012.02.28 IAMAS GeekLab #037 MyScripts
2012.02.28 IAMAS GeekLab #037 MyScripts2012.02.28 IAMAS GeekLab #037 MyScripts
2012.02.28 IAMAS GeekLab #037 MyScripts
 

Mehr von girigiribauer

黒い画面超入門 - tmux を使ってみよう
黒い画面超入門 - tmux を使ってみよう黒い画面超入門 - tmux を使ってみよう
黒い画面超入門 - tmux を使ってみようgirigiribauer
 
JSHint を自分好みにする話
JSHint を自分好みにする話JSHint を自分好みにする話
JSHint を自分好みにする話girigiribauer
 
CSS の Flexible Box Layout がヤバい
CSS の Flexible Box Layout がヤバいCSS の Flexible Box Layout がヤバい
CSS の Flexible Box Layout がヤバいgirigiribauer
 
フロントエンドのツール Yeoman を勘違いしていた
フロントエンドのツール Yeoman を勘違いしていたフロントエンドのツール Yeoman を勘違いしていた
フロントエンドのツール Yeoman を勘違いしていたgirigiribauer
 
Raphael.jsを使ってSVGをモーフィングさせてみた失敗の記録
Raphael.jsを使ってSVGをモーフィングさせてみた失敗の記録Raphael.jsを使ってSVGをモーフィングさせてみた失敗の記録
Raphael.jsを使ってSVGをモーフィングさせてみた失敗の記録girigiribauer
 
WebRTCでドラゴンボールごっこ
WebRTCでドラゴンボールごっこWebRTCでドラゴンボールごっこ
WebRTCでドラゴンボールごっこgirigiribauer
 
Webサイトのようには作れない!Webアプリ設計の考え方
Webサイトのようには作れない!Webアプリ設計の考え方Webサイトのようには作れない!Webアプリ設計の考え方
Webサイトのようには作れない!Webアプリ設計の考え方girigiribauer
 
a-blog cms初心者が テンプレート作るまで
a-blog cms初心者が テンプレート作るまでa-blog cms初心者が テンプレート作るまで
a-blog cms初心者が テンプレート作るまでgirigiribauer
 

Mehr von girigiribauer (8)

黒い画面超入門 - tmux を使ってみよう
黒い画面超入門 - tmux を使ってみよう黒い画面超入門 - tmux を使ってみよう
黒い画面超入門 - tmux を使ってみよう
 
JSHint を自分好みにする話
JSHint を自分好みにする話JSHint を自分好みにする話
JSHint を自分好みにする話
 
CSS の Flexible Box Layout がヤバい
CSS の Flexible Box Layout がヤバいCSS の Flexible Box Layout がヤバい
CSS の Flexible Box Layout がヤバい
 
フロントエンドのツール Yeoman を勘違いしていた
フロントエンドのツール Yeoman を勘違いしていたフロントエンドのツール Yeoman を勘違いしていた
フロントエンドのツール Yeoman を勘違いしていた
 
Raphael.jsを使ってSVGをモーフィングさせてみた失敗の記録
Raphael.jsを使ってSVGをモーフィングさせてみた失敗の記録Raphael.jsを使ってSVGをモーフィングさせてみた失敗の記録
Raphael.jsを使ってSVGをモーフィングさせてみた失敗の記録
 
WebRTCでドラゴンボールごっこ
WebRTCでドラゴンボールごっこWebRTCでドラゴンボールごっこ
WebRTCでドラゴンボールごっこ
 
Webサイトのようには作れない!Webアプリ設計の考え方
Webサイトのようには作れない!Webアプリ設計の考え方Webサイトのようには作れない!Webアプリ設計の考え方
Webサイトのようには作れない!Webアプリ設計の考え方
 
a-blog cms初心者が テンプレート作るまで
a-blog cms初心者が テンプレート作るまでa-blog cms初心者が テンプレート作るまで
a-blog cms初心者が テンプレート作るまで
 

Kürzlich hochgeladen

クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 

Kürzlich hochgeladen (8)

クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 

WebRTC + Web Audio API = スーパーサイヤ人

  • 1. WebRTC + Web Audio API = スーパーサイヤ人 2013/02/23 #daiNagoyaJS vol.5 13年2月23日土曜日
  • 2. いつもぎりぎり、 @girigiribauerです 13年2月23日土曜日
  • 3. 本日のネタは、 大なごやJS Vol.3で 話したネタの 完全版です 13年2月23日土曜日
  • 5. 今日話す内容 1. 作ってきたコンテンツの概要 2. デモ 3. WebRTC, Web Audio API などの話 4. まとめ 13年2月23日土曜日
  • 7. 今日話す内容 1. 作ってきたコンテンツの概要 2. デモ 3. WebRTC, Web Audio API などの話 4. まとめ 13年2月23日土曜日
  • 9. WebRTC + Web Audio API = 13年2月23日土曜日
  • 10. WebRTC + Web Audio API = スーパーサイヤ人 13年2月23日土曜日
  • 11. ドラゴンボールとは • みんな大好きドラゴンボール • サイヤ人は、金色の髪のスーパーサイ ヤ人に変身する • 変身すると 強くなるのは 男のロマン 映画あるよ! http://www.dragonball2013.com/ 13年2月23日土曜日
  • 12. スーパーサイヤ人に なってみたかった 13年2月23日土曜日
  • 14. i'm a super saiyan http://www.youtube.com/watch?v=lIv88cC86r0 13年2月23日土曜日
  • 15. i'm a super saiyan http://www.youtube.com/watch?v=lIv88cC86r0 13年2月23日土曜日
  • 16. i'm a super saiyan http://www.youtube.com/watch?v=lIv88cC86r0 13年2月23日土曜日
  • 17. i'm a super saiyan http://www.youtube.com/watch?v=lIv88cC86r0 13年2月23日土曜日
  • 18. i'm a super saiyan http://www.youtube.com/watch?v=lIv88cC86r0 13年2月23日土曜日
  • 19. i'm a super saiyan http://www.youtube.com/watch?v=lIv88cC86r0 13年2月23日土曜日
  • 20. i'm a super saiyan http://www.youtube.com/watch?v=lIv88cC86r0 13年2月23日土曜日
  • 21. i'm a super saiyan http://www.youtube.com/watch?v=lIv88cC86r0 13年2月23日土曜日
  • 22. respect! • i'm a super saiyan http://www.youtube.com/watch?v=lIv88cC86r0 13年2月23日土曜日
  • 23. 全力投球の 中二病は coolだと思う 13年2月23日土曜日
  • 25. リベンジネタ • 実は大なごやJS Vol.3 でやったネタ (2012/07/21) • 前回は、ホントに軽く作ってみた 13年2月23日土曜日
  • 26. リベンジネタ • あれ、音声がとれない → まだ未実装 • (本番当日) 「ク、クリックで・・・ 代用しました・・・」 13年2月23日土曜日
  • 30. ユーザー体験と しては 0点 13年2月23日土曜日
  • 31. それも 今や昔の話・・・ 13年2月23日土曜日
  • 32. 君もなれる! スーパーサイヤ人に! 13年2月23日土曜日
  • 34. 今日話す内容 1. 作ってきたコンテンツの概要 2. デモ 3. WebRTC, Web Audio API などの話 4. まとめ 13年2月23日土曜日
  • 35. デモ • なれる!スーパーサイヤ人! http://girigiribauer.com/dragonball-super-saiyan/ 13年2月23日土曜日
  • 38. 今日話す内容 1. 作ってきたコンテンツの概要 2. デモ 3. WebRTC, Web Audio API などの話 4. まとめ 13年2月23日土曜日
  • 39. 使用した主なAPIなど •WebRTC (getUserMedia) • Web Audio API • Canvas 13年2月23日土曜日
  • 40. このあたりの話を ピンポイントで 抜粋して紹介 13年2月23日土曜日
  • 41. 使用した主なAPIなど •WebRTC (getUserMedia) • Web Audio API • Canvas 13年2月23日土曜日
  • 42. WebRTC (getUserMedia) • RTCは、Real Time Communication の略 • その中の getUserMedia は、 ローカルにあるカメラ、マイクに アクセスできる 13年2月23日土曜日
  • 43. 対応状況 (※2013/02/23時点) • http://caniuse.com/stream 13年2月23日土曜日
  • 44. 対応状況 (※2013/02/23時点) • Chrome, Operaに続いて Firefoxも getUserMedia が使える! • Firefoxはabout:configのフラグ付き • IEは、そもそもCU-RTC-Webという 別仕様を推進してる (CU: Customizable, Ubiquitous) 13年2月23日土曜日
  • 45. getUserMedia の 基本的な使い方 • navigatorオブジェクトにある getUserMedia メソッド • 引数を3つ取る • 1つ目は、デバイスの種別指定のオブ ジェクト(テキストではない) 13年2月23日土曜日
  • 46. getUserMedia の 基本的な使い方 • 2つ目は、ローカルデバイスに アクセスが出来たときに生成される、 mediaStream オブジェクトを 引数にもつ、コールバック関数 • 3つ目は、上記失敗したときの コールバック関数 13年2月23日土曜日
  • 47. getUserMedia の 基本的な使い方 • そこまで複雑じゃない、数行レベル • クロスブラウザな書き方は、 navigator.getUserMediaに対して 上書きできないので、 ちょっと工夫する 13年2月23日土曜日
  • 48. getUserMedia の 基本的な使い方 var getUserMedia = function(t, onsuccess, onerror) { if (navigator.getUserMedia) { return navigator.getUserMedia(t, onsuccess, onerror); } else if (navigator.webkitGetUserMedia) { return navigator.webkitGetUserMedia(t, onsuccess, onerror); } else if (navigator.mozGetUserMedia) { return navigator.mozGetUserMedia(t, onsuccess, onerror); } else if (navigator.msGetUserMedia) { return navigator.msGetUserMedia(t, onsuccess, onerror); } else { throw new Error('No getUserMedia implementation found.'); } }; • navigator.getUserMediaごと返す • あとはfunctionでラッピングするなり 13年2月23日土曜日
  • 49. getUserMedia の 基本的な使い方 • デバイスへの接続がうまくいった後、 とりあえず表示させるまでの話 (前回の資料をさらっと再紹介) 13年2月23日土曜日
  • 50. 取得した LocalMediaStream オブジ ェクトをきちんと表示するところまで (1) • canvas要素を作る、もしくは予め作っ た要素を参照する • var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); 13年2月23日土曜日
  • 51. 取得した LocalMediaStream オブジ ェクトをきちんと表示するところまで (2) • createObjectURL にさっきの LocalMediaStream オブジェクトを ぶちこんで、BlobURL(リソースを参 照してる)を取得する • var videoUrl = createObjectURL(stream); 13年2月23日土曜日
  • 52. 取得した LocalMediaStream オブジ ェクトをきちんと表示するところまで (2) • デバイスをBlobURLとして受け取るこ とで、同様のインターフェースで扱え る(URL参照 ≒ デバイス参照) • Blobは Binary Large OBject の略、 FileAPI 周りでよく使われてる 13年2月23日土曜日
  • 53. 取得した LocalMediaStream オブジ ェクトをきちんと表示するところまで (3) • video タグの src 属性に、 さっきの BlobURL をつっこむ • var video = document.getElementById('video'); video.src = videoUrl; video.autoplay = true; • ※autoplay 属性がないと最初の1コマ だけで止まっちゃうのでつける • 単に表示のみなら、ここまででOK 13年2月23日土曜日
  • 54. 取得した LocalMediaStream オブジ ェクトをきちんと表示するところまで (4) • あとは連続して canvas に video 要 素を反映してやるだけ • var render = function() { context.drawImage(video, 0, 0, w, h); requestAnimationFrame(render); }; requestAnimationFrame(render); 13年2月23日土曜日
  • 55. video は分かった では audio は? 13年2月23日土曜日
  • 56. その前に、 Web Audio API を考える必要がある 13年2月23日土曜日
  • 57. 使用した主なAPIなど •WebRTC (getUserMedia) • Web Audio API • Canvas 13年2月23日土曜日
  • 58. Web Audio API • 文字通り、Web の Audio の API • ノードというオブジェクト同士を つなぎ合わせることで制御する • 中にはAnalyserノード、数値として 解析できちゃうものもある • 仕様が幅広くて、まだまだ全容把握で きてない 13年2月23日土曜日
  • 59. 対応状況 (※2013/02/23時点) • http://caniuse.com/audio-api 13年2月23日土曜日
  • 60. 対応状況 (※2013/02/23時点) • Chrome, Safari, iOS Safari が使える • つい数日前に、Firefox Nightly にて Web Audio API がフラグ付きで導入 • Firefox21 か 22 あたりで Web Audio API が正式実装される? 13年2月23日土曜日
  • 61. 対応状況 (※2013/02/23時点) • Firefox では、about:config から media.webaudio.enabled を true に • ただし、Firefoxはまだ完全じゃないと ころもある(詳しくは後述) 13年2月23日土曜日
  • 62. Web Audio API で 今回やりたいこと • 今回やりたいのは、 入力から数値として取れるところまで • 出力側は必ずしも必要ではない • ライブ入力の音声を、リアルタイムに 周波数として取れれば良いので、 AnalyserNode を使えばOK 13年2月23日土曜日
  • 65. ここでようやく 今回のキモ 13年2月23日土曜日
  • 67. WebRTC + Web Audio API = 13年2月23日土曜日
  • 68. WebRTC + Web Audio API = スーパーサイヤ人 13年2月23日土曜日
  • 69. WebRTC + Web Audio API = スーパーサイヤ人 (=ライブ音声入力) 13年2月23日土曜日
  • 70. ドコとドコが 繋がっているの? • 先ほどの getUserMedia で出てきた mediaStream オブジェクトを対象の メソッドに渡して連携させる • video側は、 createObjectURL(stream) を使って BlobURLを取得し、video.src として 利用していた 13年2月23日土曜日
  • 71. ドコとドコが 繋がっているの? • audio側は、AudioContext オブジェ クトを用いる • audio周りの処理が、AudioContext オブジェクトのメソッドを介して行わ れる • なので、まず AudioContext を作る • var context = getAudioContext(); 13年2月23日土曜日
  • 72. ドコとドコが 繋がっているの? • video側の createObjectURL(stream) の、audio側に相当しているものは、 context.createMediaStreamSource(s tream) • 意味はそのまんま、mediaStream を 入力として作ります、と書いてある • 2つの仕様が連携することで、逆に videoよりもシンプルで分かりやすい 13年2月23日土曜日
  • 73. ライブ音声入力の 周波数ごとの値を 取得できる ところまでの流れ 13年2月23日土曜日
  • 74. 取得した LocalMediaStream オブジェクトを、値として処理 できるところまで (1) var context = getAudioContext(); var source = context.createMediaStreamSource(stream); var audioAnalyser = context.createAnalyser(); var audioAnalyzedData = new Uint8Array(audioAnalyser.frequencyBinCount); source.connect(audioAnalyser); audioAnalyser.getByteFrequencyData(audioAnalyzedData); • AudioContext を作る 13年2月23日土曜日
  • 75. 取得した LocalMediaStream オブジェクトを、値として処理 できるところまで (2) var context = getAudioContext(); var source = context.createMediaStreamSource(stream); var audioAnalyser = context.createAnalyser(); var audioAnalyzedData = new Uint8Array(audioAnalyser.frequencyBinCount); source.connect(audioAnalyser); audioAnalyser.getByteFrequencyData(audioAnalyzedData); • AudioContext に対して、 createMediaStreamSource メソッド を呼ぶと、 MediaStreamAudioSourceNode とい う 出力用のノードが取得できる 13年2月23日土曜日
  • 76. 取得した LocalMediaStream オブジェクトを、値として処理 できるところまで (3) var context = getAudioContext(); var source = context.createMediaStreamSource(stream); var audioAnalyser = context.createAnalyser(); var audioAnalyzedData = new Uint8Array(audioAnalyser.frequencyBinCount); source.connect(audioAnalyser); audioAnalyser.getByteFrequencyData(audioAnalyzedData); • 先ほどとは別に、 AudioContext に対して createAnalyser メソッドを呼ぶと、 AnalyserNode という、音データの解 析ができるノードが取得できる 13年2月23日土曜日
  • 77. 取得した LocalMediaStream オブジェクトを、値として処理 できるところまで (4) var context = getAudioContext(); var source = context.createMediaStreamSource(stream); var audioAnalyser = context.createAnalyser(); var audioAnalyzedData = new Uint8Array(audioAnalyser.frequencyBinCount); source.connect(audioAnalyser); audioAnalyser.getByteFrequencyData(audioAnalyzedData); • (今すぐ必要ではないけど、) あらかじめ周波数分のUint8Array型の 型付き配列(Typed Array)を 作っておく • ただの配列でも良いけど、速度の問題 13年2月23日土曜日
  • 78. 取得した LocalMediaStream オブジェクトを、値として処理 できるところまで (5) var context = getAudioContext(); var source = context.createMediaStreamSource(stream); var audioAnalyser = context.createAnalyser(); var audioAnalyzedData = new Uint8Array(audioAnalyser.frequencyBinCount); source.connect(audioAnalyser); audioAnalyser.getByteFrequencyData(audioAnalyzedData); • source は出力オンリーなので、 audioAnalyserノードの入力につなぐ • mediaStream オブジェクトから、 audioAnalyserノードの入力までが つながった 13年2月23日土曜日
  • 79. 取得した LocalMediaStream オブジェクトを、値として処理 できるところまで (6) var context = getAudioContext(); var source = context.createMediaStreamSource(stream); var audioAnalyser = context.createAnalyser(); var audioAnalyzedData = new Uint8Array(audioAnalyser.frequencyBinCount); source.connect(audioAnalyser); audioAnalyser.getByteFrequencyData(audioAnalyzedData); • audioAnalyserノードの getByteFrequencyData メソッドを 任意のタイミングで呼ぶことで、 型付き配列 audioAnalyzedData に 毎回データが入る 13年2月23日土曜日
  • 80. 取得した LocalMediaStream オブジェクトを、値として処理 できるところまで (7) • 後はただの配列に対する処理 • 今回のコンテンツでは、簡素化するた めに周波数ごとの平均値を取り、それ を時間軸に対しても平均化 (一瞬だけ音がでかくなることがある のを反応しないようにならす) • 平均化された数値をしきい値と比較 13年2月23日土曜日
  • 81. Web Audio API • まだまだ機能は豊富にあるけど、 きりがないので一旦この辺で・・・ • AnalyserNode だけでも、 色々応用考えられそう • 例:音声入力だけで操作するゲーム • 例:絶対音感を再現するとか 13年2月23日土曜日
  • 82. おまけ • Q. Firefoxではライブ音声入力できな いの? • A. まだAudioContext のメソッドが 足りないっぽいです 13年2月23日土曜日
  • 83. おまけ • context.create MediaStreamS ource がないで すね・・・ • これがないと、 ライブ音声入力 をつなぐことが 出来ません 13年2月23日土曜日
  • 84. 使用した主なAPIなど •WebRTC (getUserMedia) • Web Audio API • Canvas 13年2月23日土曜日
  • 85. Canvas • 前回もちょっと使ったけど、今回は よりCanvasに向いている表現にトライ • 気が溜まっていく表現は、下から上に 放射線上に変化していってほしい • (ここから先はおまけです) 13年2月23日土曜日
  • 86. Canvas • 先行して検証用コンテンツを 作ってみた • radical arrow http://jsdo.it/pypupypa/radical-arrow 13年2月23日土曜日
  • 88. Canvas における save(), restore() • 自分も最初に Canvas を触ったころ、 勘違いして理解できなかったところ • context.save() は、Canvasのピクセ ル情報を保持するのではなく、 contextを保持する • ここでいうcontextの保持とは、 Canvasの回転、変形具合や色など 13年2月23日土曜日
  • 89. Canvas における save(), restore() • 実はこの矢印の座標計算、x軸を プラスにすることだけやっている • 回転角度から、sin, cosを使って x, yがいくつで、次の移動が・・・ みたいなことはやってない 13年2月23日土曜日
  • 90. Canvas における save(), restore() context.save(); ... context.translate(canvasWidth / 2, canvasHeight / 2); context.rotate(rad); context.translate(-canvasWidth / 2, -canvasHeight / 2); context.drawImage(image, x, y); ... context.restore(); • まず context.save() で 今のcontext を保存しておく(あとで戻すため) 13年2月23日土曜日
  • 91. Canvas における save(), restore() 13年2月23日土曜日
  • 92. Canvas における save(), restore() context.save(); ... context.translate(canvasWidth / 2, canvasHeight / 2); context.rotate(rad); context.translate(-canvasWidth / 2, -canvasHeight / 2); context.drawImage(image, x, y); ... context.restore(); • context に対して様々な処理をして drawImage で矢印を描画する 13年2月23日土曜日
  • 93. Canvas における save(), restore() 13年2月23日土曜日
  • 94. Canvas における save(), restore() context.save(); ... context.translate(canvasWidth / 2, canvasHeight / 2); context.rotate(rad); context.translate(-canvasWidth / 2, -canvasHeight / 2); context.drawImage(image, x, y); ... context.restore(); • context.restore() を呼ぶと、context に対して回転や移動などの処理をする前 の状態に戻る • 元通りの座標に戻るので、オブジェクト ごとに処理が固定化できる 13年2月23日土曜日
  • 95. Canvas における save(), restore() 13年2月23日土曜日
  • 96. Canvas その他 • 一定フレームごとの描画処理で、 前に描いたものに対して、半透明の背 景色で塗りつぶすと、残像っぽくなる • これだけたくさんのオブジェクトを DOM要素でやったらたぶんつらい (つらそうなのでやってない) 13年2月23日土曜日
  • 97. エフェクトも それなりに 13年2月23日土曜日
  • 102. エンジニアでも これくらいまでなら 誰でもできるはず 13年2月23日土曜日
  • 103. 今日話す内容 1. 作ってきたコンテンツの概要 2. デモ 3. WebRTC, Web Audio API などの話 4. まとめ 13年2月23日土曜日
  • 104. リアルタイムWeb! • リアルタイムに色々できるように なってきた、素敵な時代 • ブラウザの進化すごい 13年2月23日土曜日
  • 105. ライブ音声入力 • 声というユーザーインターフェース • Web Audio API は、 いじりがいがありそう 13年2月23日土曜日
  • 106. くだらないことに 全力投球するの楽しい • 元ネタは、茶化すわけではなくて 本当にリスペクトしてる • あそこまで熱くなれるものを、 なんとかして他の人にも体験させられ ないだろうか? • 体験の共有 13年2月23日土曜日
  • 107. これからも くだらないことに 全力投球でいきます! 13年2月23日土曜日
  • 108. ありがとう ございました! 13年2月23日土曜日