SlideShare a Scribd company logo
1 of 36
Amazon Kinesis Video
Streams WebRTC 使ってみた
WebRTC Meetup Tokyo #23
がねこまさし @massie_g
自己紹介
• がねこまさし / @massie_g
• インフォコム(株)の技術調査チームに所属
• WebRTC Meetup Tokyo スタッフ
• 今日の元ネタ
• Amazon Kinesis Video Streams WebRTC を動かしてみた
• Qiita https://qiita.com/massie_g/items/b6d3513d06a28ba89677
2
Amazon Kinesis Video Stream (KVS)とは
• https://aws.amazon.com/jp/kinesis/video-streams/
• 分析、機械学習 (ML)、再生、およびその他の処理のために
• 接続されたデバイスから AWS へ動画を簡単かつ安全にストリーミン
グできるようになります
• Kinesis Video Streams は、数百万ものデバイスからの動画のスト
リーミングデータを取り込むために…
• ライブやオンデマンド視聴用の動画を再生したり
• Amazon Rekognition Video との統合… コンピュータビジョンと動画
分析を活用するアプリケーションを迅速に構築することができます
動画の収集、分析、(配信)
Amazon KVS WebRTCとは
• https://aws.amazon.com/jp/kinesis/video-streams/
• またKinesis Video Streams がサポートするオープンソースプロジェ
クトの WebRTC は、
• リアルタイムのメディアストリーミング、ウェブブラウザ間のインタ
ラクション、モバイルアプリケーション、シンプルな API によるコネ
クテッドデバイスを可能にします
• 用途としては、ビデオチャットやピアツーピアのメディアストリーミ
ングが一般的です。
→通常のKVSと併用して使う想定
Amazon KVS ユーズケースより
KVS WebRTC
KVS WebRTCがサポートするもの(1)
サーバー機能
• シグナリング
• P2P通信を始める前に、必要な情報を交換するステップ
• Offer/Answer SDP の交換、ICE candidateの交換
• WebSocket利用
• マネージドSTUN/TURN
• P2P通信でNATや越え、制限がある環境で通信を行うための仕組み
• (が、自社の社内NWとインターネット側でまだうまく使えてない…)
• 参考:WebRTCハンズオン 概要編(Qiita)
• https://qiita.com/massie_g/items/916694413353a3293f73
• サーバー側でメディアを受信、保管、変換する機能は無し
• → 従来のKVSの機能を使うのが前提
KVS WebRTCがサポートするもの(2)
クライアント機能
• クライアント用SDK
• ブラウザ用(JavaScript用) … シグナリング
• https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-js
• P2P通信そのものは、ブラウザの持つ機能を利用
• 組み込み用(C言語用) … シグナリング+(S)RTP通信
• https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c
• スマートデバイス用(iOS, Android)… シグナリング+??
• https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-ios
• https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-
android
KVS WebRTCの通信形態
• シグナリングチャネル(ルーム)ごとのシグナリング
• 1つのMasterが参加
• 1つ以上複数のViewerが参加可能(現在、最大10まで)
• P2P通信
• メディアの通信
• データの通信(DataChannel)
• 片方向、双方向
KVS WebRTCの通信形態: 1対n
JavaScript用SDKのサンプル/Demo
• ソースコード
• https://github.com/mganeko/kvs_webrtc_example
• デモ: Master ← 複数Viewer
• Master側… master_multiviewer.html
• Viewer側 … viewer.html
コード例
• SDK読み込み
• https://sdk.amazonaws.com/js/aws-sdk-2.595.0.min.js
• https://unpkg.com/amazon-kinesis-video-streams-webrtc/dist/kvs-
webrtc.min.js
• シグナリングチャネルを準備
• AWS.KinesisVideoインスタンスを生成
• シグナリングチャネル用のエンドポイントを取得
• STUN/TURNサーバー(iceServers)の情報を取得
• KVSWebRTC.SignalingClient インスタンスを生成
• イベントハンドラを指定
コード例:シグナリングチャネルを準備
• AWS.KinesisVideoインスタ
ンスを生成
• シグナリングチャネル用のエ
ンドポイントを取得
• STUN/TURNサーバー
(iceServers)の情報を取得
• KVSWebRTC.SignalingClient
インスタンスを生成
• イベントハンドラを指定
const kinesisVideoClient = new
AWS.KinesisVideo({
region,
accessKeyId,
secretAccessKey,
});
コード例:シグナリングチャネルを準備
• AWS.KinesisVideoインスタ
ンスを生成
• シグナリングチャネル用の
エンドポイントを取得
• STUN/TURNサーバー
(iceServers)の情報を取得
• KVSWebRTC.SignalingClie
nt インスタンスを生成
• イベントハンドラを指定
const getSignalingChannelEndpointResponse =
await kinesisVideoClient
.getSignalingChannelEndpoint({
ChannelARN: channelARN,
SingleMasterChannelEndpointConfiguration: {
Protocols: ['WSS', 'HTTPS’],
Role: KVSWebRTC.Role.MASTER, // or VIEWER
},
}).promise();
const endpointsByProtocol =
getSignalingChannelEndpointResponse
.ResourceEndpointList.reduce(
(endpoints, endpoint) => {
endpoints[endpoint.Protocol] =
endpoint.ResourceEndpoint;
return endpoints;
}, {});
コード例
• AWS.KinesisVideoインスタ
ンスを生成
• シグナリングチャネル用の
エンドポイントを取得
• STUN/TURNサーバー
(iceServers)の情報を取得
• KVSWebRTC.SignalingClie
nt インスタンスを生成
• イベントハンドラを指定
const kinesisVideoSignalingChannelsClient
= new AWS.KinesisVideoSignalingChannels({
region, accessKeyId, secretAccessKey,
endpoint: endpointsByProtocol.HTTPS,
});
const getIceServerConfigResponse =
await kinesisVideoSignalingChannelsClient
.getIceServerConfig({
ChannelARN: channelARN,
}).promise();
const iceServers = [
{urls:
`stun:stun.kinesisvideo.${region}
.amazonaws.com:443`}
];
getIceServerConfigResponse.IceServerList
.forEach(
iceServer =>
iceServers.push({
urls: iceServer.Uris,
username: iceServer.Username,
credential: iceServer.Password,
})
);
コード例:シグナリングチャネルを準備
• AWS.KinesisVideoインスタン
スを生成
• シグナリングチャネル用のエン
ドポイントを取得
• STUN/TURNサーバー
(iceServers)の情報を取得
• KVSWebRTC.SignalingClient
インスタンスを生成
• イベントハンドラを指定
const signalingClient =
new KVSWebRTC.SignalingClient({
channelARN,
channelEndpoint: endpointsByProtocol.WSS,
clientId,
role: KVSWebRTC.Role.MASTER, // or VIEWER
region,
credentials: {
accessKeyId,
secretAccessKey,
},
});
コード例:シグナリングチャネルを準備
• AWS.KinesisVideoインスタ
ンスを生成
• シグナリングチャネル用の
エンドポイントを取得
• STUN/TURNサーバー
(iceServers)の情報を取得
• KVSWebRTC.SignalingClie
nt インスタンスを生成
• イベントハンドラを指定
signalingClient.on('open', async () => {
});
signalingClient.on('sdpAnswer', async answer => {
}); // VIEWER用
signalingClient.on('sdpOffer’,
async (offer, remoteClientId) => {
}
); // MASTER用
signalingClient.on('iceCandidate’,
(candidate, remoteClientId) => {
peerConnection.addIceCandidate(candidate);
}
);
signalingClient.on('close', () => {
});
コード例:Viewer側
• Offerを送り、Answerを受け取る
const offer = await peerConnection.createOffer({
offerToReceiveAudio: true,
offerToReceiveVideo: true,
});
await peerConnection.setLocalDescription(offer);
signalingClient.sendSdpOffer(
peerConnection.localDescription
);
// イベントハンドラ
signalingClient.on('sdpAnswer’,
async answer => {
await peerConnection.setRemoteDescription(answer);
}
);
コード例: Master側
• Offerを受け取り、Answerを返す
// イベントハンドラ
signalingClient.on('sdpOffer', async (offer, remoteClientId) => {
// … remoteClientId に対応する peerConnectionを準備する …
await peerConnection.setRemoteDescription(offer);
await peerConnection.setLocalDescription(
await peerConnection.createAnswer({
offerToReceiveAudio: true,
offerToReceiveVideo: true,
}),
);
signalingClient.sendSdpAnswer(peerConnection.localDescription,
remoteClientId
);
});
コード例: ICE Candidate(共通)
• PeerConnectionがICE Candidateを生成したとき
• ICE Candidateをシグナリングチャネルで受け取った時
// PeerConnectionがICE Candidateを生成したとき
peer.addEventListener('icecandidate', ({ candidate }) => {
if (candidate) {
signalingClient.sendIceCandidate(candidate, remoteClientId);
} else {
// No more ICE candidates will be generated
}
});
// 相手からICE Candidateを受け取った時
signalingClient.on('iceCandidate', (candidate, remoteClientId) => {
peer.addIceCandidate(candidate);
});
シグナリングの注意点
• Offerは、必ずMasterに届く
• ViewerからOfferに送る際に、相手を指定する必要はない
• Answerは、相手(clientId)を指定してViewerに送る
• Viewerは複数いる可能性があるので、clientIdで区別する
• ICE candidateを送るとき
• Viewer  Offer の場合は、相手を指定しなくて良い
• Offer  Viewerの場合には、相手(clientId)を指定
• それ以外のアプリケーションメッセージは送れない
• 切断通知には使えない
シグナリングチャネルの作成
• WebRTCのアプリで良くある「ルーム」や「チャネル」に相当
• 同じ「シグナリングチャネル」に参加しているクライアント同士でシ
グナリング→P2P通信が可能
• シグナリングチャネルを作成する4つの方法
• AWSコンソールから作成
• AWSのコマンドラインツール(CLI)から作成
• AWSのSDKからAPIを利用して作成
• REST APIを利用して作成
その前に、IAMの準備
• IAM(Identity and Access Managemenent)でユーザを作成
• AmazonKinesisVideoStreamsFullAccess の権限を付与
• アクセスに必要な情報を記録しておく
• アクセスキー
• アクセスシークレットキー
IAMでユーザー作成 (1)
IAMでユーザー作成(2)
IAMでユーザー作成(3)
IAMでユーザー作成(4)
AWSコンソールでシグナリングチャネルの作成
AWSコンソールでシグナリングチャネルの作成
AWSコンソールでシグナリングチャネルの作成
CLIツールでシグナリングチャネルの作成
• CLIツールをインストール
• アクセスキー/アクセスシークレットーキーを指定
• 設定ファイル or 環境変数
• macOSで設定ファイルの場合 ~/.aws/credentials
[default]
aws_access_key_id=xxxxxx
aws_secret_access_key=xxxxxxxxx/xxxxxxx
• us-west-2リージョンに “channel02”を作る場合
$ aws2 --region us-west-2 kinesisvideo create-signaling-channel
--channel-name channel02 --channel-type SINGLE_MASTER
{ "ChannelARN":
"arn:aws:kinesisvideo:us-west-2:xxxxxxxxxx:channel/channel02/xxxxxxxxx”
}
• ※ARNを記録しておく
SDKでシグナリングチャネルの作成(JS)
const kinesisVideoClient = new AWS.KinesisVideo({
region, accessKeyId, secretAccessKey });
const kinesisvideo = new AWS.KinesisVideo();
const channel = 'channel03’;
const params = {
ChannelName: channel,
ChannelType: 'SINGLE_MASTER’
};
kinesisvideo.createSignalingChannel(params, function (err, data) {
if (err) console.log(err, err.stack); // エラー
else console.log(data); // 成功、ARNがJSONで返ってくる
});
DEMO
REST API でシグナリングチャネルの作成
• リージョン:us-west-2, チャネル名:chanel04 の場合
$ curl
-X POST https://kinesisvideo.us-west-2.amazonaws.com/createSignalingChannel
-H "Content-Type: application/json"
-d '{"ChannelName": "channel04", "ChannelType": "SINGLE_MASTER"} '
-H "Authorization: AWS AWSAccessKeyId:Signature"
※ここの文字列の生成方法が、
よくわかってません
KVS WebRTCの価格
• こちらのユースケースから
• https://aws.amazon.com/jp/kinesis/video-streams/pricing/
• 料金の例 2: WebRTC と KVSを使用するスマホ用ライブストリーミングア
プリケーション
• ライブメディアストリーミング用に KVS の WebRTC 機能を使用
• ユーザーが 100 人、それぞれ独自のシグナリングチャネル
• 50 件のライブストリーミングセッションを経由
• 1 か月あたり合計 2,000 分間のライブストリーミング、TURN 20% (400分)
• アクティブなシグナリングチャネル = 100 x (0.03 USD/月) = 3.0 USD
• シグナリングメッセージ = 0.34 USD
• TURN (分) = 100 ユーザー x 400 TURN ストリーミング時間 (分)
• x (0.12 USD/1,000 TURN ストリーミング時間 (分)) = 4.8 USD
• 合計 = 8.14 USD
• 転送 1Mbps と仮定
• 40000 TURNストリーミング時間/月 → 300GB/月
• 転送料金 27 USD/月 (299GB分、us-west-2の場合)
KVS WebRTCの価格
• 料金の例 3: ビデオストリームと WebRTC の両方を使用するスマートホームセ
キュリティカメラ
• ホームセキュリティシステムのプロバイダーには 1,000 人のユーザー
• 各ユーザーの家には 1 台のカメラ、動きを検出するとストリーミング
• ユーザーはコンパニオンアプリで 1 か月あたりに 100 回カメラに接続
• WebRTC によって、ライブビデオストリームの視聴や双方向のオーディオセッション
• セッションの所要時間は 2 分間で、メディアストリームの 40% は TURN
• WebRTC: 各カメラはそれぞれ独自のシグナリングチャネル
• 合計で 1 か月あたり 1,000 件のアクティブなシグナリングチャネル
• 各セッションが配信するシグナリングメッセージは 30 件で
• 合計 3,000,000 件になります
• カメラはそれぞれ TURN 経由の 80 分間のライブストリーミング、
• 1 か月に 80,000 TURN ストリーミング時間 (分)
• 合計 = 46.35 USD
• 転送 1Mbps と仮定
• 80000 TURNストリーミング時間/月 → 600GB/月
• 転送料金 54 USD/月 (599GB分、us-west-2の場合)
KVS WebRTCの感想/まとめ
• KVS WebRTCは、KVSの使い方を広げるもの
• KVS WebRTC 単独では、魅力が少ないかも
• マネージドSTUN/TURNは魅力
• TURNのセッションのパスワード発行もやってくれる
• 通信料は安くはない … 300GB/月 → 27USD
• Vultr.com のIaaS … 1TB/月→ 5USD
• シグナリングの縛りは強い
• シグナリングチャネルにつながるまでの時間も数秒かかる
• 用途
• 今のところ、ビデオチャットのようなコミュニケーション向けではない印象
• 他のサービスの方が使い勝手が良さそう(個人の感想)
• IoTデバイスを使った、動画の収集+リアルタイムモニターのケースがマッチ
THANK YOU!
• ご質問があれば

More Related Content

What's hot

Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」Masahito Zembutsu
 
20220409 AWS BLEA 開発にあたって検討したこと
20220409 AWS BLEA 開発にあたって検討したこと20220409 AWS BLEA 開発にあたって検討したこと
20220409 AWS BLEA 開発にあたって検討したことAmazon Web Services Japan
 
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Amazon Web Services Japan
 
スマホ(Android・iPhone)でWebRTC
スマホ(Android・iPhone)でWebRTCスマホ(Android・iPhone)でWebRTC
スマホ(Android・iPhone)でWebRTCNatsuki Yamanaka
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)
IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)
IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)NTT DATA Technology & Innovation
 
