Raspberry PiのカメラでAmazon Kinesis Video StreamsのWebRTCを使ってみる

[Amazon Kinesis Video StreamがWebRTCをサポートし](https://aws.amazon.com/jp/about-aws/whats-new/2019/12/amazon-kinesis-video-streams-adds-support-for-real-time-two-way-media-streaming-with-webrtc/)たので試してみました。

すでに[iOS、Android、JavaScript,Cのクライアントライブラリ](https://github.com/awslabs?utf8=%E2%9C%93&q=webrtc&type=&language=)とサンプルが提供されているので、今回はCのサンプルをRaspberry Piで試してみたいと思います。

https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c

使ったRaspberry Piは3 Model B。 RaspbianはStretch。

`uname -a`の結果

```
Linux raspberrypi 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv7l GNU/Linux
```

## 準備

一旦色々新しくして

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

サンプルをビルド＆実行するのに必要なライブラリのインストール

```
sudo apt-get install pkg-config cmake libcap2 libcap-dev libssl-dev
```

最低限のサンプルはこれでビルドできますが、gstreamerを使ったサンプルに必要なライブラリも入れます。

```
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
```

## カメラからの動画を表示してみる(Raspberry Pi上で作業)

今回はUSBカメラを使っているので、実際にカメラから画像を取り出せているか確認してみます。

```
gst-launch-1.0 autovideosrc ! autovideosink
```

これで、ウィンドーが開いてカメラからの画像が見れればOK。

## Kinesis Video Streamのサンプルをビルド

https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c

このリポジトリにセットアップ方法が書かれているので、そのとおりにビルド。

```
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
```

これでいくつかのサンプルが使えるようになりました。

```
CMakeCache.txt  cmake_install.cmake    kvsWebrtcClientMasterGstSample  libkvsWebrtcClient.so
CMakeFiles      h264SampleFrames       kvsWebrtcClientViewer           libkvsWebrtcSignalingClient.so
Makefile        kvsWebrtcClientMaster  kvscproducer                    opusSampleFrames
```

### サンプルの実行

`kvsWebrtcClientMasterGstSample`が実際のサンプルプログラムですが、実行するにはAWSのクレデンシャルが必要なので、以下の環境変数を設定します。

- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_DEFAULT_REGION(KVS使うregionに合わせる)

`kvsWebrtcClientMasterGstSample`の引数は、1つ目が`Signaling Channel`の`Channel Name`で、存在しなければ新規で作成し、すでにあればそれを使います。2つ目が`video-only`か`audio-video`のどちらかを指定。

```
./kvsWebrtcClientMasterGstSample pi-camera video-only
```


これで、Raspberry Pi側はMasterとしてビデオのみを送ります。

送られてきた映像を見るのに、[JavaScriptのサンプル](https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-js/tree/master/examples)で用意されている物を使います。
こちらのサンプルもAWSのクレデンシャル情報が必要になるので、以下の情報を入力します。

- KVS EndpointのRegion(Raspberry Piと合わせる)
- Access Key ID
- Secret Access Key
- Signaling ChannelのChannel Name


こんな感じで、左側にMacのカメラから入ってきている映像が表示され、右側にRaspberry Piからの映像が表示されます。
<img width="1140" alt="スクリーンショット 2019-12-30 15.51.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36184/2c50a7c4-111f-c955-1c9f-fbdc1c88d6d1.png">

Raspberry Piの負荷をみてみるとなかなか苦しそうですね。
<img width="1155" alt="スクリーンショット 2019-12-30 15.52.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36184/622f3edd-d2d9-6cad-d411-64111896a25d.png">

## まとめ

サンプルが用意されているので、簡単にRaspberry Pi上で試すことが出来ました。

## 免責

発言内容は個人的な意見であり、所属する企業を代表するものではありません。
掲載しているソースコードは、サンプルレベルの物ですので動作を保証するものではありません。


後編 [Amazon Kinesis Video StreamsのWebRTCとAlexaを組み合わせてドアホンみたいのを作る](https://qiita.com/sparkgene/items/c027d501e549f8ddc5c8) に続く