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


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

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

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

環境

  • 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カメラモジュール

こんなカメラ

シリアルケーブルでここに差してます

事前準備

AMAZON KINESIS VIDEO STREAMS ハンズオン
を参考にしました。ラズパイ版なので必要なところだけピックアップしています。

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 プラグイン より引用
gstreamer からkvssinkで送るイメージ

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のコンソールを開きます

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

今回はビデオストリーム名にkvs-stream-test と入れ、後はデフォルトのまま行きます。

こんな感じでできます。

ビデオストリームを削除したい場合は、左メニューのビデオストリームから一覧を表示してチェックボックスを入れて削除。

ストリーム配信

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 のカメラからビデオをストリーミングする のような例では

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日間保存されます。このプレイヤーでは時間指定で再生することもできます。

まとめ

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