AWS Black Belt Online Seminar 2017 Amazon Kinesis
AWS Black Belt Online Seminar 2017 Amazon KinesisAWS Black Belt Online Seminar 2017 Amazon Kinesis
AWS Black Belt Online Seminar 2017 Amazon KinesisAmazon Web Services Japan
 
AWS Black Belt Online Seminar 2016 AWS CloudFormation
AWS Black Belt Online Seminar 2016 AWS CloudFormationAWS Black Belt Online Seminar 2016 AWS CloudFormation
AWS Black Belt Online Seminar 2016 AWS CloudFormationAmazon Web Services Japan
 
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話Yuta Shimada
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Masahito Zembutsu
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使うKazuhiro Suga
 
20200630 AWS Black Belt Online Seminar Amazon Cognito
20200630 AWS Black Belt Online Seminar Amazon Cognito20200630 AWS Black Belt Online Seminar Amazon Cognito
20200630 AWS Black Belt Online Seminar Amazon CognitoAmazon Web Services Japan
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)NTT DATA Technology & Innovation
 
OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)
OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)
OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)Masaya Tahara
 

What's hot (20)

Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
20220409 AWS BLEA 開発にあたって検討したこと
20220409 AWS BLEA 開発にあたって検討したこと20220409 AWS BLEA 開発にあたって検討したこと
20220409 AWS BLEA 開発にあたって検討したこと
 
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
 
