[Kinesis Video Streams] Jetson Nano上で各種ソースからの動画のアップロード 〜 kvssinkを利用する場合のGStreamerの使用方法
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編)