はじめに
このブログではJetson nanoを用いて4K動画を撮影する記事をいくつか掲載していますが、今回はJetson nanoで撮影した動画をAmazon Kinesis Videoに配信する方法をまとめます。
前回の記事で、Jetson nanoではGPUをフルに使っても、4K動画のライブキャリブレーション(魚眼レンズのリアルタイム画像補正)ができない事を書きましたが、Jetson nanoでダメであれば動画をクラウドに上げて高速なGPUを使って、処理しようという作戦です。
用意するもの
①ボードコンピュータ
今回の主役Jetson nanoです。Jetson nanoは安価な2GBモデルが発表になりましたが、今回は従来からある4Gモデルを利用します。
②魚眼レンズ付きカメラモジュール
魚眼レンズ付きカメラモジュールです。今回は180度まで撮影可能な以下のカメラを使います。USB接続で、4K@30fps(MJPG)までの動画撮影にも対応しています。
③AWSアカウント
今回は、AWS上のKinesis Video Streamsを使うので、AWSのアカウントが必要です。
必要なものは、以上の3点です。
Amazon Kinesis Video Streamsへの配信
Jetson nanoで撮影した動画をAmazon Kinesis Video Streamsへ配信するためには、配信側であるJetson nanoの設定と、受信側であるAWSの両方の設定が必要です。
Jetson nano(配信側)の設定
動画の配信側であるJetson nanoでは、GStreamerプラグインであるkvssinkエレメントを使ってkinesis Video Streamに動画を配信します。
①kinesis-video-streams-parser-libraryのダウンロード
まずは、kvssinkのソースコードを含むamazon-kinesis-video-streams-parser-libraryをダウンロードします。
1 2 3 4 |
$mkdir kvssink $cd kvssink $git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp $ |
②必要なライブラリのインストール
次に必要なライブラリをインストールします。私の場合には、全て元々入っていました。
1 2 3 |
$sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev gstreamer1.0-plugins-base-apps $sudo apt-get install gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-tools $ |
③cmake
次にcmakeします。GStreamerプラグインのオプション「-DBUILD_GSTREAMER_PLUGIN=ON」をつけるのがポイントです。cmakeには30分ぐらいかかるので、気長に待ちましょう😊
また、以前のバージョンではインストールスクリプトがあったようですが、最近のバージョンはcmakeに変わっているようです。その情報がAmazonの公式ページにも無かったので、ここにまとめておきます。
1 2 3 4 5 6 |
$cd amazon-kinesis-video-streams-producer-sdk-cpp $mkdir build $cd build $cmake -DBUILD_GSTREAMER_PLUGIN=ON .. ・・・省略・・・ $ |
④make
cmakeが完了したらビルドします。こちらは1分ほどで完了します。
1 |
$make -j3 |
⑤ライブラリの確認
makeが完了したら、できあがったGStreamer用のライブラリファイルを確認しましょう。以下のように、「libgstkvssink.so」が作成されていればOKです。
1 2 3 4 |
$ls -l ・・・省略・・・ -rwxrwxr-x 1 test test 535056 10月 24 11:28 libgstkvssink.so |
⑥プラグインパスの設定
作成したプラグインをGStreamerから利用できるように、プラグインのパス「$GST_PLUGIN_PATH」を設定します。
1 2 3 4 |
$export GST_PLUGIN_PATH=$GST_PLUGIN_PATH:`pwd` $ echo $GST_PLUGIN_PATH :/home/test/kvssink/amazon-kinesis-video-streams-producer-sdk-cpp/build |
⑦プラグインの動作確認
それでは、kvssinkプラグインがGStreamerから利用できるか確認してみましょう。以下のようにgst-inspectコマンドで、kvssinkの情報が確認できればOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
$ 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/test/kvssink/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/ GObject +----GInitiallyUnowned +----GstObject +----GstElement +----GstKvsSink Pad Templates: SINK template: 'audio_%u' Availability: On request Capabilities: audio/mpeg mpegversion: { (int)2, (int)4 } stream-format: raw channels: [ 1, 2147483647 ] rate: [ 1, 2147483647 ] audio/x-alaw channels: { (int)1, (int)2 } rate: [ 8000, 192000 ] audio/x-mulaw channels: { (int)1, (int)2 } rate: [ 8000, 192000 ] SINK template: 'video_%u' Availability: On request Capabilities: video/x-h264 stream-format: avc alignment: au width: [ 16, 2147483647 ] height: [ 16, 2147483647 ] video/x-h265 alignment: au width: [ 16, 2147483647 ] height: [ 16, 2147483647 ] Element has no clocking capabilities. Element has no URI handling capabilities. ・・・以下省略・・・ |
以上で、Jetson nano(配信側)の設定は完了です。
Amazon Kinesis Video Streams(受信側)の設定
ここからは、受信側であるAmazon Kinesis Video Streamsの設定を行います。
①AWSマネジメントコンソールにログイン
まずは、AWSのマネジメントコンソールにログインしましょう。
②Kinesis Video Streamsサービスの選択
画面左上の「サービス」を選択し、サービス一覧から「Kinesis Video Streams」を選択します。
③ビデオストリームを作成
画面上にある「ビデオストリームを作成」ボタンをクリックします。リージョン選択の画面が出る場合には、お好きなリージョンを選びましょう。
④ビデオストリーム名の入力
作成するビデオストリームの名前を入力して「ビデオストリームを作成」ボタンをクリックします。このストリーム名は後で、コマンドラインからも利用するので英語で入力するのが良いでしょう。
⑤ビデオストリームの作成確認
以下のようにビデオストリームの管理画面が表示されればOKです。
⑥IAMユーザの追加
次に、Kinesis Video Streamsを利用するIAMユーザを追加します。サービス一覧から「IAM」を選択します。
⑦ユーザを追加
左側メニューから「ユーザ」を選択し、画面上の「ユーザを追加」ボタンをクリックします。
⑧ユーザ名の入力
ユーザの追加画面が表示されたら、ユーザ名を入力し「プログラムによるアクセス」にチェックして、画面右下の「次のステップ:アクセス権限」ボタンをクリックします。
⑨アクセス権限の設定
次に、このユーザにKinesis Video Streamのアクセス権限を設定します。
画面上の「既存のポリシーを直接アタッチ」をクリックします。次に、ポリシーの検索欄に「KinessVideo」と入力して検索し、出てきた「AmazonKinesisVideoSreamsFullAcess」のポリシーのチェックをつけます。最後に「次のステップ:タグ」ボタンをクリックします。
⑩タグの追加
タグの追加の画面では、特に何も設定する必要はありませんので、画面右下の「次のステップ:確認」ボタンをクリックします。
11.追加ユーザの確認
確認画面が表示されるので、ユーザ名、アクセス権限を確認し、「ユーザの作成」ボタンをクリックします。
12.キーの確認
ユーザが作成されると、アクセスキーIDとシクレットアクセスキーの2つが発行されるので、テキストエディタなどにメモします。後で、このキーを使ってJetson nanoから動画を配信します。
12.追加ユーザの確認
「閉じる」ボタンを押すと、新しいユーザが追加されていることが確認できます。
以上で、Kinesis Video Streams(受信側)の設定も完了です。
動画配信の実行
それでは、いよいよJetson nanoからKinesis Video Streamsへ動画を配信してみましょう。
①動画配信の実行
Jetson nanoから以下のコマンドを入力して、動画配信を開始します。なお、stream-nameは上で作成したKinesis Video Streamsのビデオストリーム名、access-keyとsecret-keyは、上でメモしたIAMユーザのキーに置き換えてください。
1 2 3 4 5 6 |
$gst-launch-1.0 -e v4l2src device=/dev/video0 io-mode=2 ¥ ! image/jpeg, width=800, height=600, framerate=30/1 ! nvv4l2decoder mjpeg=1 ¥ ! 'video/x-raw(memory:NVMM)' ! nvv4l2h264enc ! h264parse ¥ ! video/x-h264,stream-format=avc,alignment=au,profile=baseline ¥ ! kvssink stream-name=Test storage-size=512 ¥ access-key="XXXXXXXXXXX" secret-key="YYYYYYYYY" aws-region="ap-northeast-1" |
GStreamerのパイプラインのポイントとしては、カメラから取得したMJPG形式の動画をnvv4l2decodeで一旦デコードし、それを再度nvv4l2h264encを使ってh264にエンコードして、kvssinkに渡している点です。この処理はJetson nanoのハードウェアエンコーダ/デコーダを使うので高速に処理できます。
②動画配信の確認
Jetson nanoでコマンドを実行したら、先ほど作成したKinesis Video Steamsの画面を表示して、「▶︎メディア再生」をクリックします。
すると、以下のようにJetson nanoから配信された動画が表示されます‼️
以上で完了です。お疲れ様でした。
おわりに
今回は、Jetson nanoにGStreamerプラグイン「kvssink」をインストールし、AWSでKinesis Video Streamを設定して、Jetson nanoから動画を配信する方法をまとめました。
AWSに動画を配信できるようになったことで、Jetson nanoのGPUでは難しかった4K動画のリアルタイムキャリブレーションにクラウド上の高速なGPUを利用可能となりました。次は、AWS EC2上でGPUを使って、キャリブレーションを行うことにチャレンジしてみたいと思います。
関連記事
コメント