スマホ(Android・iPhone)でWebRTC
スマホ(Android・iPhone)でWebRTCスマホ(Android・iPhone)でWebRTC
スマホ(Android・iPhone)でWebRTC
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)
IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)
IAM Roles Anywhereのない世界とある世界(2022年のAWSアップデートを振り返ろう ~Season 4~ 発表資料)
 
AWS Black Belt Online Seminar 2017 Amazon Kinesis
AWS Black Belt Online Seminar 2017 Amazon KinesisAWS Black Belt Online Seminar 2017 Amazon Kinesis
AWS Black Belt Online Seminar 2017 Amazon Kinesis
 
AWS Black Belt Online Seminar 2016 AWS CloudFormation
AWS Black Belt Online Seminar 2016 AWS CloudFormationAWS Black Belt Online Seminar 2016 AWS CloudFormation
AWS Black Belt Online Seminar 2016 AWS CloudFormation
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話コンテナにおけるパフォーマンス調査でハマった話
コンテナにおけるパフォーマンス調査でハマった話
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
AWS Black Belt Techシリーズ Amazon VPC
AWS Black Belt Techシリーズ Amazon VPCAWS Black Belt Techシリーズ Amazon VPC
AWS Black Belt Techシリーズ Amazon VPC
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
20200630 AWS Black Belt Online Seminar Amazon Cognito
20200630 AWS Black Belt Online Seminar Amazon Cognito20200630 AWS Black Belt Online Seminar Amazon Cognito
20200630 AWS Black Belt Online Seminar Amazon Cognito
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)
OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)
OSS+AWSでここまでできるDevSecOps (Security-JAWS第24回)
 

