SlideShare une entreprise Scribd logo
1  sur  73
WebRTC Meetup #1
ハンズオン
インフォコム株式会社
がねこまさし
今日のテーマ
• シグナリングの話だけ、します
– Peer-to-Peer がつながる前の話です
• UserMediaの話はしません。ごめんなさい
• STUN/TURN、DataChannelの話もありません
元ネタ
• HTML5Experts.jp に書いた記事がベース
– WebRTCに触ってみたいエンジニア必見!手動で
WebRTC通信をつなげてみよう
• http://html5experts.jp/mganeko/5181/
– WebRTC初心者でも簡単にできる!Node.jsで仲
介(シグナリング)を作ってみよう
• http://html5experts.jp/mganeko/5349/
• すでに試した方は同じ話です。ごめんなさい
WebRTCの通信はどうなっているの?
• 映像や音声などリアルタイムに取得されたデー
タを、ブラウザ間で送受信
• RTCPeerConnectionが行う
– Peer-to-Peerの通信
• ブラウザとブラウザの間で直接通信する
– UDP/IPを使用
• TCP/IPのようにパケットの到着は保障しない
• オーバーヘッドが少ない
• 通信のリアルタイム性を重視
• UDPのポート番号は動的に割り振られる(49152 ~ 65535)
Peer-to-Peer通信が確立するまで(1)
• Peer-to-Peerを行うには
– 相手のIPアドレスを知る必要がある
– 動的に割り振られるUDPのポート番号も知る必要が
ある
• Session Description Protocol (SDP)の交換
– WebRTC専用ではなく、VoIP等で利用されている
– 各エンドポイント(ブラウザ)の情報を示す。例えば、
• メディアの種類(音声、映像)、メディアの形式(コーデック)
• データ転送プロトコル → WebRTCでは Secure RTP
• 通信で使用する帯域
Peer-to-Peer通信が確立するまで(2)
• Interactive Connectivity Establishment (ICE)の交換
– WebRTC専用ではなく、P2Pで利用されている
– 途中経路の情報を示す。複数ある場合も多い
• P2Pによる直接通信
• STUNによる、NAT通過のためのポートマッピング
– → 最終的にはP2Pになる
• TURNによる、リレーサーバーを介した中継通信
SDP SDPICE
手動編
ということで、やってみましょう
• WebRTCに触ってみたいエンジニア必見!手動でWebRTC通
信をつなげてみよう
– http://html5experts.jp/mganeko/5181/
– 一番下の方の「手動シグナリングの改良版ソース(2014年4月21日追
加)」のソース
• 手動シグナリングは操作が面倒
• 必要なテキストを自動で選択するように
DEMO
ということで、やってみましょう
• WebRTCに触ってみたいエンジニア必見!手動でWebRTC通
信をつなげてみよう
– http://html5experts.jp/mganeko/5181/
– 一番下の方の「手動シグナリングの改良版ソース(2014年4月21日追
加)」のソース
• みなさんも、一緒にやってみましょう
– ソースを自分のマシンにコピーして、Chromeでアクセス
– 自前のWebサーバーが必要です
– ※file:// ~ ではなく、 http:// ~ の必要があります
• ※手動シグナリングは、なぜか動作が不安定
– 端末によっては通信が確立しないケースあり
• 今のところ成功は4台/7台
– 原因がさっぱりわからない … 情報求む!
• もし心当たりがあったら教えていただけると助かります
カメラ(UserMedia)を取得
SDPのやりとり
11
PeerConnectionApplication PeerConnection Application
new
new PeerConnection()
function prepareNewConnection() {
var pc_config = {"iceServers":[]}; // info of STUN/TURN
var peer = null;
peer = new webkitRTCPeerConnection(pc_config);
peer.onicecandidate = function (evt) { … }
peer.addStream(localStream);
peer.addEventListener("addstream",
onRemoteStreamAdded, false);
peer.addEventListener("removestream",
onRemoteStreamRemoved, false);
return peer;
}
SDPのやりとり
13
PeerConnectionApplication PeerConnection Application
new
createOffer()
setLocalDescription(sdp)
offer sdp
sendOffer()
function sendOffer() {
peerConnection = prepareNewConnection();
peerConnection.createOffer(
function (sessionDescription) { // in case of success
peerConnection.setLocalDescription(sessionDescription);
sendSDP(sessionDescription); // show in textarea
}, function () { // in case of error
}, mediaConstraints);
}
offer SDP を生成
SDPのやりとり
16
PeerConnectionApplication PeerConnection Application
new
createOffer()
setLocalDescription(sdp)
offer sdp
sdp Copy & Paste
setRemoteDescription(sdp)
new
setOffer()
function setOffer(evt) {
peerConnection = prepareNewConnection();
peerConnection.setRemoteDescription(
new RTCSessionDescription(evt)
);
}
SDPを手動でコピー(offer)
SDPのやりとり
19
PeerConnectionApplication PeerConnection Application
new
createOffer()
setLocalDescription(sdp)
offer sdp
sdp Copy & Paste
createAnswer()
answer sdp
setLocalDescription(sdp)
setRemoteDescription(sdp)
new
sendAnswer()
function sendAnswer(evt) {
peerConnection.createAnswer(
function (sessionDescription) { // in case of success
peerConnection.setLocalDescription(sessionDescription);
sendSDP(sessionDescription); // show in textarea
}, function () { // in case of error
},
mediaConstraints);
}
answer SDPを生成
SDPのやりとり
22
PeerConnectionApplication PeerConnection Application
new
createOffer()
setLocalDescription(sdp)
offer sdp
sdp Copy & Paste
createAnswer()
answer sdp
setLocalDescription(sdp)
setRemoteDescription(sdp)
new
sdp Copy & Paste
setRemoteDescription(sdp)
setAnswer()
function setAnswer(evt) {
peerConnection.setRemoteDescription(
new RTCSessionDescription(evt)
);
}
SDPを手動でコピー(answer)
SDPのやりとり(全体)
25
PeerConnectionApplication PeerConnection Application
new
createOffer()
setLocalDescription(sdp)
offer sdp
sdp Copy & Paste
createAnswer()
answer sdp
setLocalDescription(sdp)
setRemoteDescription(sdp)
new
sdp Copy & Paste
setRemoteDescription(sdp)
ICE Candidateのやりとり
26
PeerConnectionApplication PeerConnection Application
onIceCandidate(ice)
peer.onIceCandidate()
function prepareNewConnection() {
var pc_config = {"iceServers":[]};
var peer = null;
peer = new webkitRTCPeerConnection(pc_config);
peer.onicecandidate = function (evt) {
if (evt.candidate) {
sendCandidate({ // show in text area
type: "candidate",
sdpMLineIndex: evt.candidate.sdpMLineIndex,
sdpMid: evt.candidate.sdpMid,
candidate: evt.candidate.candidate
});
} else {
// End of candidates.
}
}
…
return peer;
}
ICE Candidateのやりとり
28
PeerConnectionApplication PeerConnection Application
addIceCandidate(ice)
onIceCandidate(ice)
ice Copy & Paste
addIceCandidate()
function onCandidate(evt) {
var candidate = new RTCIceCandidate({
sdpMLineIndex:evt.sdpMLineIndex,
sdpMid:evt.sdpMid,
candidate:evt.candidate
});
peerConnection.addIceCandidate(candidate);
}
ICEを手動でコピー
ICEを手動でコピー
ICE Candidateのやりとり
32
PeerConnectionApplication PeerConnection Application
onIceCandidate(ice)
addIceCandidate(ice)
addIceCandidate(ice)
onIceCandidate(ice)
ice Copy & Paste
ice Copy & Paste
peer.onIceCandidate() ※同じ
function prepareNewConnection() {
var pc_config = {"iceServers":[]};
var peer = null;
peer = new webkitRTCPeerConnection(pc_config);
peer.onicecandidate = function (evt) {
if (evt.candidate) {
sendCandidate({ // show in text area
type: "candidate",
sdpMLineIndex: evt.candidate.sdpMLineIndex,
sdpMid: evt.candidate.sdpMid,
candidate: evt.candidate.candidate
});
} else {
// End of candidates.
}
}
…
return peer;
}
addIceCandidate() ※同じ
function onCandidate(evt) {
var candidate = new RTCIceCandidate({
sdpMLineIndex:evt.sdpMLineIndex,
sdpMid:evt.sdpMid,
candidate:evt.candidate
});
peerConnection.addIceCandidate(candidate);
}
ICEを手動でコピー(帰り)
ICE Candidateのやりとり
36
PeerConnectionApplication PeerConnection Application
onIceCandidate(ice)
addIceCandidate(ice)
addIceCandidate(ice)
onIceCandidate(ice)
onIceCandidate() : end of candidate onIceCandidate() : end of candidate
P2P stream transfer
ice Copy & Paste
ice Copy & Paste
ICEを手動でコピー(帰り)
ICE Candidateのやりとり (全体)
38
PeerConnectionApplication PeerConnection Application
onIceCandidate(ice)
addIceCandidate(ice)
addIceCandidate(ice)
onIceCandidate(ice)
onIceCandidate() : end of candidate onIceCandidate() : end of candidate
P2P stream transfer
ice Copy & Paste
ice Copy & Paste
ICE Candidateのやりとり(今回)
39
PeerConnectionApplication PeerConnection Application
onIceCandidate(ice)
addIceCandidate(ice)
addIceCandidate(ice)
onIceCandidate(ice)
P2P stream transfer
ice, ice, ice, ice Copy & Paste
ice, ice, ice, ice Copy & Paste
シグナリングサーバー編
シグナリングサーバーはどうして必要なの?
• シグナリングの過程で、情報を受け渡したい
– お互いのIPアドレス
– お互いのポート番号
• この段階ではお互いIPアドレスを知らない
– 直接やりとりでない
• 仲介役となるシグナリングサーバーが必要
– どちらブラウザもサーバーのIPアドレスを知って
いることが前提
Peer-to-Peer通信の開始前に、普通のサーバー/クライアント型の通信が行われる
準備
• Node.jsをインストール
– http://nodejs.jp/nodejs.org_ja/docs/v0.10/
• socket.ioもインストール
$ sudo npm install socket.io
シグナリングサーバー
• WebRTC…Node.jsで仲介(シグナリング)を作ってみよう
– http://html5experts.jp/mganeko/5349/
• 例えば、signaling.jsに記述、起動
$ node signaling.js
var port = 9001; // as you like
var io = require('socket.io').listen(port);
console.log((new Date()) + " Server is listening on port " + port);
io.sockets.on('connection', function(socket) {
socket.on('message', function(message) {
socket.broadcast.emit('message', message);
});
socket.on('disconnect', function() {
socket.broadcast.emit('user disconnected');
});
});
動かしてみます
DEMO
みなさんも、やってみてください
• スタートは、先ほどの手動用HTML
– そのHTML/JavaScriptを修正
• やることは、HTML5Experts.jpの記事の内容
– WebRTC初心者でも簡単にできる!Node.jsで仲
介(シグナリング)を作ってみよう
– http://html5experts.jp/mganeko/5349/
• まず、socket.io.jsを読み込みます
<script src="http://localhost:9001/socket.io/socket.io.js"></script>
ソケットの確立
49
PeerConnection
socket
Application
Signaling
Server
PeerConnection
socket
Application
connect()
connect connect()
connect
connect()
var socketReady = false;
var port = 9001;
var socket = io.connect('http://localhost:' + port + '/');
// socket: channel connected
socket.on('connect', onOpened)
.on('message', onMessage);
function onOpened(evt) {
console.log('socket opened.');
socketReady = true;
}
メッセージ処理
// socket: accept connection request
function onMessage(evt) {
if (evt.type === 'offer') {
onOffer(evt);
} else if (evt.type === 'answer' && peerStarted) {
onAnswer(evt);
} else if (evt.type === 'candidate' && peerStarted) {
onCandidate(evt);
} else if (evt.type === 'user dissconnected' && peerStarted) {
stop();
}
}
SDPのやりとり
52
PeerConnection
socket
Application
Signaling
Server
PeerConnection
socket
Application
connect()
connect connect()
connect
createOffer()
offer sdp
setLocalDescription(sdp)
send(sdp)
send sdp
send sdp onMessage(sdp)
setRemoteDescription(sdp)
sendSDP()
function sendOffer() {
peerConnection = prepareNewConnection();
peerConnection.createOffer(
function (sessionDescription) { // in case of success
peerConnection.setLocalDescription(sessionDescription);
sendSDP(sessionDescription);
},
function () { // in case of error
},
mediaConstraints);
}
function sendSDP(sdp) {
// send via socket
socket.json.send(sdp);
}
onMessage()
function onMessage(evt) {
if (evt.type === 'offer') {
onOffer(evt);
} else if (evt.type === 'answer' && peerStarted) {
onAnswer(evt);
} else if (evt.type === 'candidate' && peerStarted) {
onCandidate(evt);
} else if (evt.type === 'user dissconnected' && peerStarted) {
stop();
}
}
onOffer(), setOffer()
function onOffer(evt) {
setOffer(evt);
sendAnswer(evt);
}
function setOffer(evt) {
peerConnection = prepareNewConnection();
peerConnection.setRemoteDescription(
new RTCSessionDescription(evt)
);
}
SDPのやりとり
56
PeerConnection
socket
Application
Signaling
Server
PeerConnection
socket
Application
connect()
connect connect()
connect
createOffer()
offer sdp
setLocalDescription(sdp)
send(sdp)
send sdp
send sdp onMessage(sdp)
setRemoteDescription(sdp)
createAnswer()
answer sdp
send sdp
send(sdp)
send sdp
onMessage(sdp)
setRemoteDescription(sdp)
setLocalDescription(sdp)
sendSDP()
function sendAnswer(evt) {
peerConnection.createAnswer(
function (sessionDescription) { // in case of success
peerConnection.setLocalDescription(sessionDescription);
sendSDP(sessionDescription);
},
function () { // in case of error
},
mediaConstraints);
}
function sendSDP(sdp) {
// send via socket
socket.json.send(sdp);
}
onMessage()
function onMessage(evt) {
if (evt.type === 'offer') {
onOffer(evt);
} else if (evt.type === 'answer' && peerStarted) {
onAnswer(evt);
} else if (evt.type === 'candidate' && peerStarted) {
onCandidate(evt);
} else if (evt.type === 'user dissconnected' && peerStarted) {
stop();
}
}
onAnswer(), setAnswer ()
function onAnswer(evt) {
setAnswer(evt);
}
function setAnswer(evt) {
peerConnection.setRemoteDescription(
new RTCSessionDescription(evt)
);
}
SDPのやりとり(全体)
60
PeerConnection
socket
Application
Signaling
Server
PeerConnection
socket
Application
connect()
connect connect()
connect
createOffer()
offer sdp
setLocalDescription(sdp)
send(sdp)
send sdp
send sdp onMessage(sdp)
setRemoteDescription(sdp)
createAnswer()
answer sdp
send sdp
send(sdp)
send sdp
onMessage(sdp)
setRemoteDescription(sdp)
setLocalDescription(sdp)
ICE Candidateのやりとり
61
PeerConnection
socket
Application
Signaling
Server
PeerConnection
socket
Application
send(ice) send ice
send ice
onMessage(ice)
addIceCandidate(ice)
onIceCandidate(ice)
peer.onIceCandidate()
function prepareNewConnection() {
var pc_config = {"iceServers":[]};
var peer = null;
peer = new webkitRTCPeerConnection(pc_config);
peer.onicecandidate = function (evt) {
if (evt.candidate) {
sendCandidate({
type: "candidate",
sdpMLineIndex: evt.candidate.sdpMLineIndex,
sdpMid: evt.candidate.sdpMid,
candidate: evt.candidate.candidate
});
} else {
// End of candidates.
}
}
…
return peer;
}
sendCandidate()
function sendCandidate(candidate) {
// send via socket
socket.json.send(candidate);
}
onMessage()
function onMessage(evt) {
if (evt.type === 'offer') {
onOffer(evt);
} else if (evt.type === 'answer' && peerStarted) {
onAnswer(evt);
} else if (evt.type === 'candidate' && peerStarted) {
onCandidate(evt);
} else if (evt.type === 'user dissconnected' && peerStarted) {
stop();
}
}
onCandidate(), addIceCandidate()
function onCandidate(evt) {
var candidate = new RTCIceCandidate({
sdpMLineIndex:evt.sdpMLineIndex,
sdpMid:evt.sdpMid,
candidate:evt.candidate
});
peerConnection.addIceCandidate(candidate);
}
ICE Candidateのやりとり
66
PeerConnection
socket
Application
Signaling
Server
PeerConnection
socket
Application
onIceCandidate(ice)
send(ice) send ice
send ice
onMessage(ice)
addIceCandidate(ice)
send ice send(ice)
send ice
onMessage(ice)
addIceCandidate(ice)
onIceCandidate(ice)
peer.onIceCandidate() ※同じ
function prepareNewConnection() {
var pc_config = {"iceServers":[]};
var peer = null;
peer = new webkitRTCPeerConnection(pc_config);
peer.onicecandidate = function (evt) {
if (evt.candidate) {
sendCandidate({
type: "candidate",
sdpMLineIndex: evt.candidate.sdpMLineIndex,
sdpMid: evt.candidate.sdpMid,
candidate: evt.candidate.candidate
});
} else {
// End of candidates.
}
}
…
return peer;
}
onMessage() ※同じ
function onMessage(evt) {
if (evt.type === 'offer') {
onOffer(evt);
} else if (evt.type === 'answer' && peerStarted) {
onAnswer(evt);
} else if (evt.type === 'candidate' && peerStarted) {
onCandidate(evt);
} else if (evt.type === 'user dissconnected' && peerStarted) {
stop();
}
}
onCandidate(), addIceCandidate() ※同じ
function onCandidate(evt) {
var candidate = new RTCIceCandidate({
sdpMLineIndex:evt.sdpMLineIndex,
sdpMid:evt.sdpMid,
candidate:evt.candidate
});
peerConnection.addIceCandidate(candidate);
}
ICE Candidateのやりとり
70
PeerConnection
socket
Application
Signaling
Server
PeerConnection
socket
Application
onIceCandidate(ice)
send(ice) send ice
send ice
onMessage(ice)
addIceCandidate(ice)
send ice send(ice)
send ice
onMessage(ice)
addIceCandidate(ice)
onIceCandidate(ice)
onIceCandidate() : end of candidate
onIceCandidate() : end of candidate
P2P stream transfer
ICE Candidateのやりとり(全体)
71
PeerConnection
socket
Application
Signaling
Server
PeerConnection
socket
Application
onIceCandidate(ice)
send(ice) send ice
send ice
onMessage(ice)
addIceCandidate(ice)
send ice send(ice)
send ice
onMessage(ice)
addIceCandidate(ice)
onIceCandidate(ice)
onIceCandidate() : end of candidate
onIceCandidate() : end of candidate
P2P stream transfer
Peer-to-Peer 通信確立
なぜWebRTCに注目するのか?
通信手段の破壊的進化
キャリア型通信
固定電話
携帯電話
(TV放送)
手段の例
Over The Top
Skype, WebEx
(YouTube, USTREAM)
Webブラウザ型
WebRTC
世界中の人と会話
できる
ユーザメリット
世界中の人と無料/
安価で会話できる
専用アプリ無しで
会話できる
インフラを持つ
キャリアが支配
市場
キャリアに縛られない
独自の仕組みを提供
する少数のベンダー
が参加可能
特別な仕組みは不要
誰でも参加可能
×事業者メリット
限定的なAPI提供
連携可能
完全にプログラマブル
部品として利用可能
単独で利用利用方法
ユーザが組み合わ
せて利用
製品/サービスに
組み込んで利用
コールセンター、ECサイト、情報共有システム、など
WebRTCをどんな風に使うかは、
みなさんのアイデア次第です!
74
Thank you!
75
END

