産業用UVCカメラのすすめ 産業用UVCカメラのすすめ

Jetsonのハードウェアエンコーダを使って録画

概要

1920×1200pixelの解像度でカラーで30fpsのフレームレートのカメラを3台同時にNVIDIA Jetson NXで録画する方法について説明します。圧縮Codecは、H.265でビットレートは10Mbpsで圧縮しています。

検証機材

Jetson NX(Jetson Nano/AGXでも動作可能)
検証に利用したソフトウェア環境「Jetpack」のバージョンは4.6です。また、インストール済のライブラリなどは、以下の通りです。

$ uname -a
Linux argo-desktop 4.9.253-tegra #1 SMP PREEMPT Mon Jul 26 12:19:28 PDT 2021 aarch64 aarch64 aarch64 GNU/Linux

$ sudo apt show nvidia-jetpack
Package: nvidia-jetpack
Version: 4.6-b199
Priority: standard
Section: metapackages
Maintainer: NVIDIA Corporation
Installed-Size: 199 kB
Depends: nvidia-cuda (= 4.6-b199), nvidia-opencv (= 4.6-b199), nvidia-cudnn8 (= 4.6-b199), nvidia-tensorrt (= 4.6-b199), nvidia-visionworks (= 4.6-b199), nvidia-container (= 4.6-b199), nvidia-vpi (= 4.6-b199), nvidia-l4t-jetson-multimedia-api (>> 32.6-0), nvidia-l4t-jetson-multimedia-api (<< 32.7-0)
Homepage: http://developer.nvidia.com/jetson
Download-Size: 29.4 kB
APT-Sources: https://repo.download.nvidia.com/jetson/t194 r32.6/main arm64 Packages
Description: NVIDIA Jetpack Meta Package

カメラの接続確認

①USB カメラの接続確認
Jetson NXのUSB 3.0ポートにUSBカメラを接続した後、下記のコマンドを入力し、接続確認します。

argo@argo-desktop:~$ tcam-ctrl -l
Model: DFK 38UX253 Serial: 45120952 Type: v4l2
Model: DFK 38UX253 Serial: 45120952 Type: aravis

②対応フォーマットの確認
次に、カメラが対応している動画フォーマットを確認します。今回使用したカメラの対応フォーマットは以下の通りです。 4K(3840×2160)はもちろん、フルHD(1920×1080)等にも対応しています。

argo@argo-desktop:~$ tcam-ctrl -c 45120952
Available gstreamer-1.0 caps:
video/x-bayer,format=rggb,width=4096,height=3000,framerate={30/1,15/1,5/1,1/1};
video/x-bayer,format=rggb,width=4096,height=2160,framerate={42/1,30/1,15/1,5/1,1/1};
video/x-bayer,format=rggb,width=3840,height=2160,framerate={44/1,30/1,15/1,5/1,1/1};
video/x-bayer,format=rggb,width=1920,height=1080,framerate={87/1,60/1,30/1,15/1,5/1,1/1};
video/x-bayer,format=rggb,width=640,height=480,framerate={188/1,120/1,60/1,30/1,15/1,5/1,1/1};
video/x-raw,format=YUY2,width=4096,height=3000,framerate={15/1,5/1,1/1};
video/x-raw,format=YUY2,width=4096,height=2160,framerate={21/1,15/1,5/1,1/1};
video/x-raw,format=YUY2,width=3840,height=2160,framerate={22/1,15/1,5/1,1/1};
video/x-raw,format=YUY2,width=1920,height=1080,framerate={87/1,60/1,30/1,15/1,5/1,1/1};
video/x-raw,format=YUY2,width=640,height=480,framerate={188/1,120/1,60/1,30/1,15/1,5/1,1/1};
video/x-raw,format=BGR,width=4096,height=3000,framerate={10/1,5/1,1/1};
video/x-raw,format=BGR,width=4096,height=2160,framerate={14/1,5/1,1/1};
video/x-raw,format=BGR,width=3840,height=2160,framerate={15/1,5/1,1/1};
video/x-raw,format=BGR,width=1920,height=1080,framerate={60/1,30/1,15/1,5/1,1/1};
video/x-raw,format=BGR,width=640,height=480,framerate={188/1,120/1,60/1,30/1,15/1,5/1,1/1}

