[Kinesis Video Streams] Jetson Nano上で各種ソースからの動画のアップロード 〜 kvssinkを利用する場合のGStreamerの使用方法

2021.02.22

1 はじめに

CX事業本部の平内(SIN)です。

Kinesis Video Streamsでは、プロデューサーの一つとして、標準的なストリーミング管理ライブラリであるGStreamerのプラグインとして利用可能なシンクエレメント(kvssink)が提供されています。

参考:例: Kinesis ビデオストリーム プロデューサー SDK GStreamer プラグイン

GStreamerでは、gst-launch-1.0を使用して、コマンドラインから軽易に下記のような構成を実現することが可能になります。

各種リソース ->  フィルタ、変換など -> kvssink -> Kinesis Video Streasms

今回は、Jetson Nano上で、kvssinkを構成する方法及び、各種の入力を利用する方法について纏めたいと思います。

2 kvssink

kvssinkのコンパイルの手順は、以下のとおり
Amazon Kinesis Video Streams CPP Producer, GStreamer Plugin and JNI

git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git
cd amazon-kinesis-video-streams-producer-sdk-cpp
mkdir build
cmake -DBUILD_GSTREAMER_PLUGIN=ON ..
make -j4

buildディレクトリでlibgstkvssink.soができていればOK

$ ls -la libgstkvssink.so
-rwxrwxr-x 1 nvidia nvidia 535056  2月 20 13:42 libgstkvssink.so

libgstkvssink.soのパスを環境変数に入れることで使用可能になります。

export GST_PLUGIN_PATH=`pwd`/build
export LD_LIBRARY_PATH=`pwd`/open-source/local/lib

以下のように、kvssinkが表示出れば準備完了です。

$ gst-inspect-1.0 kvssink
Factory Details:
  Rank                     primary + 10 (266)
  Long-name                KVS Sink
  Klass                    Sink/Video/Network
  Description              GStreamer AWS KVS plugin
  Author                   AWS KVS <kinesis-video-support@amazon.com>

Plugin Details:
  Name                     kvssink
  Description              GStreamer AWS KVS plugin
  Filename                 /home/nvidia/kvs/amazon-kinesis-video-streams-producer-sdk-cpp/build/libgstkvssink.so
  Version                  1.0
  License                  Proprietary
  Source module            kvssinkpackage
  Binary package           GStreamer
  Origin URL               http://gstreamer.net/

3 Jetson Nano上での入力ソース

続いて Jetson Nano上で、いくつかの動画リソースについて確認してみます。

ここでは、いきなりkvssinkに出力すると、その確認が、やや複雑になるため、画面で動画を確認するだけとし、出力先にxvimagesinkを利用します。 xvimagesinkは、RaspberryPiやMacでのautovideosinkと同じようなデスクトップウインドウへの出力するシンクです。

(1) テスト入力

テストパターンの入力元となるvideotestsrcを入力として、xvimagesink に出力する場合は下記のようになります。静止画にも見えますが、右下の砂嵐を見ると動画であることを感じられます。

gst-launch-1.0 videotestsrc ! xvimagesink

(2) USB接続のWebカメラ

v4l2srcで認識できているため、デバイスIDを指定して利用可能です。デバイスのパス(/dev/video??)は、カメラの接続数、接続順などによって変化します。

gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw, width=640, height=480 ! xvimagesink

(3) RTSPサーバ

RTPSサーバからの入力は、rtspsrcエレメントで受けることができます。RTPSサーバでは、H264へのエンコードが終わっているので、decodebinで逆に戻しています。

$ gst-launch-1.0 rtspsrc location=rtsp://192.168.0.119 sync=false ! decodebin ! nvvidconv ! xvimagesink

※RTSPサーバは、Live-Reporter - 監視カメラ https://apps.apple.com/jp/app/live-reporter-監視カメラ/id996017825をiPhoneにインストールして利用させて頂きました。

4 kvssinkでの送信

kvssinkは、h264で、stream-format=avc,alignment=auな入力を要求するため、シンクに送る前に、以下のように、h264parseで、パースします。

h264parse ! video/x-h264,stream-format=avc,alignment=au ! kvssink stream-name="STREAM_NAME" access-key="xxxxxxx" secret-key="xxxxxxx"  aws-region="ap-northeast-1"

また、入力が、h264にエンコードされていない場合、Jetson Nano では nvv4l2h264encを使用します。

上記を参考に、入力を、kinesis Video Streamsに送る場合のコマンドラインは、以下のようになります。 なお、以下、アクセスキーなどは、コマンドラインからのパラメータから省略するため、環境変数にセットしています。

export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

(1) テスト入力

gst-launch-1.0 videotestsrc ! nvvidconv ! nvv4l2h264enc ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline ! kvssink stream-name=Test_1

(2) USB接続のWebカメラ

gst-launch-1.0 -e v4l2src device=/dev/video0 ! video/x-raw, width=640, height=480 ! nvvidconv ! nvv4l2h264enc ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline ! kvssink stream-name=Test_2

(3) RTSPサーバ

ここでは、RTSPサーバでh264にエンコードされたデータをrtph264depayでそのまま使用しています。

gst-launch-1.0 rtspsrc location=rtsp://192.168.0.119 short-header=TRUE ! rtph264depay ! video/x-h264, format=avc,alignment=au ! h264parse ! kvssink stream-name=Test_5

5 最後に

個人的には、kvssinkが利用できるようにする準備や、GStreamerの各種エレメントを使いこなすのは、結構難しいと感じています。

下記は、今回と同じ作業を、他の環境で行ったものです。 微妙にエレメントが違うのでコピー&ペースト使えると助かるかも知れません。


[Kinesis Video Streams] Mac上で各種ソースからの動画のアップロード 〜 kvssinkを利用する場合のGStreamerの使用方法
[Kinesis Video Streams] Raspberry Pi 上で各種ソースからの動画のアップロード 〜 kvssinkを利用する場合のGStreamerの使用方法
[Kinesis Video Streams] Windows上で各種ソースからの動画のアップロード 〜 kvssinkを利用する場合のGStreamerの使用方法

また、以下は、各種環境で、kvssinkを利用できる環境構築についてです。
Amazon Kinesis Video Streamsを使ってストリーム映像をAWS上に流してみる【Raspberry Pi】– ClassmethodサーバーレスAdvent Calendar 2017 #serverless #adventcalendar #reinvent
Amazon Kinesis Video Streamsを使ってストリーム映像をAWS上に流してみる【MacBook Pro】– ClassmethodサーバーレスAdvent Calendar 2017 #serverless #adventcalendar #reinvent
Amazon Kinesis Video Streamsを使ってストリーム映像をAWS上に流してみる【Windows(MSVC)】
[Amazon Kinesis Video Streams] DockerイメージのプロデューサーライブラリでRTSPサーバの動画を配信してみました。
[Amazon Kinesis Video Streams] Dockerイメージのプロデューサーライブラリで動画配信(Raspberry Pi編)