Contenu connexe

Tendances

2013 WebRTC node
2013 WebRTC node2013 WebRTC node
2013 WebRTC nodemganeko
 
ブラウザでWebRTC - iOSゲートウェイ作ってみた
ブラウザでWebRTC - iOSゲートウェイ作ってみたブラウザでWebRTC - iOSゲートウェイ作ってみた
ブラウザでWebRTC - iOSゲートウェイ作ってみたmganeko
 
WebRTC mediasoup on raspberrypi3
WebRTC mediasoup on raspberrypi3WebRTC mediasoup on raspberrypi3
WebRTC mediasoup on raspberrypi3mganeko
 
Infocom webrtc conference japan
Infocom webrtc conference japanInfocom webrtc conference japan
Infocom webrtc conference japanmganeko
 
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...mganeko
 
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
 
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説You_Kinjoh
 
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜Yusuke Naka
 
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみようWebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみようmganeko
 
WebRTC multitrack / multistream
WebRTC multitrack / multistreamWebRTC multitrack / multistream
WebRTC multitrack / multistreammganeko
 
PeerConnectionリレーとMediaRecorder
PeerConnectionリレーとMediaRecorderPeerConnectionリレーとMediaRecorder
PeerConnectionリレーとMediaRecordermganeko
 
SkyWayで作るボイスチャット
SkyWayで作るボイスチャットSkyWayで作るボイスチャット
SkyWayで作るボイスチャットtioken
 
