Raspberry Pi Zero2 W を使ってAmazon Kinesis Video Streams (1)

# 1. 概要
前回の記事に試みにより、Pi Zero2 W＋bullseye 64bit Lite(Debian 11)になんとかAmazon Kinesis Video Streams Producer SDKを導入できた。今回は本来の目的のビデオのアップロードを行う。

https://qiita.com/tetsuoMikami/items/57f9d3ec23ffa9c9a75b

# 2. 使うもの
* Pi Zero2 W＋bullseye 64bit Lite(Debian 11)
  ユーザー名はpiとする。
* UVCカメラ: Buffalo BSW500M

# 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を参照できるようにする
```
$ 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/
```

# 4. 実行と確認
# 4.1. MJPEG->H.264
* JPEGのハードウェアデコード
* H.264のハードウェアエンコード

とりあえず小さな解像度（320x240）とフレームレート（10 fps）ではうまくいった。画像荒いけど。
```
gst-launch-1.0  v4l2src device=/dev/video0 ! "image/jpeg,width=320,height=240,framerate=10/1" ! queue ! jpegparse ! v4l2jpegdec ! v4l2h264enc ! 'video/x-h264,level=(string)4' ! h264parse ! kvssink stream-name="MyKinesisVideoStream" access-key="アクセスキー" secret-key="シークレットアクセスキー" aws-region="ap-northeast-1" 
```
※v4l2jpegdecをjpegdecにするとソフトウェアエンコードになる。動きは遅い。

解像度をHD(1280x720)にするとメモリ関係のエラーが出てアップロードに失敗した。
GPUの割り当てを増やしたらうまくいくかもと思い、128MBに設定したら成功した。

以下のコマンドでメニューを起動
```
sudo raspi-config
```
パフォーマンス系の変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/07e2a636-fc20-4bf8-9357-c0a83acaccd1.png)
GPUメモリの変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/e3541f31-bfa9-5fd9-7e8d-b957ec512c46.png)
変更したい値にしてOKで抜けていく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/188a6d79-2a71-fe4c-b7c5-ea563c6122c6.png)

尚、調子に乗ってFHD(1920x1080)を試してエラーが出たのでさらにGPU割り当てを増やしたら起動に影響がでた。
結果は以下。

|GPU Mem|起動成否|
|---|---|
|default|QVGAサイズのアップロードができた|
|128|HDサイズのアップロードができた|
|160|Wi-Fiはping応答あるがSSHで接続できず|
|192|起動できていないのかWi-Fi/SSHの応答が一切ない|

(追記)
よくみたらカメラの1920x1080のときのフレームレートが5か30だった、フレームレートを10から5に変更したらアップロードできた。ついでにフレームレート安定用の「framerate=5 frame-timecodes=false」も入れておいた。

```
gst-launch-1.0  v4l2src device=/dev/video0 ! "image/jpeg,width=320,height=240,framerate=5/1" ! queue ! jpegparse ! v4l2jpegdec ! v4l2h264enc ! 'video/x-h264,level=(string)4' ! h264parse ! kvssink stream-name="MyKinesisVideoStream" framerate=5 frame-timecodes=false access-key="アクセスキー" secret-key="シークレットアクセスキー" aws-region="ap-northeast-1" 
```

カメラの性能は以下
$ v4l2-ctl -d /dev/video0 --list-formats-ext
```
～略～
[0]: 'MJPG' (Motion-JPEG, compressed)

Size: Discrete 1920x1080
         Interval: Discrete 0.033s (30.000 fps)
         Interval: Discrete 0.200s (5.000 fps)
         Interval: Discrete 0.033s (30.000 fps)
         Interval: Discrete 0.200s (5.000 fps)
～略～
```

# 4.2. YUV->H.264
（未）

# 5. その他AWSの下記の箇所で確認可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1865486/f71a55a2-12b8-6078-0ea1-a36a25ab7803.png)

【参考】

https://qiita.com/tetsuoMikami/items/d9fa860cab026ba36690

# 6. まとめ
~~メモリを節約したり、映像のビットレートなどを絞ればFHDも可能かもしれない。~~
とりあえず安定して動きそうなのはHDサイズ。