Similar to Amazon Kinesis Video Streams WebRTC 使ってみた

Aws summits2014 エンタープライズ向けawscdpネットワーク編
Aws summits2014 エンタープライズ向けawscdpネットワーク編Aws summits2014 エンタープライズ向けawscdpネットワーク編
Aws summits2014 エンタープライズ向けawscdpネットワーク編Boss4434
 
AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング
AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシングAWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング
AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング江藤 武司
 
20120528 aws meister-reloaded-awssd-kforjava-public
20120528 aws meister-reloaded-awssd-kforjava-public20120528 aws meister-reloaded-awssd-kforjava-public
20120528 aws meister-reloaded-awssd-kforjava-publicAmazon Web Services Japan
 
AWS ではじめる Programmable Cloud
AWS ではじめる Programmable CloudAWS ではじめる Programmable Cloud
AWS ではじめる Programmable CloudTakashi Someda
 
k8sクラスタ構築
k8sクラスタ構築k8sクラスタ構築
k8sクラスタ構築asuka y
 
Migration to aws as of 20170920
Migration to aws as of 20170920Migration to aws as of 20170920
Migration to aws as of 20170920Kameda Harunobu
 
AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境Katsutoshi Nagaoka
 
CloudStack Overview(OSC2012Kansai@Kyoto)
CloudStack Overview(OSC2012Kansai@Kyoto)CloudStack Overview(OSC2012Kansai@Kyoto)
CloudStack Overview(OSC2012Kansai@Kyoto)Satoshi Shimazaki
 
AWS初心者向けWebinar AWS上にWebサーバーシステムを作ってみましょう ~まずは仮想サーバーから[演習つき]~
AWS初心者向けWebinar AWS上にWebサーバーシステムを作ってみましょう ~まずは仮想サーバーから[演習つき]~AWS初心者向けWebinar AWS上にWebサーバーシステムを作ってみましょう ~まずは仮想サーバーから[演習つき]~
AWS初心者向けWebinar AWS上にWebサーバーシステムを作ってみましょう ~まずは仮想サーバーから[演習つき]~Amazon Web Services Japan
 
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or ServerlessRunning Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or ServerlessKeisuke Nishitani
 
Architecting on Alibaba Cloud - 超基礎編 -
Architecting on Alibaba Cloud - 超基礎編 -Architecting on Alibaba Cloud - 超基礎編 -
Architecting on Alibaba Cloud - 超基礎編 -真吾 吉田
 
Jaws−横浜ハンズオンーCloudFormation w/ VPC 3/3
Jaws−横浜ハンズオンーCloudFormation w/ VPC 3/3Jaws−横浜ハンズオンーCloudFormation w/ VPC 3/3
Jaws−横浜ハンズオンーCloudFormation w/ VPC 3/3Yasuhiro Araki, Ph.D
 

Similar to Amazon Kinesis Video Streams WebRTC 使ってみた (20)

Aws summits2014 エンタープライズ向けawscdpネットワーク編
Aws summits2014 エンタープライズ向けawscdpネットワーク編Aws summits2014 エンタープライズ向けawscdpネットワーク編
Aws summits2014 エンタープライズ向けawscdpネットワーク編
 
AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング
AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシングAWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング
AWS Lake Formation で実現、マイクロサービスのサーバーレスな分散トレーシング
 
20120528 aws meister-reloaded-awssd-kforjava-public
20120528 aws meister-reloaded-awssd-kforjava-public20120528 aws meister-reloaded-awssd-kforjava-public
20120528 aws meister-reloaded-awssd-kforjava-public
 
AWS Lambda Updates
AWS Lambda UpdatesAWS Lambda Updates
AWS Lambda Updates
 
AWS ではじめる Programmable Cloud
AWS ではじめる Programmable CloudAWS ではじめる Programmable Cloud
AWS ではじめる Programmable Cloud
 
OpenStack API
OpenStack APIOpenStack API
OpenStack API
 