Skywayのビデオチャットを録画しよう。そう、ブラウザでね
Skywayのビデオチャットを録画しよう。そう、ブラウザでねSkywayのビデオチャットを録画しよう。そう、ブラウザでね
Skywayのビデオチャットを録画しよう。そう、ブラウザでねmganeko
 
SFUの話
SFUの話SFUの話
SFUの話tnoho
 
WebRTC/ORTCの最新動向まるわかり!
WebRTC/ORTCの最新動向まるわかり!WebRTC/ORTCの最新動向まるわかり!
WebRTC/ORTCの最新動向まるわかり!Yusuke Naka
 
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
 
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術Yoshiaki Sugimoto
 

Tendances (19)

2013 WebRTC node
2013 WebRTC node2013 WebRTC node
2013 WebRTC node
 
ブラウザでWebRTC - iOSゲートウェイ作ってみた
ブラウザでWebRTC - iOSゲートウェイ作ってみたブラウザでWebRTC - iOSゲートウェイ作ってみた
ブラウザでWebRTC - iOSゲートウェイ作ってみた
 
WebRTC mediasoup on raspberrypi3
WebRTC mediasoup on raspberrypi3WebRTC mediasoup on raspberrypi3
WebRTC mediasoup on raspberrypi3
 
Infocom webrtc conference japan
Infocom webrtc conference japanInfocom webrtc conference japan
Infocom webrtc conference japan
 
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
 
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
 
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説
HTML5と WebSocket / WebRTC / Web Audio API / WebGL 技術解説
 
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
 
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみようWebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
 