Jetsonのハードウェアエンコードを使ったパイプライン

gst-launch-1.0 -e tcambin ! nvvidconv ! nvv4l2h265enc ! h265parse !  qtmux ! filesink location=Video_h265HW.mp4
そもそも動画化するためにはカメラから送られてくる画像をつなぎ合わせるのですが、そのままつなぎ合わせると動画サイズが大きくなってしまいます。
そのためコーデックと呼ばれる動画圧縮アルゴリズムを使用します。なお、コーデックでは動画保存するときにデータの圧縮(エンコード)、動画再生するときにデータ復元(デコード)をします。カメラから送られてくるデータの圧縮をするのにCPUの処理負荷がかかりますが、JetsonではGPU搭載がされているためGPUを利用してエンコード(ハードウェアエンコード)を行うことが可能です。 このハードウェアエンコードを行うことでCPUへの負荷が軽く抑えられます。
Gstreamer(gst-launch)を使った動作確認は、フル解像度(4096×3000)の動画に対して、H.265のコーデックを利用し、ハードウェアエンコーダを使います。mp4にデータ保存する場合は、gst-launch-1.0に -eオプションをつけておく必要があります。そうでないとCtrlCで止めたときに中途半端に切れたmp4ファイルができて再生不能になります。CtrlCで中断できない場合はCtrlAltCを同時に押してください。結果を確認すると4096×3000@15fpsで撮影できています。
なお、それぞれのプラグインは下記の通りです。
プラグイン/エレメント 説明
tcambin TISが提供しているGstreamerプラグインで、tiscameraでサポートされているすべてのGstreamerの要素をラップしオールインワンで簡単に処理できるようにしています。
nvvidconv NVIDIA独自のプラグイン。H.265の変換処理するためのフォーマット変換、スケーリング処理をします。
nvv4l2h265enc NVIDIA独自のプラグイン。NVIDIAのアクセラレータを使ったV4l2 H.265のビデオエンコーダーです。
iframeinterval フレーム内発生頻度のエンコードします。
h265parse MP4コンテナに格納するためにH.265ストリームを変換します。
qtmux MP4コンテナに格納する場合、qtmuxエレメントを使用します。
filesink ファイルへの書き込みをします。
tcambinによってTheImagingSource社のカメラのフレームを取り込み、ハードウェアエンコードをするためにnvvidconvでフォーマットを変更し、nvv4l2h265encでH.265のエンコードを行っています。
エンコード後にmp4の形式で保存するためにh265parseで変換し、filesinkでファイルの書き込みを行います。

結果