k8sクラスタ構築
k8sクラスタ構築k8sクラスタ構築
k8sクラスタ構築
 
20170725 black belt_monitoring_on_aws
20170725 black belt_monitoring_on_aws20170725 black belt_monitoring_on_aws
20170725 black belt_monitoring_on_aws
 
Migration to aws as of 20170920
Migration to aws as of 20170920Migration to aws as of 20170920
Migration to aws as of 20170920
 
AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境
 
20191125 Container Security
20191125 Container Security20191125 Container Security
20191125 Container Security
 
AWS Black Belt Online Seminar Amazon EC2
AWS Black Belt Online Seminar Amazon EC2AWS Black Belt Online Seminar Amazon EC2
AWS Black Belt Online Seminar Amazon EC2
 
Amazon EC2 Container Service Deep dive
Amazon EC2 Container Service Deep diveAmazon EC2 Container Service Deep dive
Amazon EC2 Container Service Deep dive
 
はじめてのAWS CLI
はじめてのAWS CLIはじめてのAWS CLI
はじめてのAWS CLI
 
CloudStack Overview(OSC2012Kansai@Kyoto)
CloudStack Overview(OSC2012Kansai@Kyoto)CloudStack Overview(OSC2012Kansai@Kyoto)
CloudStack Overview(OSC2012Kansai@Kyoto)
 
AWS初心者向けWebinar AWS上にWebサーバーシステムを作ってみましょう ~まずは仮想サーバーから[演習つき]~
AWS初心者向けWebinar AWS上にWebサーバーシステムを作ってみましょう ~まずは仮想サーバーから[演習つき]~AWS初心者向けWebinar AWS上にWebサーバーシステムを作ってみましょう ~まずは仮想サーバーから[演習つき]~
AWS初心者向けWebinar AWS上にWebサーバーシステムを作ってみましょう ~まずは仮想サーバーから[演習つき]~
 
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or ServerlessRunning Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless
 
Architecting on Alibaba Cloud - 超基礎編 -
Architecting on Alibaba Cloud - 超基礎編 -Architecting on Alibaba Cloud - 超基礎編 -
Architecting on Alibaba Cloud - 超基礎編 -
 
AWS Black Belt Techシリーズ Amazon VPC
AWS Black Belt Techシリーズ  Amazon VPCAWS Black Belt Techシリーズ  Amazon VPC
AWS Black Belt Techシリーズ Amazon VPC
 
Jaws−横浜ハンズオンーCloudFormation w/ VPC 3/3
Jaws−横浜ハンズオンーCloudFormation w/ VPC 3/3Jaws−横浜ハンズオンーCloudFormation w/ VPC 3/3
Jaws−横浜ハンズオンーCloudFormation w/ VPC 3/3
 

More from mganeko

Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)
Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)
Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)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
 
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
 
Skywayのビデオチャットを録画しよう。そう、ブラウザでね
Skywayのビデオチャットを録画しよう。そう、ブラウザでねSkywayのビデオチャットを録画しよう。そう、ブラウザでね
Skywayのビデオチャットを録画しよう。そう、ブラウザでねmganeko
 
WebRTC mediasoup on raspberrypi3
WebRTC mediasoup on raspberrypi3WebRTC mediasoup on raspberrypi3
WebRTC mediasoup on raspberrypi3mganeko
 
WebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updateWebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updatemganeko
 
ブラウザでWebRTC - iOSゲートウェイ作ってみた
ブラウザでWebRTC - iOSゲートウェイ作ってみたブラウザでWebRTC - iOSゲートウェイ作ってみた
ブラウザでWebRTC - iOSゲートウェイ作ってみたmganeko
 
WebRTC SFU mediasoup sample
WebRTC SFU mediasoup sampleWebRTC SFU mediasoup sample
WebRTC SFU mediasoup samplemganeko
 
Inside of 聖徳玉子 by O2
Inside of 聖徳玉子 by O2Inside of 聖徳玉子 by O2
Inside of 聖徳玉子 by O2mganeko
 
Node.js with WebRTC DataChannel
Node.js with WebRTC DataChannelNode.js with WebRTC DataChannel
Node.js with WebRTC DataChannelmganeko
 
WebRTC Build MCU on browser
WebRTC Build MCU on browserWebRTC Build MCU on browser
WebRTC Build MCU on browsermganeko
 
PeerConnectionリレーとMediaRecorder
PeerConnectionリレーとMediaRecorderPeerConnectionリレーとMediaRecorder
PeerConnectionリレーとMediaRecordermganeko
 
ここがつらいよWebRTC - WebRTC開発の落とし穴
ここがつらいよWebRTC - WebRTC開発の落とし穴ここがつらいよWebRTC - WebRTC開発の落とし穴
ここがつらいよWebRTC - WebRTC開発の落とし穴mganeko
 
Webrtc bootcamp handson
Webrtc bootcamp handsonWebrtc bootcamp handson
Webrtc bootcamp handsonmganeko
 
WebRTC multitrack / multistream
WebRTC multitrack / multistreamWebRTC multitrack / multistream
WebRTC multitrack / multistreammganeko
 
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみようWebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみようmganeko
 
WebRTC multistream
WebRTC multistreamWebRTC multistream
WebRTC multistreammganeko
 
Inside WebM
Inside WebMInside WebM
Inside WebMmganeko
 
MediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live StreamingMediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live Streamingmganeko
 

More from mganeko (20)

Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)
Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)
Google Meet でもバーチャル背景を使いたい (WebRTC Meetup Online)
 
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 ミニインタープリター&コンパイラー
 
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...
 
Skywayのビデオチャットを録画しよう。そう、ブラウザでね
Skywayのビデオチャットを録画しよう。そう、ブラウザでねSkywayのビデオチャットを録画しよう。そう、ブラウザでね
Skywayのビデオチャットを録画しよう。そう、ブラウザでね
 