WebRTC multitrack / multistream
WebRTC multitrack / multistreamWebRTC multitrack / multistream
WebRTC multitrack / multistream
 
PeerConnectionリレーとMediaRecorder
PeerConnectionリレーとMediaRecorderPeerConnectionリレーとMediaRecorder
PeerConnectionリレーとMediaRecorder
 
SkyWayで作るボイスチャット
SkyWayで作るボイスチャットSkyWayで作るボイスチャット
SkyWayで作るボイスチャット
 
Skywayのビデオチャットを録画しよう。そう、ブラウザでね
Skywayのビデオチャットを録画しよう。そう、ブラウザでねSkywayのビデオチャットを録画しよう。そう、ブラウザでね
Skywayのビデオチャットを録画しよう。そう、ブラウザでね
 
SFUの話
SFUの話SFUの話
SFUの話
 
WebRTC/ORTCの最新動向まるわかり!
WebRTC/ORTCの最新動向まるわかり!WebRTC/ORTCの最新動向まるわかり!
WebRTC/ORTCの最新動向まるわかり!
 
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) 事前公開版
 
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
 

En vedette

WebRTC Build MCU on browser
WebRTC Build MCU on browserWebRTC Build MCU on browser
WebRTC Build MCU on browsermganeko
 
WebRTC Meetup Tokyo #3 - WebRTC Conference参加報告
WebRTC Meetup Tokyo #3 - WebRTC Conference参加報告WebRTC Meetup Tokyo #3 - WebRTC Conference参加報告
WebRTC Meetup Tokyo #3 - WebRTC Conference参加報告satoru_tk
 