nvbuf_utils: Could not get EGL display connection
パイプラインを一時停止 (PAUSED) にしています...
Opening in BLOCKING MODE 
Pipeline is live and does not need PREROLL ...
情報:
Working with src caps: video/x-raw, framerate=(fraction)15/1, width=(int)4096, height=(int)3000, format=(string)YUY2
パイプラインを再生中 (PLAYING) にしています...
New clock: GstSystemClock
Redistribute latency...
NvMMLiteOpen : Block : BlockType = 8 
===== NVMEDIA: NVENC =====
NvMMLiteBlockCreate : Block : BlockType = 8 
NVMEDIA: H265 : Profile : 1 
NVMEDIA_ENC: bBlitMode is set to TRUE 
^[^Chandling interrupt.
割り込み: パイプラインを停止しています...
EOS on shutdown enabled -- Forcing EOS on the pipeline
Waiting for EOS...
Got EOS from element "pipeline0".
EOS received - stopping pipeline...
Execution ended after 0:00:30.407895489
パイプラインを一時停止 (PAUSED) にしています...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
argo@argo-desktop:~$ mediainfo Video_h265HW.mp4 
General
Complete name                            : Video_h265HW.mp4
Format                                   : MPEG-4
Format profile                           : QuickTime
Codec ID                                 : qt   2005.03 (qt  )
File size                                : 13.3 MiB
Duration                                 : 29 s 403 ms
Overall bit rate                         : 3 789 kb/s
Encoded date                             : UTC 2022-03-02 04:01:54
Tagged date                              : UTC 2022-03-02 04:02:25

Video
ID                                       : 1
Format                                   : HEVC
Format/Info                              : High Efficiency Video Coding
Format profile                           : Main@L6@Main
Codec ID                                 : hvc1
Codec ID/Info                            : High Efficiency Video Coding
Duration                                 : 29 s 403 ms
Bit rate                                 : 3 788 kb/s
Maximum bit rate                         : 22.8 Mb/s
Width                                    : 4 096 pixels
Height                                   : 3 000 pixels
Display aspect ratio                     : 4:3
Frame rate mode                          : Variable
Frame rate                               : 15.033 FPS
Minimum frame rate                       : 2.336 FPS
Maximum frame rate                       : 41.667 FPS
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.021
Stream size                              : 13.3 MiB (100%)
Encoded date                             : UTC 2022-03-02 04:01:54
Tagged date                              : UTC 2022-03-02 04:02:25
Color primaries                          : BT.2020
Matrix coefficients                      : BT.2020 non-constant

(動作検証)JetsonNXでTISのUSB3.0カメラを圧縮しながら3台同時録画

TIS社のDFK33UR0234(USB3.0カラーFHDカメラ)3台とJetsonNXの開発キットを使って圧縮しながら同時録画が可能です。 カメラは、それぞれ解像度1920x1200pixel(カラー)、30fps、圧縮CodecはH.265のNvidiaのハードウェアエンコードです。 ターミナルをそれぞれカメラ毎に起動し下記を実行します。
ターミナル1:
gst-launch-1.0 -e tcambin serial=<カメラ1台目のシリアルナンバー> ! video/x-raw,framerate=30/1,width=1920,height=1200 ! nvvidconv ! nvv4l2h265enc iframeinterval=30 bitrate=10000000 ! h265parse ! qtmux ! filesink location=Video_h265HW1.mp4
ターミナル2:
gst-launch-1.0 -e tcambin serial=<カメラ2台目のシリアルナンバー> ! video/x-raw,framerate=30/1,width=1920,height=1200 ! nvvidconv ! nvv4l2h265enc iframeinterval=30 bitrate=10000000 ! h265parse ! qtmux ! filesink location=Video_h265HW2.mp4
ターミナル3:
gst-launch-1.0 -e tcambin serial=<カメラ3台目のシリアルナンバー> ! video/x-raw,framerate=30/1,width=1920,height=1200 ! nvvidconv ! nvv4l2h265enc iframeinterval=30 bitrate=10000000 ! h265parse ! qtmux ! filesink location=Video_h265HW3.mp4

プラグインのプロパティ設定をすることで下記を固定化しています。
・シリアルナンバー
・解像度:1920×1200
・フレームレート:30fps
・インターバル:30
・ビットレート:10,000,000(10M) bps

それぞれのプラグイン、エレメントの説明は以下の通りです。
プラグイン/エレメント 説明
tcambin TISが提供しているGstreamerプラグインで、tiscameraでサポートされているすべてのGstreamerの要素をラップしオールインワンで簡単に処理できるようにしています。シリアル番号を明記します。
video/x-raw,framerate=30/1,width=1920,height=1200 ビデオフォーマットとフレームレート、解像度を設定します。
nvvidconv H.265の変換処理するためのフォーマット変換、スケーリング処理です。
nvv4l2h265enc プロパティ:iframeinterval
圧縮されていないフレームが差し込まれる間隔。Iframeintervalの値が小さいほど、動画の早送り・巻き戻しがサクサクできる(ただしファイルサイズが大きくなる)

プロパティ:bitrate
ビットレートは1秒間に何ビットのデータを保存するかを表しています。ここでは、ビットレートは10,000,000(10M) bpsに設定していますので、理論的には1秒間に1.25MB(10M/8)のデータ量が作成されることになります。(ただし、撮影対象物や録画時間によって、実際の保存容量は理論値から変動します。)ビットレートを高く設定すると、ブロックノイズが減り綺麗な動画を得られますが、録画容量が大きくなります。一方で、ビットレートを小さく設定すると、画質は犠牲になりますが、録画容量が小さくなります。従って、長時間録画したい場合は、録画容量を低く抑える為に最低限の画質を確保しながらビットレートを低く設定するようにしてください。
h265parse MP4コンテナに格納するためにH.265ストリームを変換します。
qtmux MP4コンテナに格納する場合、qtmuxエレメントを使用します。
filesink ファイルへの書き込みをします。 location=Video_h265HW3.mp4でファイル名を指定しています。