ラズパイで撮影した動画をLTE回線でAmazon Kinesis Video Streamに送信

[メカトラックス社](https://mechatrax.com/)様からお借りした4G通信モジュールを使用して、Amazon Kinesis Video Streamに送信したウエブカメラの動画をAmazon Rekognitionに解析させてみました。
今回は、LTE回線経由でラズパイ ⇒ Kinesis Video Streamの部分を主に記載します。（Kinesis Video Stream ⇒ Rekognitionの続編も予定してます）

##4GPiとは
4GPi（フォージーパイ）はラズベリーパイ専用に開発された4G（LTE）通信モジュールです。
携帯電話網経由の通信のためWi-Fi等のネットワーク環境がない場所でもラズパイからインターネットに接続できます。
4GPiの詳細は[こちら](https://mechatrax.com/products/4gpi/)。

##概要
　　　　　　　<img width="500" alt="outline01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599959/05d5284c-aba7-663e-a4fb-bc70befe2b04.png">

##環境
・Raspberry Pi 3 Model B（ラズパイ）
・4GPi
・SIMカード※1、SIMカードアダプター※2
・MicroSDカード、MicroSDカード対応Reader/Writer※2
・ラズパイ接続用のUSBキーボード、USBマウス、モニタ、モニタ接続用HDMIケーブル
・LOGICOOL HD Webcam C525（ウエブカメラ）
・作業PC
・Wi-Fi環境※3
・AWSアカウント

（※1）個人のスマホから抜きました。Nano-SIMだったので標準SIMに変換するSIMカードアダプターを別途調達。
（※2）家電量販店で調達しました。
（※3）ラズパイに4GPiのモジュールをインストールするまで使用します。

##作業の流れ
1. 4GPiの装着
2. Raspbianのインストーラ作成
3. Raspbianのインストール
4. 4GPiの設定
5. AWSの設定
6. Raspbianの設定
7. ウエブカメラの動画をKinesis Video Streamに送信する

##1. 4GPiの装着
ラズパイに4GPiを装着します。
<img width="600" alt="raspi3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599959/033fdd77-f071-bf28-1775-0bc891b28f67.png">

| # | 説明 | # | 説明 |
|:---:|---|:---:|---|
|①|ラズパイ本体|⑤|HDMIケーブル（to モニタ）|
|②|4GPi本体|⑥|4GPi-ラズパイ接続用のUSBコネクタ（形状はUSB mini-Bメス）|
|③|電源コネクタ（to ACアダプタ）|⑦|USBコネクタ x 4個（to キーボード、マウス、ウエブカメラ、⑥）|
|④|4Gアンテナ x 2本|⑧|SIMソケット（標準SIMカード対応）|
※①、⑤、⑦はラズパイ、②～④、⑥、⑧は4GPi
※ラズパイ本体への電源供給は、ACアダプタに接続された③電源コネクタで4GPiから①ラズパイ本体に給電しているので不要です。

##2. Raspbianのインストーラ作成
作業PCでラズパイにインストールするOSのインストーラを作成します。
OSはDebianベースのRaspbian（Buster）を使用しました。

* ブラウザからRaspberrypi.orgの[ダウンロードページ](https://www.raspberrypi.org/downloads/noobs/)にアクセスしてNOOBSの「NOOBS_v3_x_x.zip」をダウンロードします。  
※ダウンロードに10時間以上かかりました。ミラーサイトのほうが早いかも。。
<img width="600" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599959/076a1d08-24d1-23bf-c97c-ba914f18deb5.png">
* 作業PCにMicroSDカード対応Reader/Writerを接続してMicroSDカードを差し込みます。
* [SD Card Formatter](https://www.sdcard.org/jp/downloads/formatter/)等で作業PCに装着したMicroSDカードをフォーマットします。
* エクスプローラでダウンロードしたNOOBS_v3_x_x.zipをMicroSDカード上に解凍します。

##3. Raspbianのインストール
ラズパイにRaspbianをインストールします。

* ラズパイ裏面のMicroSDカードスロットにMicroSDカードを差し込んでラズパイの電源を入れます。
* Raspbianの初期設定ウィザードが表示されたら下表の通りインストールしてRaspbianを再起動します。

| 項目 | 設定値 |
|:--------|----------|
|Country|Japan|
|Language|Japanese|
|Timezone|Tokyo|
|new password|（任意）|
|Select WiFi Network|（接続可能なWifiを選択します※）|
|Check For Updates|（SkipしてOKです）|

※4GPiの設定が完了するまでインターネット接続はWi-Fiを使用します。

##4. 4GPiの設定
RaspbianのLXTerminalツールを起動し、メカトラックス社の設定スクリプトを実行して4GPiを設定します。

* Raspbianにリポジトリを追加します。

```
$ curl https://mechatrax.github.io/setup.sh | sudo bash
```
* Raspbianに4GPiパッケージをインストールしてRaspbianを再起動します。

```
$ sudo apt install 4gpi-utils 4gpi-net-mods 4gpi-networkmanager
$ shutdown -r now
```
* アクセスポイントに接続して接続状況を確認してみます。  
※ドコモspモードはアクセスポイント名（APN）として「spmode.ne.jp」が指定できます。

```
$ sudo nmcli con add type gsm ifname "*" con-name 【接続名】 apn 【APN】 user 【ユーザー名】 password 【パスワード】
$ sudo nmcli dev status
```

* cdc-wdm0デバイスの状態が「接続済み」となり、インターネットにあっさり接続できました。
　<img width="600" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599959/3c9c00da-2076-9672-e174-0e311b78f270.png">

* Wi-Fi接続が不要になったので、画面右上のネットワークアイコンから「Turn Off Wi-Fi」をクリックしてWi-Fiを切断します。

これで4GPiの設定が完了です。

##5. AWSの設定
作業PCのブラウザ（Google Chrome推奨）から[AWSマネジメントコンソール](https://console.aws.amazon.com/console/home)にログインしてAWS側の設定を行います。
※AWSアカウントが必要です。

####5.1 IAMユーザーの作成
AWSマネジメントコンソールでIAMユーザーを作成します。

* マネジメントコンソールのサービスメニューから「IAM」を開き、ユーザー画面の［ユーザーを作成］をクリックします。
* ユーザー作成画面のユーザー名を入力後、「プログラムによるアクセス」を選択して［次のステップ］をクリックします。
* 「既存のポリシーを直接アタッチ」オプションから「AmazonKinesisVideoStreamsFullAccess」を選択し、［次のステップ］をクリックします。
<img width="700" alt="iam02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599959/9a2843a9-5750-be6b-5b72-28dfaf3f3ea6.png">
* アクセスキーIDとシークレットアクセスキーをメモ張にコピペします。
<img width="700" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599959/4ee4b19a-b8fa-f46c-fb02-8cd9f3c5f8ba.png">

####5.2 Kinesis Video Streamの作成
Kinesis Video Streamにウエブカメラの動画を受け取るのストリームを作成します。

* マネジメントコンソールのサービスメニューから「Kinesis Video Stream」を開きます。
* ビデオストリーム画面から下表の設定としてビデオストリームを作成します。

| 項目 | 設定内容 |
|:--------|----------|
|ビデオストリーム名|testKinesisVideoStreams01|

* 作成したビデオストリームをクリックしてビデオストリームARNの値をメモ帳にコピペします。
<img width="700" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599959/5db6556a-3bf6-6595-4108-e184d3d1c3a3.png">

##6. Raspbianの設定
RaspbianからAWSサービスにアクセスするための環境を構築します。
LXTerminalを起動して以下の作業を実施します。

####6.1 AWS configの設定
* AWSコマンドラインインターフェース（AWS CLI）をインストールします。

```
$ sudo apt install python3-pip
$ sudo pip3 install awscli --upgrade
```
* `aws configure`コマンドを実行して下表のパラメータを定義します。  
プロファイル名は「awsconfigure01」としました。

```
$ aws configure --profile awsconfigure01
```
| 項目 | 設定値 |
|:--------|----------|
|AWS Access Key ID|（5.1節のアクセスキーID）|
|AWS Secret Access Key|（5.1節のシークレットアクセスキー）|
|Default region name|Tokyo|
|Default output format|json|

 [None]: o3fGmbsKJc/t/d8v1Cj7Uai9M5FrRrZS+BNH8/E6
 [None]: ap-northeast-1
 [None]: json


####6.2 C++ Producer SDKのインストール
ウエブカメラの動画をKinesis Video Streamsに送信するために必要となるライブラリ（C++ Producer SDK）をインストールします。

* ライブラリのインストール前に必要なパッケージをRaspbianにインストールします。

```
$ sudo apt-get update
$ sudo apt-get install -y git
$ sudo apt-get install byacc flex
$ sudo apt-get install openjdk-8-jdk
```

* 環境変数JAVA_HOMEを定義してcmakeをインストールします。

```
$ export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-armhf/
$ sudo apt-get install cmake
```

* 下記URLの証明書ファイルの内容をコピーして`/etc/ssl/cert.pem`に上書き保存します。 
[https://www.amazontrust.com/repository/SFSRootCAG2.pem](https://www.amazontrust.com/repository/SFSRootCAG2.pem)

* C++ Producer SDKをインストールします。

```
$ git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp
```

* インストールスクリプトの実行前に必要なパッケージをインストールします。

```
$ sudo apt-get update
$ sudo apt-get install libssl-dev libcurl4-openssl-dev liblog4cplus-1.1-9 liblog4cplus-dev
$ sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base-apps
$ sudo apt-get install gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools
$ sudo apt-get install gstreamer1.0-omx
```

* スクリプトを実行して「Success!」と表示されたらインストール完了です。

```
$ ./min-install-script
```

####6.3 ウエブカメラの認識
LXTerminalで`lsusb`を実行してウエブカメラが認識されていることを確認します。
<img width="800" alt="21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599959/d840b83c-9e06-03fb-698e-15d6b9f827ed.png">

##7. ウエブカメラの動画をKinesis Video Streamに送信する

* libgstkvssink.soファイルが存在するディレクトリを抽出します。

```
$ dirname `sudo find / -type f |grep libgstkvssink.so`

/home/pi/amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build
```

* 抽出したディレクトリを環境変数「GST_PLUGIN_PATH」にセットします。

```
$ export GST_PLUGIN_PATH=/home/pi/amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build:$GST_PLUGIN_PATH
```

* ウエブカメラの動画をビデオストリームに送信します。  
※コマンドの実行前にラズパイを再起動する場合はGST_PLUGIN_PATHを再セットします。

```
$ gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! video/x-raw,format=I420,width=640,height=480 ! omxh264enc control-rate=2 target-bitrate=512000 periodicity-idr=45 inline-header=FALSE ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline ! kvssink stream-name="testKinesisVideoStreams01" access-key="【5.1節のアクセスキーID】" secret-key="【5.1節のシークレットアクセスキー】" aws-region="ap-northeast-1"
```

* マネジメントコンソールのKinesis Video Stream画面でウエブカメラの動画が再生されました！
<img width="800" alt="stream05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599959/d32fe0ea-9a56-e4ae-32e4-f357d655f7ad.png">

* 動画が再生されない場合は、過去の時刻に戻して「再生ヘッドコントロールを保存」をクリックしてみてください。
<img width="600" alt="stream06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599959/c93566be-b168-62a2-73f5-b627604bb992.png">

## 最後に
4GPiのLTE通信を使用してラズパイに装着したウエブカメラの動画をAmazon Kinesis Video Streamに送信できました。
Wi-Fi環境のない僻地や移動体通信が必要となる場所で活用できそうです。