ORTCの仕様書をざっくり斜め読みする
ORTCの仕様書をざっくり斜め読みするORTCの仕様書をざっくり斜め読みする
ORTCの仕様書をざっくり斜め読みするYusuke Naka
 
知ってると得するかもしれないConstraintsたち
知ってると得するかもしれないConstraintsたち知ってると得するかもしれないConstraintsたち
知ってると得するかもしれないConstraintsたちKensaku Komatsu
 
うしちゃん WebRTC Chat on SkyWayの開発コードw
うしちゃん WebRTC Chat on SkyWayの開発コードwうしちゃん WebRTC Chat on SkyWayの開発コードw
うしちゃん WebRTC Chat on SkyWayの開発コードwKensaku Komatsu
 
ArduinoでMidiコントローラーを作ろう
ArduinoでMidiコントローラーを作ろうArduinoでMidiコントローラーを作ろう
ArduinoでMidiコントローラーを作ろうtadfmac
 
WebRTC on Edge
WebRTC on EdgeWebRTC on Edge
WebRTC on EdgeSaki Homma
 
Inside of 聖徳玉子 by O2
Inside of 聖徳玉子 by O2Inside of 聖徳玉子 by O2
Inside of 聖徳玉子 by O2mganeko
 
WebRTCの技術解説 公開版
WebRTCの技術解説 公開版WebRTCの技術解説 公開版
WebRTCの技術解説 公開版Contest Ntt-west
 
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )mganeko
 
