SlideShare a Scribd company logo
7
Most read
14
Most read
18
Most read
WebRTC Meetup Tokyo #13
OSSのSFU meidasoupを触ってみた
インフォコム株式会社
がねこまさし
@massie_g
1
自己紹介
• がねこまさし / @massie_g
• インフォコム株式会社で、技術調査チームに所属
• WebRTC入門2016を HTML5Experts.jpに執筆
– https://html5experts.jp/series/webrtc2016/
• WebRTC Meetup Tokyo スタッフ見習い中
2
今日のお題
• SFU : Selective forwarding Unit
• mediasoup : オープンソースのSFU モジュール
– Node.js用に開発
3
P2P と SFU:Selective Forwarding Unit
ブラウザ
A
ブラウザ
B
ブラウザ
D
ブラウザ
C
P2Pの場合
• サーバ不要 ◎
• ブラウザ側の
• CPU負荷:高 ×
• ネットワーク負荷:高 ×
4
ブラウザ
A
ブラウザ
B
ブラウザ
D
ブラウザ
C
SFU
映像・音声
を分岐/配信
SFUの場合
• SFUサーバ必要 → CPU負荷:低 ○
• ブラウザ側はCPU負荷:低め ○
• ブラウザ側はネットワーク負荷:中 △
表示レイアウトの
自由度が高い ◎
MCU と SFU
5
ブラウザ
A
ブラウザ
B
ブラウザ
D
ブラウザ
C
SFU
映像・音声
を分岐/配信
ブラウザ
A
ブラウザ
B
ブラウザ
D
ブラウザ
C
MCU
映像・音声
を合成
MCUの場合
• MCUサーバ必要 → CPU負荷:激高 ××
• ブラウザ側はCPU/ネットワーク負荷:低 ◎
SFUの場合
• SFUサーバ必要 → CPU負荷:低 ○
• ブラウザ側はCPU負荷:低め ○
• ブラウザ側はネットワーク負荷:中 △
表示レイアウトの
自由度が高い ◎
圧縮と暗号化
6
Browser
いらすとや http://www.irasutoya.com/
BrowserP2P
圧縮/エンコード
暗号化
通信 復号化
解凍/デコード
TURN Browser
TURN Browser
SFU
MCU
Browser SFU Browser
Browser MCU Browser
mediasoupとは?
• オープンソースのSFU
– サイト https://mediasoup.org/
– GitHub https://github.com/ibc/mediasoup/
• 独立したサーバーではなく、部品
– Instead of creating yet another opinionated server, mediasoup is a Node.js
module which can be integrated into a larger application or made standalone
with just a few lines of JavaScript.
– 「他のアプリに組み込める」
• Node.js用モジュールとして提供
– Webサーバーやシグナリングの仕組みは、自分で用意する必要あり
7
mediasoupとは? (2)
• ミニマム … メディアのみ、かつSFUなのでコーデックは処理しない
• パワフル … 実体は C++ で記述、libuv 利用
– Node.js から起動された子プロセスで通信を担当
– Node.js とはプロセス間通信でやりとり
• JavaScript API を提供
– WebRTC 1.0 … RTCPeerConnection
– ORTC … Transport, RtpSender, RtpReceiver
8
mediasoup サンプル Demo
9
• 複数人の双方向通信
– 映像/音声
– 見た目P2Pと変わらないけど…
• SFUサーバーを止めると、映像も停止
• ソースコード
– https://github.com/mganeko/mediasoup_sample
mediasoup のインストール
• 前提環境
– Node.js v4.0.0 以上
– Linux / Mac OS X ※Windowsは未サポート
– Python 2.x ※要注意
– make
– gcc & g++ または clang with C++11
• インストール
– $ npm install mediasoup
• C++のコンパイルあり、数分から数十分でビルド→インストール完了
10
mediasoup のオブジェクト構造(1)
11
Server
Room
Room
Room
Peer
Peer
Peer Transport
Transport
RtpSender
RtpSender
RtpSender
RtpReceiver
RtpReceiver
RtpReceiver
・1つのServerに複数のRoom
・1つのRoomに複数のPeer
・1つのPeerに複数のRtpSender
・1つのPeerに複数のRtpReceiver
・1つのPeerに複数のTransport
MediaTrackに対応(video/audio)
MediaTrackに対応(video/audio)
通信ポートに対応
(UDP/TCP)
1つのTransportを
・複数のRtpSender
・複数のRtpReceiver
で利用可能
BUNDLE, rtcp-mux
multi-stream
mediasoup のRoomの構造(推測)
12
Room
Peer
RtpReceiver
RtpSender
Browser Browser
Peer
RtpReceiver
RtpSender
Peer
Browser
RtpReceiver RtpSender
RtpSender RtpSender
RtpSender
Room内のmediaの
流れは自動に組み
立てられる(らしい)
Transport
Transport
Transport
mediasoupのプロセス
13
デフォルトは
コア数分
1つのRoom
5つのPeerの時
1つのRoomは
同じworkerに?
利用のイメージ
let server = mediasoup.Server();
let peer1;
let receiver1;
return server.createRoom(roomOptions)
.then( (room) => {
peer1 = room.Peer('alice');
return peer.setCapabilities(peerCapabilities);
})
.then(() => {
return peer.createTransport({ tcp: false });
})
.then((transport) => {
rtpReceiver1 = peer1.RtpReceiver('audio', transport);
})
14
• 順番に自分でオブジェクトを組み立てる
• Promiseベース
• RtpSenderは自分で明示的には生成しない
• 自動に生成され、イベントで渡される
※まだ良く分かっ
ていません…
mediasoup のオブジェクト構造(2)
15
Server
Room
Room
Room
Peer
Peer
Peer
RTCPeerConnection
・ 1つのRTCPeerConnectionと、1つのPeerが対応
→ Offer/Answerのやり取りで通信を確立できる
RTCPeerConnection
RTCPeerConnection
RTCPeerConenctionを使った流れ
16
Browser A
RTCPeerConnection
mediasoup
RTCPeerConnection A
Browser B
send offer SDP
send offer SDP
send answer SDP
send answer SDP
onnegotiationneeded()発火
onnegotiationneeded()発火
RTCPeerConnection B RTCPeerConnection
send answer SDP
onaddstream() / ontrack() 発火
send offer SDP send offer SDP
send answer SDP
onaddstream() / ontrack() 発火
createOffer()
createAnswer()
createOffer()
createAnswer()
createOffer()
createAnswer()
createOffer()
createAnswer()
RTCPeerConnectionの現状の制約
• 最初のOfferをリモートから(ブラウザから)受け取る必要がある
– Currently, the mediasoup implementation of RTCPeerConnection requires that the
initial offer comes from the remote endpoint,
• その後、onnegotiationneeded()発火後に Offerを生成させる
• 通信確立後、リモート側でのOffer再生成には対応していない
– リモート側での stream / track 追加、削除には対応していない
• Chromeが採用しているPlan Bには暫定的な対応
17
あくまで RTCPeerConnectionの制限(mediasoupの実力の10%??)
Transport, RtpReceiver, SDP を自分で組み立てれば、できる(はず)
mediasoup その他の制約
• mediasoupは NAT/Firewallの外に置く必要あり
– mediasoupはSTUN/TURNを必要としない環境に置く
• ブラウザが NAT/Firewallの中にあるケースはOK
– ブラウザがSTUN/TURNを利用するのはOK
18
mediasoup
Browser
STUN
Browser TURN
NAT
Firewall
まとめ
• WebRTCの主戦場は P2P → MCU → SFU に
• 現在鋭意開発中の mediasoup は、今後も要注目
– SFUを組み込んだアプリケーションを自分でも作れるように
• もちろん、高機能、高安定性は商用製品が有力
• 本日のプレゼン資料は SlideShareに
– http://www.slideshare.net/mganeko/webrtc-sfu-mediasoup-sample
• ソースコードは GitHubに
– https://github.com/mganeko/mediasoup_sample 19
WebRTC もくもく会 2/6(月) 19:00~22:00
• https://connpass.com/event/47474/
• 最近WebRTC始めた方、これからWebRTCを深めていこうという方
• 「WebRTCのここがよかった」「ここが好きになった」「ここがひっかかりやす
い」などの知見を知りたい方
• 基本は自分でやってみるスタイル ← 仲さん、がねこがサポートします
– 初めての人には過去のハンズオンをやってみるのがお勧め!
– http://qiita.com/yusuke84/items/de9f0f6d221acec6fc07
• ご参加お待ちしています!
20
Thank you!
21

