【初心者向け】Amazon Kinesis Video Streams WebRTC SDKのC言語サンプルをRaspberry Piに実装する手順

## 1． この記事の内容
WebRTCを勉強中の初心者エンジニアです。
[前回](https://qiita.com/rie_uchida500/private/32cbe3793c995b5a7537)は、Amazon Kinesis Video Streams WebRTC（以降KVS WebRTC） SDKのJavaScriptサンプルをEC2にデプロイして、ブラウザ間の通信確認をしました。
今回は、SDKのC言語サンプルを使ってRaspberryPi-ブラウザ間で通信確認をしたので、実装手順をまとめます。

この記事で触れる内容は以下です。

* RaspberryPiをセットアップする方法
* RaspberryPiでKVS WebRTC SDK（C）のサンプルを実行する方法
* KVS WebRTC SDK（C）のサンプルに文字列送信処理を追加する方法


## 2．実装環境
RaspberryPiモデル：RaspberryPi 3 B+
RaspberryPi OS：Raspbian
カメラモジュール ：Raspberry Pi Camera Rev 1.3
USBマイク ：audio-technica AT9934USB

※今回実行するサンプルコードはOpus、H264のみに対応しています。対応していないコーデックのカメラ・マイクを使用する場合は、コーデックの変換を別途行う必要があります。この記事では対応していません。

## 3. 構成イメージ
KVS WebRTCを使って、下図のようなサービスを構築します。

ブラウザは、KVS WebRTC SDK（JavaScript）サンプルを配信するWebサイトを介してシグナリング、P2P通信します。
RaspberryPiは、KVS WebRTC SDK（C）サンプルを実装して、シグナリング、P2P通信します。

![構成１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1073499/3ec4743d-f49d-6e75-3d84-9debdfe33729.png)

④P2P通信時のRaspberryPi側（KVS WebRTC SDK C言語サンプル）の機能は以下です。

* ブラウザから受信した音声・文字列のコンソール出力
* ブラウザに映像・音声を送信


## 4．前提
5.手順の図の「ブラウザから通信するための準備」は完了していることを前提に進めます。
完了していない場合は、前回記事[【初心者向け】Amazon Kinesis Video Streams WebRTC SDKのJSサンプルをEC2にデプロイする手順](https://qiita.com/rie_uchida500/private/32cbe3793c995b5a7537)に従って、ブラウザから通信できる状態にしておいてください。
## 5．手順
![フロー004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1073499/8234cf8f-f0cb-b1ce-7bd9-e834bc45bdb0.png)


### RaspberryPiの環境構築
###### 1.RaspberryPiをセットアップする
公式の手順に従って、RaspberryPiに、最新バージョンのRaspbian OSをインストールします。使用するカメラやマイクも接続します。

https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up

###### 2.カメラモジュールを設定する
カメラモジュールを読み込ませるために、設定を確認・変更します。
画面左上のRaspberry Piのメニューボタンから「設定」＞「Raspberry Piの設定」をクリックし、システム設定を開きます。
次に「インターフェイス」をクリックし、「カメラ」が「有効」になっていることを確認します。「無効」になっている場合は「有効」を選択し、「OK」ボタンをクリックします。

###### 3.パッケージを更新する
ターミナルを開いて、下記コマンドを実行してパッケージを更新します。

```
sudo apt-get update
sudo apt-get upgrade
sudo apt-get clean
sudo reboot
```

以上で、Raspberry Piの準備は完了です。

### C言語サンプルの実行
次に、Raspberry Piにサンプルを設置して実行します。

###### 1.SDKをクローンする
ターミナルを開いて、以下コマンドでKVS C SDKのリポジトリをクローンします。

```
sudo yum install git-all 
git clone https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-C
```
###### 2.必要なライブラリをインストールする
下記コマンドでライブラリをインストールします。

```
sudo apt-get install pkg-config cmake libcap2 libcap-dev libssl-dev
sudo apt-get install gstreamer1.0-tools libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-omx gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly
```
###### 3.ビルドする
下記コマンドを入力して、ビルドを実行します。

```
cd ~
git clone --recursive https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c.git
mkdir -p amazon-kinesis-video-streams-webrtc-sdk-c/build; 
cd amazon-kinesis-video-streams-webrtc-sdk-c/build; 
cmake ..
make
```
###### 4.通信開始に必要な値を設定する
下記のコマンドで環境変数を設定します。それぞれ、前回シグナリングチャンネル作成時に取得した値を入力します。
```AWS_KVS_LOG_LEVEL```は2または1でないと受信した文字列がコンソールに出力されません。

```
export AWS_ACCESS_KEY_ID= <AWS account access key>
export AWS_SECRET_ACCESS_KEY= <AWS account secret key>
export AWS_DEFAULT_REGION= <AWS region>
export AWS_KVS_LOG_LEVEL = 2 switches on DEBUG level logs while runnning the samples
```

###### 5.実行する
下記コマンドで実行します。
第一引数は、シグナリングチャネルのChannel Nameです。存在しなければ新規作成されます。
第二引数は、```video-only```または、```audio-video```です。送信するメディアを指定します。

```
./kvsWebrtcClientMasterGstSample <Channel Name> video-only
```

これで、Raspberry Piからシグナリングサーバーへリクエストが飛び、通信相手を待つ状態になります。

### 通信テスト
Raspberry Pi側の通信準備が整ったので、ブラウザからもリクエストをして通信確認をします。

###### 1.ブラウザから通信リクエストする
前章までの通り、RaspberryPiでC言語サンプルを実行している状態で下記手順を実行します。
ブラウザから下図の通り入力、Start Viewerを押下して通信リクエストをします。
![ページ001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1073499/f91a22e3-293a-b4d8-f855-897ed14e51f9.png)
ブラウザにRaspberryPiのカメラ映像が表示されれば通信成功です。ブラウザから文字列を送信すると、RaspberryPi側のコンソールに出力されます。

※RaspberryPiのカメラ映像が表示されるまで時間がかかる場合があります。少し待っても表示されない場合は、C言語サンプルの実行からやり直してください。

## 6. 文字列送信処理を追加する
サンプルコードには、RaspberryPiから文字列を送信する処理はありません。
そこで、文字列を受信した際に、「reply」と文字列を返す処理を追加してみます。
```samples/Common.c ```を、下図赤枠内のように書き換えます。
![c001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1073499/d6d3234b-7cea-c8d1-b465-903542632efb.png)


書き換えたらもう一度、ビルド・実行します。

さらに、ブラウザで受信した際の処理を追加する必要があります。
Webサーバーに配置している```examples/viewer.js```の下図赤枠内を追加します。
![js002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1073499/5dfb295a-828f-ba8f-d841-6c836cb8876e.png)


C、JSサンプルの書き換えが完了したら、通信を確認します。
ブラウザから文字列を入力して送信ボタン押下後、「reply」と表示されれば成功です。

## 7. まとめ

Amazon KVS WebRTC SDK のC言語サンプルをRaspberryPiで実行する手順をまとめました。
私と同じような初心者エンジニアの方のお役に立てれば幸いです。