MistCDNの概要 / Technical Session - WebRTC Meetup Tokyo #9
MistCDNの概要 / Technical Session - WebRTC Meetup Tokyo #9MistCDNの概要 / Technical Session - WebRTC Meetup Tokyo #9
MistCDNの概要 / Technical Session - WebRTC Meetup Tokyo #9Shintaro Tanaka
 
201205016 deformablemodelfitting
201205016 deformablemodelfitting201205016 deformablemodelfitting
201205016 deformablemodelfittingTakuya Minagawa
 
Sfuのクラウドサービスanzuで web rtc_live streaming
Sfuのクラウドサービスanzuで web rtc_live streamingSfuのクラウドサービスanzuで web rtc_live streaming
Sfuのクラウドサービスanzuで web rtc_live streaminga-baba
 

En vedette (16)

WebRTC Build MCU on browser
WebRTC Build MCU on browserWebRTC Build MCU on browser
WebRTC Build MCU on browser
 
WebRTC Meetup Tokyo #3 - WebRTC Conference参加報告
WebRTC Meetup Tokyo #3 - WebRTC Conference参加報告WebRTC Meetup Tokyo #3 - WebRTC Conference参加報告
WebRTC Meetup Tokyo #3 - WebRTC Conference参加報告
 
ORTCの仕様書をざっくり斜め読みする
ORTCの仕様書をざっくり斜め読みするORTCの仕様書をざっくり斜め読みする
ORTCの仕様書をざっくり斜め読みする
 