More Related Content

PPTX
WebRTC SFU Mediasoup Sample update
PDF
SFUの話
PDF
WebRTC と Native とそれから、それから。
PDF
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
PDF
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
PPTX
WebRTC mediasoup on raspberrypi3
PDF
Building the Game Server both API and Realtime via c#
PPTX
WebRTCとSFU
WebRTC SFU Mediasoup Sample update
SFUの話
WebRTC と Native とそれから、それから。
WebブラウザでP2Pを実現する、WebRTCのAPIと周辺技術
実践 WebRTC 〜最新事例と開発ノウハウの紹介〜
WebRTC mediasoup on raspberrypi3
Building the Game Server both API and Realtime via c#
WebRTCとSFU

What's hot (20)

PDF
GoogleのSHA-1のはなし
PDF
WebRTC入門+最新動向
PDF
UnityのMultiplayサービスの得意な事
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
PPTX
ここがつらいよWebRTC - WebRTC開発の落とし穴
PDF
TLS, HTTP/2演習
PPTX
Inside WebM
PDF
究極のゲーム用通信プロトコル “WebRTC”
PDF
Dockerからcontainerdへの移行
PDF
Scapyで作る・解析するパケット
PDF
MagicOnion~C#でゲームサーバを開発しよう~
PDF
レシピの作り方入門
PDF
ネットワークでなぜ遅延が生じるのか
PPTX
WebRTCを利用した遠隔リアルタイム映像処理フレームワークの実装
PDF
eBPFを用いたトレーシングについて
PDF
Jetson x Azure ハンズオン DeepStream Azure IoT
PPTX
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
PPTX
本当は恐ろしい分散システムの話
PPTX
YoctoをつかったDistroの作り方とハマり方
PDF
パケットキャプチャの勘どころ Ssmjp 201501
GoogleのSHA-1のはなし
WebRTC入門+最新動向
UnityのMultiplayサービスの得意な事
ネットワーク ゲームにおけるTCPとUDPの使い分け
ここがつらいよWebRTC - WebRTC開発の落とし穴
TLS, HTTP/2演習
Inside WebM
究極のゲーム用通信プロトコル “WebRTC”
Dockerからcontainerdへの移行
Scapyで作る・解析するパケット
MagicOnion~C#でゲームサーバを開発しよう~
レシピの作り方入門
ネットワークでなぜ遅延が生じるのか
WebRTCを利用した遠隔リアルタイム映像処理フレームワークの実装
eBPFを用いたトレーシングについて
Jetson x Azure ハンズオン DeepStream Azure IoT
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
本当は恐ろしい分散システムの話
YoctoをつかったDistroの作り方とハマり方
パケットキャプチャの勘どころ Ssmjp 201501
Ad

