Jetson NanoにつないだMIPIカメラからAWS kinesis video streamsに動画配信してみた

こんな人向けの記事です。

 + Kinesis video streams を試してみたい
 + Jetson nanoにUSBカメラじゃなくてMIPI Cameraを繋いだけどなんかうまくいかなかった


構成はシンプルですがこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001712/330b4800-d63f-d2e1-c4e7-d2f5a5bf5fe8.png)


#環境
+ NVIDIA Jetson Nano 開発者キット B01
 - Ubuntu 18.04.5 LTS
 - jet pack 5.1
 - aws-cli/1.19.25 Python/3.6.9 Linux/4.9.201-tegra botocore/1.20.25
+ SainSmart IMX219カメラモジュール

こんなカメラ
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001712/b493eae0-b15a-8e26-e1aa-e4a37b3ce5a8.jpeg)

シリアルケーブルでここに差してます
![image-446bee24-c9c7-4c25-8d14-5e2f2c1f5c4d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001712/9dabe342-79e2-a0bb-b91d-174b44f12aee.jpeg)


## 事前準備
[AMAZON KINESIS VIDEO STREAMS ハンズオン](https://video-streaming-and-analysis.workshop.aws/)
を参考にしました。ラズパイ版なので必要なところだけピックアップしています。

### 1. ライブラリのインストール

```
sudo apt update
sudo apt install -y automake build-essential cmake git pkg-config libgstreamer-plugins-base1.0-dev 
```

### 2. v4l-utilsのインストール
　※なくてもいけます。カメラがつながっているか確認するためにあると便利

```
$ sudo apt-get install v4l-utils
```

### 3. GStreamer 用のPlugin　kvssink　のビルド

「GStreamer」は、多数のカメラやビデオソースで使用される一般的なメディアフレームワークです。モジュラープラグインを組み合わせてカスタムのメディアパイプラインを作成できます
[例: Kinesis ビデオストリーム プロデューサー SDK GStreamer プラグイン](https://docs.aws.amazon.com/ja_jp/kinesisvideostreams/latest/dg/examples-gstreamer-plugin.html) より引用
gstreamer からkvssinkで送るイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001712/d3e345ff-c467-85fa-e1ab-720bfd616643.png)


AMAZON KINESIS VIDEO STREAMS PRODUCER SDK C++　をダウンロードしてbuildします。

###### SDKのダウンロード

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

+ ハマりポイント  
 Ubuntu Desktop を設定していると、「ドキュメント」のようなディレクトリが作られますが、そこに落としてきた場合、cmakeがうまくいきませんでした。homeディレクトリでやるのがよさそうです。

###### cmake で依存ライブラリのダウンロードとMakefile作成

```
mkdir -p ~/amazon-kinesis-video-streams-producer-sdk-cpp/build
cd ~/amazon-kinesis-video-streams-producer-sdk-cpp/build
cmake -DBUILD_GSTREAMER_PLUGIN=ON ..
```

###### ビルド
```
make
```


### 4. 一時認証情報の取得

AWS CLI から AWS STS (AWS Security Token Service）で一時認証情報を取得します。3時間のTOKENです。
※aws cli のプロファイル設定は省略します。

``` 
aws sts get-session-token
``` 

このようなクレデンシャルが返ってきます。

``` 
{
    "Credentials": {
        "AccessKeyId": "...................................",
        "SecretAccessKey": "...................................",
        "SessionToken": "...................................",
        "Expiration": "2021-05-20T23:50:40Z"
    }
}
``` 

環境変数を設定します。

```
export AWS_DEFAULT_REGION=利用するリージョン (us-east-2 など)
export AWS_ACCESS_KEY_ID=AccessKeyId の値
export AWS_SECRET_ACCESS_KEY=SecretAccessKey の値
export AWS_SESSION_TOKEN=SessionToken の値
```

### 5. kinesis video streams でストリームの作成

[Amazon Kinesis Video Streams](https://console.aws.amazon.com/kinesisvideo/home#/dashboard)のコンソールを開きます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001712/7a2d28ed-dbff-d14e-ad19-5a5537776de5.png)

ビデオストリームの作成をクリックしてストリームを作成します。

今回はビデオストリーム名にkvs-stream-test　と入れ、後はデフォルトのまま行きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001712/8e437f30-b913-2d27-9191-86494b72637f.png)

こんな感じでできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001712/718f55e7-dd7c-318a-739b-d961568189d8.png)


ビデオストリームを削除したい場合は、左メニューのビデオストリームから一覧を表示してチェックボックスを入れて削除。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001712/8c650290-05ec-bf9c-d2ed-3c54565cc77c.png)


## ストリーム配信

Gstreamer を起動してストリーム配信します。
stream-nameにはビデオストリームの作成で作った名前を入れてください。

```
$gst-launch-1.0 nvarguscamerasrc sensor_mode=0 ! 'video/x-raw(memory:NVMM),width=640, height=480, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! nvv4l2h264enc ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline ! kvssink stream-name=kvs-stream-test
```

+ ハマりポイント  

[例 6: Raspberry Pi のカメラからビデオをストリーミングする](https://docs.aws.amazon.com/ja_jp/kinesisvideostreams/latest/dg/examples-gstreamer-plugin.html)　のような例では

``nvarguscamerasrc``
ではなく
``v4l2src``
を使った例が載っています。これだとjetsonではうまくいきませんでした。

##### v4l2 に関する整理
 - v4l2（Video for Linux Two）とは、ビデオキャプチャデバイスを扱うAPIの仕様の名前  
 - v4l2　が使えるかどうか　はカメラのデバイスドライバによる  
 - USBカメラだとuvc（USB Video class）のドライバ、Driver name   : uvcvideo　などで動いており、v4l2に対応している。uvcのドライバはLinuxで標準で入っている。  
 - jetsonにシリアルケーブルで接続するカメラのドライバは、NVIDIAのtegra-videoであるが、これがv4l2に対応していない。  
※ラズパイならMPI CSIカメラでもv4l2が動いているような記事を見ているので、JetsonのMIPI-CSIカメラだとうまくいかない　という問題だったと思われる。


##### 配信動画を見るには
AWS コンソールの「メディア再生」を開くとこのようにJetsonカメラからのstreaming映像が表示されます。
デフォルトでは1日間保存されます。このプレイヤーでは時間指定で再生することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001712/ac7e150f-0749-cc56-15cc-0dbb862c509b.png)



## まとめ
 + jetson につないだMIPIカメラからgstreamer + kvssink （kinesis video streams Plug in)でカメラ映像を配信
 + v4l2 は標準のnvidiaカメラドライバは対応していないので、v4l2srcではない別のものを使う