Social Media Soup Quotes
Social Media Soup QuotesSocial Media Soup Quotes
Social Media Soup Quotes
 
知ってると得するかもしれないConstraintsたち
知ってると得するかもしれないConstraintsたち知ってると得するかもしれないConstraintsたち
知ってると得するかもしれないConstraintsたち
 
WebRTC on Native App
WebRTC on Native AppWebRTC on Native App
WebRTC on Native App
 
うしちゃん WebRTC Chat on SkyWayの開発コードw
うしちゃん WebRTC Chat on SkyWayの開発コードwうしちゃん WebRTC Chat on SkyWayの開発コードw
うしちゃん WebRTC Chat on SkyWayの開発コードw
 
ArduinoでMidiコントローラーを作ろう
ArduinoでMidiコントローラーを作ろうArduinoでMidiコントローラーを作ろう
ArduinoでMidiコントローラーを作ろう
 
WebRTC on Edge
WebRTC on EdgeWebRTC on Edge
WebRTC on Edge
 
Inside of 聖徳玉子 by O2
Inside of 聖徳玉子 by O2Inside of 聖徳玉子 by O2
Inside of 聖徳玉子 by O2
 
WebRTCの技術解説 公開版
WebRTCの技術解説 公開版WebRTCの技術解説 公開版
WebRTCの技術解説 公開版
 
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
MistCDNの概要 / Technical Session - WebRTC Meetup Tokyo #9
MistCDNの概要 / Technical Session - WebRTC Meetup Tokyo #9MistCDNの概要 / Technical Session - WebRTC Meetup Tokyo #9
MistCDNの概要 / Technical Session - WebRTC Meetup Tokyo #9
 
201205016 deformablemodelfitting
201205016 deformablemodelfitting201205016 deformablemodelfitting
201205016 deformablemodelfitting
 
Sfuのクラウドサービスanzuで web rtc_live streaming
Sfuのクラウドサービスanzuで web rtc_live streamingSfuのクラウドサービスanzuで web rtc_live streaming
Sfuのクラウドサービスanzuで web rtc_live streaming
 

Similaire à WebRTC meetup Tokyo 1

いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21
いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21
いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21Takakiyo Tanaka
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) Akihiro Kuwano
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Mori Shingo
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...Naoya Ito
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングYosuke Mizutani
 
Tremaで構築!中小企業の社内LAN #Tremaday 120419
Tremaで構築!中小企業の社内LAN #Tremaday 120419Tremaで構築!中小企業の社内LAN #Tremaday 120419
Tremaで構築!中小企業の社内LAN #Tremaday 120419エイシュン コンドウ
 
show コマンド結果をパースする方法あれこれ #npstudy
show コマンド結果をパースする方法あれこれ #npstudyshow コマンド結果をパースする方法あれこれ #npstudy
show コマンド結果をパースする方法あれこれ #npstudyakira6592
 
PlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocketPlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocketKazuhiro Hara
 
Let's begin WebRTC
Let's begin WebRTCLet's begin WebRTC
Let's begin WebRTCyoshikawa_t
 
ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例fumoto kazuhiro
 
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説Takao Tetsuro
 
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化シスコシステムズ合同会社
 
WebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocketWebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocketYu Nobuoka
 
Wasm blazor and wasi 2
Wasm blazor and wasi 2Wasm blazor and wasi 2
Wasm blazor and wasi 2Takao Tetsuro
 
マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版i_yudai
 
20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!Midori Oge
 
FD.io VPP事始め
FD.io VPP事始めFD.io VPP事始め
FD.io VPP事始めtetsusat
 

Similaire à WebRTC meetup Tokyo 1 (20)

いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21
いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21
いよいよ始められる Java EEでのWebSocket #jjug #jjug_ccc #ccc_r21
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニング
 
Tremaで構築!中小企業の社内LAN #Tremaday 120419
Tremaで構築!中小企業の社内LAN #Tremaday 120419Tremaで構築!中小企業の社内LAN #Tremaday 120419
Tremaで構築!中小企業の社内LAN #Tremaday 120419
 
20201127 .NET 5
20201127 .NET 520201127 .NET 5
20201127 .NET 5
 
show コマンド結果をパースする方法あれこれ #npstudy
show コマンド結果をパースする方法あれこれ #npstudyshow コマンド結果をパースする方法あれこれ #npstudy
show コマンド結果をパースする方法あれこれ #npstudy
 
Node.jsでブラウザメッセンジャー
Node.jsでブラウザメッセンジャーNode.jsでブラウザメッセンジャー
Node.jsでブラウザメッセンジャー
 
PlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocketPlayFramework1.2.4におけるWebSocket
PlayFramework1.2.4におけるWebSocket
 
Let's begin WebRTC
Let's begin WebRTCLet's begin WebRTC
Let's begin WebRTC
 
ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例
 
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
 
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
 
WebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocketWebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocket
 
Wasm blazor and wasi 2
Wasm blazor and wasi 2Wasm blazor and wasi 2
Wasm blazor and wasi 2
 
マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版
 
20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!
 
FD.io VPP事始め
FD.io VPP事始めFD.io VPP事始め
FD.io VPP事始め
 

Plus de mganeko

Amazon Kinesis Video Streams WebRTC 使ってみた
Amazon Kinesis Video Streams WebRTC 使ってみたAmazon Kinesis Video Streams WebRTC 使ってみた
Amazon Kinesis Video Streams WebRTC 使ってみたmganeko
 
Build Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.jsBuild Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.jsmganeko
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーmganeko
 
ここがつらいよWebRTC - WebRTC開発の落とし穴
ここがつらいよWebRTC - WebRTC開発の落とし穴ここがつらいよWebRTC - WebRTC開発の落とし穴
ここがつらいよWebRTC - WebRTC開発の落とし穴mganeko
 
WebRTC multistream
WebRTC multistreamWebRTC multistream
WebRTC multistreammganeko
 
Inside WebM
Inside WebMInside WebM
Inside WebMmganeko
 
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
WebRTC getStats - WebRTC Meetup Tokyo 5 LTWebRTC getStats - WebRTC Meetup Tokyo 5 LT
WebRTC getStats - WebRTC Meetup Tokyo 5 LTmganeko
 
WebRTC Summit 2014 NewYork 参加報告
WebRTC Summit 2014 NewYork 参加報告WebRTC Summit 2014 NewYork 参加報告
WebRTC Summit 2014 NewYork 参加報告mganeko
 

Plus de mganeko (8)

Amazon Kinesis Video Streams WebRTC 使ってみた
Amazon Kinesis Video Streams WebRTC 使ってみたAmazon Kinesis Video Streams WebRTC 使ってみた
Amazon Kinesis Video Streams WebRTC 使ってみた
 
Build Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.jsBuild Node.js-WASM/WASI Tiny compiler with Node.js
Build Node.js-WASM/WASI Tiny compiler with Node.js
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
 
ここがつらいよWebRTC - WebRTC開発の落とし穴
ここがつらいよWebRTC - WebRTC開発の落とし穴ここがつらいよWebRTC - WebRTC開発の落とし穴
ここがつらいよWebRTC - WebRTC開発の落とし穴
 
WebRTC multistream
WebRTC multistreamWebRTC multistream
WebRTC multistream
 
Inside WebM
Inside WebMInside WebM
Inside WebM
 
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
WebRTC getStats - WebRTC Meetup Tokyo 5 LTWebRTC getStats - WebRTC Meetup Tokyo 5 LT
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
 
WebRTC Summit 2014 NewYork 参加報告
WebRTC Summit 2014 NewYork 参加報告WebRTC Summit 2014 NewYork 参加報告
WebRTC Summit 2014 NewYork 参加報告
 

WebRTC meetup Tokyo 1