Similar to WebRTC SFU mediasoup sample (20)

PDF
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
PDF
WebRTC-RTP Forwarder を 作って得られた知見
PDF
密着!わたしのコンソールアプリ開発環境
PPTX
Webrtc最新動向
PDF
runC概要と使い方
PDF
197x Timer with Your Messages
PPTX
2014 1018 OSC-Fall Tokyo NETMF
PDF
How to run P4 BMv2
PPTX
Webrtc bootcamp handson
PDF
IBM Rational Team Concertに触れてみた
PPTX
root権限無しでKubernetesを動かす
PDF
JavaScript And Keywords
PPTX
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
PPTX
Ossで作成するチーム開発環境
PDF
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
PDF
.NET Coreとツール類の今
PDF
Hydrogen → Helium での Linux kernel の違い
PPTX
KubeCon EU報告(ランタイム関連,イメージ関連)
PPTX
Chromebook 「だけ」で WebRTCを動かそう
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
ネットワーク ゲームにおけるTCPとUDPの使い分け
WebRTC-RTP Forwarder を 作って得られた知見
密着!わたしのコンソールアプリ開発環境
Webrtc最新動向
runC概要と使い方
197x Timer with Your Messages
2014 1018 OSC-Fall Tokyo NETMF
How to run P4 BMv2
Webrtc bootcamp handson
IBM Rational Team Concertに触れてみた
root権限無しでKubernetesを動かす
JavaScript And Keywords
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
Ossで作成するチーム開発環境
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
.NET Coreとツール類の今
Hydrogen → Helium での Linux kernel の違い
KubeCon EU報告(ランタイム関連,イメージ関連)
Chromebook 「だけ」で WebRTCを動かそう
Ad

More from mganeko (20)

PDF
Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)
PPTX
Amazon Kinesis Video Streams WebRTC 使ってみた
PPTX
Build Node.js-WASM/WASI Tiny compiler with Node.js
PPTX
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
PPTX
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
PPTX
Skywayのビデオチャットを録画しよう。そう、ブラウザでね
PPTX
ブラウザでWebRTC - iOSゲートウェイ作ってみた
PDF
Inside of 聖徳玉子 by O2
PDF
Node.js with WebRTC DataChannel
PPTX
WebRTC Build MCU on browser
PPTX
PeerConnectionリレーとMediaRecorder
PPTX
WebRTC multitrack / multistream
PDF
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
PDF
WebRTC multistream
PPTX
MediaRecorder と WebM で、オレオレ Live Streaming
PPTX
Infocom webrtc conference japan
PPTX
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
PPTX
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )
PDF
WebRTC Summit 2014 NewYork 参加報告
PPTX
WebRTCのオーディオ処理の謎、誰か教えて!
Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)
Amazon Kinesis Video Streams WebRTC 使ってみた
Build Node.js-WASM/WASI Tiny compiler with Node.js
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
Skywayのビデオチャットを録画しよう。そう、ブラウザでね
ブラウザでWebRTC - iOSゲートウェイ作ってみた
Inside of 聖徳玉子 by O2
Node.js with WebRTC DataChannel
WebRTC Build MCU on browser
PeerConnectionリレーとMediaRecorder
WebRTC multitrack / multistream
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC multistream
MediaRecorder と WebM で、オレオレ Live Streaming
Infocom webrtc conference japan
WebRTC getStats - WebRTC Meetup Tokyo 5 LT
Nodeで操るKurentoメディアサーバー ( Kurento + WebRTC + Node.js )
WebRTC Summit 2014 NewYork 参加報告
WebRTCのオーディオ処理の謎、誰か教えて!

WebRTC SFU mediasoup sample