Raspberry Pi Zeroを使ってAmazon Kinesis Video Streamsにカメラ映像送信

# 1. 概要
Raspberry Pi Zero WHにBuster(Debian 10)をインストールしてAmazon Kinesis Video Streams(KVS)にカメラ映像を送信する。
Buster(Debian 10)は2022年前半時点で、旧版のOSとなっている。AWSのアカウント作成や設定などは省略する。

# 2. 前置き
## 2.1. 経緯
知人から依頼され、2021年頃にRaspberry Pi 3Bを使ってKVSにUVCカメラの映像をアップロードする手順を確認した。その時点では問題なかったが、最近になって改めてその手順を行ったところ、OSのバージョン違いやコマンドの記載漏れによって動かない、分かりづらいなどが判明したので改めて確認することとなった。

## 2.2. Raspberry Pi OSについて
2021年の後半に出たBullseye((Debian 11)だとカメラや画像を扱うときにライブラリが無いなどの状況になっている。何故なのかは知らないが、多くの人が困っているようだ。
2020～2021年前半に使ったOSはBuster(Debian 10)、最新のRaspberry Pi Imagerであれば選択インストールできるらしい。そこで、旧版のOSをインストールし、旧来のカメラや画像処理がうまく動いていた状況を再現する。

## 2.3 ハードウェア
* Raspberry Pi Zero WH
* UVCカメラ: Buffalo BSW500M
* USB HUB(カメラ以外にキーボードやマウスをつなぐ場合)

# 3. 手順
## 3.1. OSインストール
Raspberry Pi Imagerを使ってOSインストール。きちんと選択すれば、Busterもインストールできる。

Raspberry Pi Imagerは以下からダウンロードできる。
https://www.raspberrypi.com/software/

OSの選択　otherを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/18a47a56-7aa1-6f31-4d85-5aed189d973f.png)

Legacyを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/584cf977-dd04-a91d-2d0b-f3e22a34c602.png)

従来通りストレージを選択して、書き込みを開始する。
終わったらWindowsがフォーマットしますか？と書き込みを無にする質問をしてくるのでキャンセル。

## 3.2. OSのセットアップ
OSのセットアップ時に出てくる「Update Software」は実行する。
さらに、念のためターミナルで以下を実行しておく。
```
$ sudo apt update
$ sudo apt upgrade
```

## 3.3. 環境設定
環境作成として、カメラや画像処理で使うgstreamer、通信で使うsslなどを入れる。
```
$ sudo apt -y install cmake m4
$ sudo apt -y install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools gstreamer1.0-omx
$ sudo apt -y install libssl-dev libcurl4-openssl-dev liblog4cplus-1.1-9 liblog4cplus-dev
```

# 4. Amazon Kinesis Video Streams Producerのインストール
インストールというかビルド。ソースコードからビルドする。

## 4.1. 準備
gitでクローンしたが、最新ソースだけでも問題ない。
```
$ git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp
$ mkdir -p amazon-kinesis-video-streams-producer-sdk-cpp/build
$ cd amazon-kinesis-video-streams-producer-sdk-cpp/build
```

## 4.2. ビルド
終わるまで結構時間かかる.
```
$ cmake -DBUILD_GSTREAMER_PLUGIN=ON ..
$ make
```

## 4.3. 環境変数の設定
```
$ export GST_PLUGIN_PATH=/home/pi/amazon-kinesis-video-streams-producer-sdk-cpp/build/downloads/local/lib:$GST_PLUGIN_PATH
$ export LD_LIBRARY_PATH=/home/pi/amazon-kinesis-video-streams-producer-sdk-cpp/build/downloads/local/lib
```

Gstreamerがlibgstkvssink.soを参照できるようにする。しない場合、「WARNING: erroneous pipeline: エレメント "kvssink" がありません」がエラーとして出る。
```
$ mkdir -p /home/pi/amazon-kinesis-video-streams-producer-sdk-cpp/build/downloads/local/lib/gstreamer-1.0/
$ cp -p /home/pi/amazon-kinesis-video-streams-producer-sdk-cpp/build/libgstkvssink.so /home/pi/amazon-kinesis-video-streams-producer-sdk-cpp/build/downloads/local/lib/gstreamer-1.0/
```

# 5. 実行と確認
＜アクセスキー＞と＜シークレットアクセスキー＞は自分のAWSアカウントで作ったユーザー情報でわかるのでそれと置き換えて使う。送り先のAWSリージョンと映像確認の際に自分が開いているリージョンが違うと映像を見られない。
カメラの性能にない解像度やフォーマットは使えない。
```
$ 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="MyKinesisVideoStream" access-key="＜アクセスキー＞" secret-key="＜シークレットアクセスキー＞" aws-region="ap-northeast-1" 
```
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/0c96eb92-1985-4614-1282-06ab7782eaab.png)

遅延はあるが映像が出ているのでOKとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/d800fe9e-ca72-9bd9-c95c-59f9948f60d2.png)

## 5.1. 補足
IDRフレームの間隔を指定をするパラメータの設定について、Gstreamerのバージョンか何かの要因によって以下のパターンがあり得る。今回は問題にならなかったが、実際にハマったことがあるのでメモとして残す。
* periodicity-idr
* periodicty-idr

# 6. 結論
OSの選択以外は特に問題ない。（手順の記載がなく、使う側がケアレスミスしなければ）