WebRTC mediasoup on raspberrypi3
WebRTC mediasoup on raspberrypi3WebRTC mediasoup on raspberrypi3
WebRTC mediasoup on raspberrypi3
 
WebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample updateWebRTC SFU Mediasoup Sample update
WebRTC SFU Mediasoup Sample update
 
ブラウザでWebRTC - iOSゲートウェイ作ってみた
ブラウザでWebRTC - iOSゲートウェイ作ってみたブラウザでWebRTC - iOSゲートウェイ作ってみた
ブラウザでWebRTC - iOSゲートウェイ作ってみた
 
WebRTC SFU mediasoup sample
WebRTC SFU mediasoup sampleWebRTC SFU mediasoup sample
WebRTC SFU mediasoup sample
 
Inside of 聖徳玉子 by O2
Inside of 聖徳玉子 by O2Inside of 聖徳玉子 by O2
Inside of 聖徳玉子 by O2
 
Node.js with WebRTC DataChannel
Node.js with WebRTC DataChannelNode.js with WebRTC DataChannel
Node.js with WebRTC DataChannel
 
WebRTC Build MCU on browser
WebRTC Build MCU on browserWebRTC Build MCU on browser
WebRTC Build MCU on browser
 
PeerConnectionリレーとMediaRecorder
PeerConnectionリレーとMediaRecorderPeerConnectionリレーとMediaRecorder
PeerConnectionリレーとMediaRecorder
 
ここがつらいよWebRTC - WebRTC開発の落とし穴
ここがつらいよWebRTC - WebRTC開発の落とし穴ここがつらいよWebRTC - WebRTC開発の落とし穴
ここがつらいよWebRTC - WebRTC開発の落とし穴
 
Webrtc bootcamp handson
Webrtc bootcamp handsonWebrtc bootcamp handson
Webrtc bootcamp handson
 
WebRTC multitrack / multistream
WebRTC multitrack / multistreamWebRTC multitrack / multistream
WebRTC multitrack / multistream
 
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみようWebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
WebRTC UserMedia Catalog: いろんなユーザメディア(MediaStream)を使ってみよう
 
WebRTC multistream
WebRTC multistreamWebRTC multistream
WebRTC multistream
 
Inside WebM
Inside WebMInside WebM
Inside WebM
 
MediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live StreamingMediaRecorder と WebM で、オレオレ Live Streaming
MediaRecorder と WebM で、オレオレ Live Streaming
 

Recently uploaded

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 

Recently uploaded (8)

PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 

