Amazon Kinesis Video Streams WebRTC基本情報
用語定義
- Signaling channel
- WebRTCではシグナリングメッセージを交換することにより、ピアツーピア接続における検出、設定、制御、終了が可能になります。 シグナリングメッセージはメタデータであり、メディアコーデックやコーデックパラメータといったメディア情報や相互のアプリケーションをライブストリーミングで接続するためのネットワークパス情報が含まれます。 シグナリングチャネルは、複数のアプリケーション間をone-to-fewモデル(一つのマスタが複数のビューアと接続)で接続します。 マスタは、ConnectAsMaster APIを、ビューワはConnectAsViewer APIを使用し接続します。
- Peer
- Kinesis Video Streams with WebRTCを通じて、リアルタイムストリーミングを行うデバイスやアップりケーション(モバイル端末やWebアプリ、Webカメラなど)
- Master
- 接続を開始し、シグナリングチャネルに接続されているピアで、シグナリングチャネルに接続されているビューアのいずれかとメディアを検出して交換する機能を備えています。
- Viewer
- シグナリングチャネルのマスターとのみメディアを検出および交換する機能を備えたシグナリングチャネルに接続されているピア。視聴者は、特定のシグナリングチャネルを介して他の視聴者を発見したり、他の視聴者と対話したりすることはできません。シグナリングチャネルには、最大10人のビューアを接続できます。
ICE,STUN,TURNの動作
2つのPeers(AとB)がWebRTCを用いてメディアストリーミングする例で説明します。
Bアプリに接続するために、AアプリはSDP offer
を生成します。
SDP offerは、Aアプリが確立したいセッションの情報(例えば、使用するコーデックや、音声か映像なのかなど)が含まれます。
SDP offerには、ICE candidates
リストも含みます。これは、BアプリがAに接続するために使用することができるIPとポートのリストです。
ICE candidatesリストを構築するために、Aアプリは一連の要求をSTUNサーバに行います。
STUNサーバは、要求を発信したパブリックIPとポートのペアを返します。Aアプリは、これらペアをICE candidatesリストを追加します。
一度、AアプリがICE candidatesを集め終わると、そのリストをSDPで返します。
次に、Aアプリは、シグナリングチャネルを通じて、SDPをBアプリに送ります
。
ここで使われるプロトコルはWebRTCでは標準化されていません。HTTPSやWebSocketなどが使われます。
BアプリはSDP answer
を生成します。
BアプリはAアプリが行った前述のステップと同様に(ICE candidatesを集めたり)します。
その後、BアプリはSDP answer
をAアプリに返します。
AアプリとBアプリのSDP交換後、接続確認
を行います。
各アプリのICEアルゴリズムは、相手のSDPで受信したリストから候補のIP /ポートペアを取得し、STUN要求
を送信します。
もし、応答が返ってきたら、このIP/ポートのペアを有効なICE candidateと位置付けます
。
全IP/ポートペアの接続確認が終わると、アプリケーションはそのうちの1つを使って接続のネゴシエーション
を始めます。
もし、いずれかのアプリケーションが接続チェックに合格するIP/ポートペアを見つけることができない場合、メディアリレーアドレスを取得するためにTURNサーバーにSTUN要求を行います。
リレーアドレスは、アプリケーションとの間で送受信されたパケットを転送してリレーアドレスを設定するパブリックIPアドレスおよびポートです。次に、このリレーアドレスが候補リストに追加され、シグナリングチャネルを介して交換されます。
Kinesis Video Streams WebRTC SDKs
WebRTCクライアント向けSDKとして、組み込みC、Japascript(Webブラウザ)、Android、iOS版がダウンロード可能です。
- WebRTC SDK in C for Embedded Devices
- WebRTC SDK in JavaScript for Web Applications
- WebRTC SDK for Android
- WebRTC SDK for iOS
WebRTC SDK in C for Embedded Devicesインストールおよび利用方法
ダウンロード&ビルド
下記コマンドにより、Kinesis Video Stream with WebRTC SDK in C for Embedded Devicesをダウンロードできます。
$ git clone --recursive https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c.git
1 ビルドに必要なパッケージをインストール
sudo apt-get install pkg-config cmake libcap2 libcap-dev
2 AWSアカウントのAccess KeyとSecret Keyをダウンロード
3 下記コマンドをWebRTC C SDKをダウンロードしたディレクトリで実行しビルド。
mkdir -p amazon-kinesis-video-streams-webrtc-sdk-c/build;
cd amazon-kinesis-video-streams-webrtc-sdk-c/build;
cmake ..
4 上記の手順で作成したビルドディレクトリに移動し、makeを実行してWebRTC C SDKとその提供されたサンプルをビルドします。
サンプルを実行
提供サンプルのひとつkvsWebrtcClientMasterGstSample
を動かしてみます。これは、GStreamerパイプラインを通じて、H264エンコード出力するものです。
1 AWSアカウント認証情報の設定
export AWS_ACCESS_KEY_ID= <AWSアカウントのAccess Key>
export AWS_SECRET_ACCESS_KEY= <AWSアカウントのAccess Key>
export AWS_KVS_CACERT_PATH= <認証.pemファイルへのフルパス>
2 事前にAWSコンソールで作成したシグナリングチャネルをパラメータとして、kvsWebrtcClientMasterGstSampleを起動します。
今回は、channel_for_test
という名前のシグナリングチャネルを作成したので、下記コマンドを実行します。
./kvsWebrtcClientMasterGstSample channel_for_test
3 シグナリングチャネルが生成され、接続されたMasterはストリーミングを開始します。
$ ./kvsWebrtcClientMasterGstSample channel_for_test
[KVS GStreamer Master] Using trickleICE by default
[KVS GStreamer Master] Created signaling channel channel_for_test
[KVS Gstreamer Master] Finished initializing GStreamer
[KVS Gstreamer Master] Streaming video only
[KVS GStreamer Master] streaming type video-only[KVS GStreamer Master] KVS WebRTC initialization completed successfully
...
[KVS GStreamer Master] Signaling client created successfully
...
[KVS GStreamer Master] Signaling client connection to socket established
[KVS Gstreamer Master] Beginning streaming...check the stream over channel channel_for_test
4 AWS WebコンソールのKinesis Video Streams - シグナリングチャネルで該当するシグナリングチャネルを選択し、メディア再生ビューワーで映像を確認できます。
KVS WebRTC Test Pageからも確認ができます。