Amazon Kinesis Video Streams WebRTC 使ってみた

  • 1. Amazon Kinesis Video Streams WebRTC 使ってみた WebRTC Meetup Tokyo #23 がねこまさし @massie_g
  • 2. 自己紹介 • がねこまさし / @massie_g • インフォコム(株)の技術調査チームに所属 • WebRTC Meetup Tokyo スタッフ • 今日の元ネタ • Amazon Kinesis Video Streams WebRTC を動かしてみた • Qiita https://qiita.com/massie_g/items/b6d3513d06a28ba89677 2
  • 3. Amazon Kinesis Video Stream (KVS)とは • https://aws.amazon.com/jp/kinesis/video-streams/ • 分析、機械学習 (ML)、再生、およびその他の処理のために • 接続されたデバイスから AWS へ動画を簡単かつ安全にストリーミン グできるようになります • Kinesis Video Streams は、数百万ものデバイスからの動画のスト リーミングデータを取り込むために… • ライブやオンデマンド視聴用の動画を再生したり • Amazon Rekognition Video との統合… コンピュータビジョンと動画 分析を活用するアプリケーションを迅速に構築することができます 動画の収集、分析、(配信)
  • 4. Amazon KVS WebRTCとは • https://aws.amazon.com/jp/kinesis/video-streams/ • またKinesis Video Streams がサポートするオープンソースプロジェ クトの WebRTC は、 • リアルタイムのメディアストリーミング、ウェブブラウザ間のインタ ラクション、モバイルアプリケーション、シンプルな API によるコネ クテッドデバイスを可能にします • 用途としては、ビデオチャットやピアツーピアのメディアストリーミ ングが一般的です。 →通常のKVSと併用して使う想定
  • 6. KVS WebRTCがサポートするもの(1) サーバー機能 • シグナリング • P2P通信を始める前に、必要な情報を交換するステップ • Offer/Answer SDP の交換、ICE candidateの交換 • WebSocket利用 • マネージドSTUN/TURN • P2P通信でNATや越え、制限がある環境で通信を行うための仕組み • (が、自社の社内NWとインターネット側でまだうまく使えてない…) • 参考:WebRTCハンズオン 概要編(Qiita) • https://qiita.com/massie_g/items/916694413353a3293f73 • サーバー側でメディアを受信、保管、変換する機能は無し • → 従来のKVSの機能を使うのが前提
  • 7. KVS WebRTCがサポートするもの(2) クライアント機能 • クライアント用SDK • ブラウザ用(JavaScript用) … シグナリング • https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-js • P2P通信そのものは、ブラウザの持つ機能を利用 • 組み込み用(C言語用) … シグナリング+(S)RTP通信 • https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c • スマートデバイス用(iOS, Android)… シグナリング+?? • https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-ios • https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk- android
  • 8. KVS WebRTCの通信形態 • シグナリングチャネル(ルーム)ごとのシグナリング • 1つのMasterが参加 • 1つ以上複数のViewerが参加可能(現在、最大10まで) • P2P通信 • メディアの通信 • データの通信(DataChannel) • 片方向、双方向
  • 10. JavaScript用SDKのサンプル/Demo • ソースコード • https://github.com/mganeko/kvs_webrtc_example • デモ: Master ← 複数Viewer • Master側… master_multiviewer.html • Viewer側 … viewer.html
  • 11. コード例 • SDK読み込み • https://sdk.amazonaws.com/js/aws-sdk-2.595.0.min.js • https://unpkg.com/amazon-kinesis-video-streams-webrtc/dist/kvs- webrtc.min.js • シグナリングチャネルを準備 • AWS.KinesisVideoインスタンスを生成 • シグナリングチャネル用のエンドポイントを取得 • STUN/TURNサーバー(iceServers)の情報を取得 • KVSWebRTC.SignalingClient インスタンスを生成 • イベントハンドラを指定
  • 12. コード例:シグナリングチャネルを準備 • AWS.KinesisVideoインスタ ンスを生成 • シグナリングチャネル用のエ ンドポイントを取得 • STUN/TURNサーバー (iceServers)の情報を取得 • KVSWebRTC.SignalingClient インスタンスを生成 • イベントハンドラを指定 const kinesisVideoClient = new AWS.KinesisVideo({ region, accessKeyId, secretAccessKey, });
  • 13. コード例:シグナリングチャネルを準備 • AWS.KinesisVideoインスタ ンスを生成 • シグナリングチャネル用の エンドポイントを取得 • STUN/TURNサーバー (iceServers)の情報を取得 • KVSWebRTC.SignalingClie nt インスタンスを生成 • イベントハンドラを指定 const getSignalingChannelEndpointResponse = await kinesisVideoClient .getSignalingChannelEndpoint({ ChannelARN: channelARN, SingleMasterChannelEndpointConfiguration: { Protocols: ['WSS', 'HTTPS’], Role: KVSWebRTC.Role.MASTER, // or VIEWER }, }).promise(); const endpointsByProtocol = getSignalingChannelEndpointResponse .ResourceEndpointList.reduce( (endpoints, endpoint) => { endpoints[endpoint.Protocol] = endpoint.ResourceEndpoint; return endpoints; }, {});
  • 14. コード例 • AWS.KinesisVideoインスタ ンスを生成 • シグナリングチャネル用の エンドポイントを取得 • STUN/TURNサーバー (iceServers)の情報を取得 • KVSWebRTC.SignalingClie nt インスタンスを生成 • イベントハンドラを指定 const kinesisVideoSignalingChannelsClient = new AWS.KinesisVideoSignalingChannels({ region, accessKeyId, secretAccessKey, endpoint: endpointsByProtocol.HTTPS, }); const getIceServerConfigResponse = await kinesisVideoSignalingChannelsClient .getIceServerConfig({ ChannelARN: channelARN, }).promise(); const iceServers = [ {urls: `stun:stun.kinesisvideo.${region} .amazonaws.com:443`} ]; getIceServerConfigResponse.IceServerList .forEach( iceServer => iceServers.push({ urls: iceServer.Uris, username: iceServer.Username, credential: iceServer.Password, }) );
  • 15. コード例:シグナリングチャネルを準備 • AWS.KinesisVideoインスタン スを生成 • シグナリングチャネル用のエン ドポイントを取得 • STUN/TURNサーバー (iceServers)の情報を取得 • KVSWebRTC.SignalingClient インスタンスを生成 • イベントハンドラを指定 const signalingClient = new KVSWebRTC.SignalingClient({ channelARN, channelEndpoint: endpointsByProtocol.WSS, clientId, role: KVSWebRTC.Role.MASTER, // or VIEWER region, credentials: { accessKeyId, secretAccessKey, }, });
  • 16. コード例:シグナリングチャネルを準備 • AWS.KinesisVideoインスタ ンスを生成 • シグナリングチャネル用の エンドポイントを取得 • STUN/TURNサーバー (iceServers)の情報を取得 • KVSWebRTC.SignalingClie nt インスタンスを生成 • イベントハンドラを指定 signalingClient.on('open', async () => { }); signalingClient.on('sdpAnswer', async answer => { }); // VIEWER用 signalingClient.on('sdpOffer’, async (offer, remoteClientId) => { } ); // MASTER用 signalingClient.on('iceCandidate’, (candidate, remoteClientId) => { peerConnection.addIceCandidate(candidate); } ); signalingClient.on('close', () => { });
  • 17. コード例:Viewer側 • Offerを送り、Answerを受け取る const offer = await peerConnection.createOffer({ offerToReceiveAudio: true, offerToReceiveVideo: true, }); await peerConnection.setLocalDescription(offer); signalingClient.sendSdpOffer( peerConnection.localDescription ); // イベントハンドラ signalingClient.on('sdpAnswer’, async answer => { await peerConnection.setRemoteDescription(answer); } );
  • 18. コード例: Master側 • Offerを受け取り、Answerを返す // イベントハンドラ signalingClient.on('sdpOffer', async (offer, remoteClientId) => { // … remoteClientId に対応する peerConnectionを準備する … await peerConnection.setRemoteDescription(offer); await peerConnection.setLocalDescription( await peerConnection.createAnswer({ offerToReceiveAudio: true, offerToReceiveVideo: true, }), ); signalingClient.sendSdpAnswer(peerConnection.localDescription, remoteClientId ); });
  • 19. コード例: ICE Candidate(共通) • PeerConnectionがICE Candidateを生成したとき • ICE Candidateをシグナリングチャネルで受け取った時 // PeerConnectionがICE Candidateを生成したとき peer.addEventListener('icecandidate', ({ candidate }) => { if (candidate) { signalingClient.sendIceCandidate(candidate, remoteClientId); } else { // No more ICE candidates will be generated } }); // 相手からICE Candidateを受け取った時 signalingClient.on('iceCandidate', (candidate, remoteClientId) => { peer.addIceCandidate(candidate); });
  • 20. シグナリングの注意点 • Offerは、必ずMasterに届く • ViewerからOfferに送る際に、相手を指定する必要はない • Answerは、相手(clientId)を指定してViewerに送る • Viewerは複数いる可能性があるので、clientIdで区別する • ICE candidateを送るとき • Viewer  Offer の場合は、相手を指定しなくて良い • Offer  Viewerの場合には、相手(clientId)を指定 • それ以外のアプリケーションメッセージは送れない • 切断通知には使えない
  • 21. シグナリングチャネルの作成 • WebRTCのアプリで良くある「ルーム」や「チャネル」に相当 • 同じ「シグナリングチャネル」に参加しているクライアント同士でシ グナリング→P2P通信が可能 • シグナリングチャネルを作成する4つの方法 • AWSコンソールから作成 • AWSのコマンドラインツール(CLI)から作成 • AWSのSDKからAPIを利用して作成 • REST APIを利用して作成
  • 22. その前に、IAMの準備 • IAM(Identity and Access Managemenent)でユーザを作成 • AmazonKinesisVideoStreamsFullAccess の権限を付与 • アクセスに必要な情報を記録しておく • アクセスキー • アクセスシークレットキー
  • 30. CLIツールでシグナリングチャネルの作成 • CLIツールをインストール • アクセスキー/アクセスシークレットーキーを指定 • 設定ファイル or 環境変数 • macOSで設定ファイルの場合 ~/.aws/credentials [default] aws_access_key_id=xxxxxx aws_secret_access_key=xxxxxxxxx/xxxxxxx • us-west-2リージョンに “channel02”を作る場合 $ aws2 --region us-west-2 kinesisvideo create-signaling-channel --channel-name channel02 --channel-type SINGLE_MASTER { "ChannelARN": "arn:aws:kinesisvideo:us-west-2:xxxxxxxxxx:channel/channel02/xxxxxxxxx” } • ※ARNを記録しておく
  • 31. SDKでシグナリングチャネルの作成(JS) const kinesisVideoClient = new AWS.KinesisVideo({ region, accessKeyId, secretAccessKey }); const kinesisvideo = new AWS.KinesisVideo(); const channel = 'channel03’; const params = { ChannelName: channel, ChannelType: 'SINGLE_MASTER’ }; kinesisvideo.createSignalingChannel(params, function (err, data) { if (err) console.log(err, err.stack); // エラー else console.log(data); // 成功、ARNがJSONで返ってくる }); DEMO
  • 32. REST API でシグナリングチャネルの作成 • リージョン:us-west-2, チャネル名:chanel04 の場合 $ curl -X POST https://kinesisvideo.us-west-2.amazonaws.com/createSignalingChannel -H "Content-Type: application/json" -d '{"ChannelName": "channel04", "ChannelType": "SINGLE_MASTER"} ' -H "Authorization: AWS AWSAccessKeyId:Signature" ※ここの文字列の生成方法が、 よくわかってません
  • 33. KVS WebRTCの価格 • こちらのユースケースから • https://aws.amazon.com/jp/kinesis/video-streams/pricing/ • 料金の例 2: WebRTC と KVSを使用するスマホ用ライブストリーミングア プリケーション • ライブメディアストリーミング用に KVS の WebRTC 機能を使用 • ユーザーが 100 人、それぞれ独自のシグナリングチャネル • 50 件のライブストリーミングセッションを経由 • 1 か月あたり合計 2,000 分間のライブストリーミング、TURN 20% (400分) • アクティブなシグナリングチャネル = 100 x (0.03 USD/月) = 3.0 USD • シグナリングメッセージ = 0.34 USD • TURN (分) = 100 ユーザー x 400 TURN ストリーミング時間 (分) • x (0.12 USD/1,000 TURN ストリーミング時間 (分)) = 4.8 USD • 合計 = 8.14 USD • 転送 1Mbps と仮定 • 40000 TURNストリーミング時間/月 → 300GB/月 • 転送料金 27 USD/月 (299GB分、us-west-2の場合)
  • 34. KVS WebRTCの価格 • 料金の例 3: ビデオストリームと WebRTC の両方を使用するスマートホームセ キュリティカメラ • ホームセキュリティシステムのプロバイダーには 1,000 人のユーザー • 各ユーザーの家には 1 台のカメラ、動きを検出するとストリーミング • ユーザーはコンパニオンアプリで 1 か月あたりに 100 回カメラに接続 • WebRTC によって、ライブビデオストリームの視聴や双方向のオーディオセッション • セッションの所要時間は 2 分間で、メディアストリームの 40% は TURN • WebRTC: 各カメラはそれぞれ独自のシグナリングチャネル • 合計で 1 か月あたり 1,000 件のアクティブなシグナリングチャネル • 各セッションが配信するシグナリングメッセージは 30 件で • 合計 3,000,000 件になります • カメラはそれぞれ TURN 経由の 80 分間のライブストリーミング、 • 1 か月に 80,000 TURN ストリーミング時間 (分) • 合計 = 46.35 USD • 転送 1Mbps と仮定 • 80000 TURNストリーミング時間/月 → 600GB/月 • 転送料金 54 USD/月 (599GB分、us-west-2の場合)
  • 35. KVS WebRTCの感想/まとめ • KVS WebRTCは、KVSの使い方を広げるもの • KVS WebRTC 単独では、魅力が少ないかも • マネージドSTUN/TURNは魅力 • TURNのセッションのパスワード発行もやってくれる • 通信料は安くはない … 300GB/月 → 27USD • Vultr.com のIaaS … 1TB/月→ 5USD • シグナリングの縛りは強い • シグナリングチャネルにつながるまでの時間も数秒かかる • 用途 • 今のところ、ビデオチャットのようなコミュニケーション向けではない印象 • 他のサービスの方が使い勝手が良さそう(個人の感想) • IoTデバイスを使った、動画の収集+リアルタイムモニターのケースがマッチ