NVIDIA Jetson nanoで 4Kカメラは扱えるか?エンコード性能を徹底検証

スマートホーム
スポンサーリンク
このエントリーをはてなブックマークに追加

はじめに

前回は以下の記事で、Raspberry Pi 4Bで4Kカメラが扱えるかを検証しました。結論としては、Raspberry Pi 4Bに搭載のh264ハードウェアエンコーダはフルHD(1920×1080)までの対応のため、4K動画を扱うことは難しいことが分かりました。

そこで今回は、4Kまで対応したh264/h265ハードウェアエンコーダを搭載したNVIDIA Jetson nanoを用いて、4Kカメラが扱えるか調査しました。Jetson nanoを使うのは、初めてですので、もっと良い方法などがあれば、是非教えてください。

検証機材

今回の検証に利用した機材は以下の通りです。

①NVIDIA Jetson nano B01 開発キット

今回の検証の中心となるNVIDIAJetson nanoです。現在発売されている最新版のB01モデルを利用しました。

②4Kカメラモジュール

動画を撮影する4Kのカメラモジュールです。Cameraコネクタに接続するタイプではなく、USBタイプで、Linuxから扱えるUVCに対応したものです。

③ソフトウェア環境

検証に利用したソフトウェア環境「Jetpack」のバージョンは4.4です。また、インストール済のライブラリなどは、以下の通りです。

カメラ性能の検証

まずは、4Kカメラの確認&検証を行います。

①USB 4Kカメラの接続確認

Jetson nanoのUSB 3.0ポートにUSBカメラを挿し、接続確認します。今回使用したカメラは以下のように認識されました。 lsusbでは、メーカ名が表示されない😭まあ、認識されているので良し。

②v4l2-ctlで確認

UVC接続のUSBカメラは、Linuxでは「v4l2」というドライバを経由して制御します。そこでv4l2経由でカメラの情報を確認します。ちゃんと「HD USB CAMERA」として/dev/video0で認識されています。あれ?Raspbery Piではvideo0とvideo1の2つで認識されていたが、Jetson nanoでは1つしか認識されない。まあ、2個もいらないしOK 😁

③対応フォーマットの確認

次に、カメラが対応している動画フォーマットを確認します。今回使用したカメラの対応フォーマットは以下の通りでした。4Kカメラだけに、4K(3840×2160)はもちろん、フルHD(1920×1080)等にも対応しています。また、フォーマットは「’MJPG’ (Motion-JPEG, compressed)」と「’YUYV’ (YUYV 4:2:2)」に対応しています。ただ、4Kの対応はMJPGのみ!これが後に大きな問題に・・・。

④カメラ性能の検証

それでは、カメラ性能について検証していきます。この検証は、単純にカメラから4Kのデータが取得できるかというもので、いわばUSB3.0ポートの性能検証の意味合いです。

■フルHD(1920×1080)での検証結果

30fps程度のフレームレートが出ており、問題なし!

■4K(3840×2160)での検証結果

4Kでもちゃんと30fps程度のフレームレートが出ており、問題なし!

以上でカメラ性能の検証は完了です!!結論は問題なし!ということで、Jetson nanoでも4Kカメラの動画を取得して、それを画面に表示することは問題なく(30fpsでは)できます

エンコード性能の検証

ここからが本題、エンコード性能の検証を行います。今回は、4Kカメラで撮影した動画をSDカード内に保存する処理で検証します。Jetson nanoは、ffmpegをサポートしていないので、gstreamerを使います。このgstreamer、非常に難解で、なんとなく理解するのに2週間かかりました💦

検証内容としては、フルHD(1920×1080)と4K(3840×2160)の動画に対して、h264とh265のコーデックを利用し、ハードウェアエンコーダを使った場合とソフトウェアエンコーダ(CPU)を使った場合を比較します。

また、4Kについては、カメラで撮影したMJPG動画をデコードするために、Jetson nanoに搭載されたハードウェアjpegデコーダ(NVJPG)を用いた場合と、用いない場合を比較します。

CPU使用率、周波数、温度、ハードウェアエンコーダの利用状況については、「JTOP」を使用して測定しています。

フルHD動画の測定結果

4K動画の前に、まずはフルHD動画の測定結果からです。

①h264エンコード性能

■フルHD (1920×1080)x264(ソフトウェアエンコード:1CPU)

Jetson nanoのCPU(1個)を使ったx264動画圧縮(ソフトウェアエンコード)の測定結果です。fps=4.4という結果となり、実用的ではありません。

 fps=4.384
 CPU=100%、14%、12%、19%

■フルHD(1920×1080)x264(ソフトウェアエンコード:4CPU)

Jetson nanoのCPU(4個)をフルに使ったx264動画圧縮(ソフトウェアエンコード)の測定結果です。fps=8.2という結果です。CPU1個の場合と比較して2倍程度にはなりましたが、4倍にはなりません。

 fps=8.229
 CPU=100%、100%、98%、100%

■フルHD(1920×1080)nvv4l2h264enc(ハードウェアエンコード)

Jetson nanoに搭載されたハードウェアエンコーダを利用したh264動画圧縮の測定結果です。ハードウェアエンコードが効いて、CPUをほとんど使わず、ほぼ30fpsが出ています❗️

JTOP画面の左下「NVENC」の欄にも192MHzと表示されており、ハードウェアエンコーダを使っていることも確認できます。

 fps=29.768
 CPU=73%、2%、0%、9%

②h265エンコード性能

■フルHD(1920×1080)x265(ソフトウェアエンコード:1CPU)

Jetson nanoのCPU(1個)を使ったx265動画圧縮(ソフトウェアエンコード)の測定結果です。CPU1つでがんばって、fps=2.7という結果です。さらに、x265はマルチスレッドのオプションが無いのでこれが限界です。まあ、使い物になりません。

 fps=2.749
 CPU=14%、10%、16%、100%

■フルHD(1920×1080)nvv4l2h265enc(ハードウェアエンコード)

次に、h265の圧縮性能です。Jetson nanoに搭載されたハードウェアエンコーダを利用した場合の測定結果です。ハードウェアエンコードが効いて、CPUをほとんど使わず、ほぼ30fpsが出ています。さすがです!

 fps=29.779
 CPU=75%、5%、5%、8%

638

4K動画の測定結果

いよいよ本題の4K動画の測定結果です。

①h264エンコード性能

■4K(3840×2160)x264(ソフトウェアエンコード:4CPU)

Jetson nanoのCPU(4個)をフルに使ったx264動画圧縮(ソフトウェアエンコード)の測定結果です。fps=3.7という結果です。やはりソフトウェアエンコードでは辛いですね。

 fps=3.678
 CPU=100%、98%、86%、100%

■4K(3840×2160)nvv4l2h264enc(ハードウェアエンコード)

Jetson nanoに搭載されたハードウェアエンコーダを利用したh264動画圧縮の測定結果です。CPUをほとんど使わず、ハードウェアエンコーダも「396MHz」で動いていますが、10.8fps‼️

あれ?30fpsじゃないの?そう、30fps出ないんです💦原因はカメラから受信したMJPGをデコードする「jpegdec」の部分。ここがボトルネックになっているようです。

 fps=10.783
 CPU=30%、40%、15%、54%

■4K(3840×2160)nvv4l2h264enc(ハードウェアエンコード)with nvjpecdec

実はJetson nanoは、カタログには書いていないのですが、jpeg用のハードウェアデコーダ(NVJPG)を搭載しています。これを使って、カメラから受信したjpeg画像をデコードします。私はこれに気づくのに6日かかり、さらに上手く動かなくて「io-mode=2」オプションの利用を見つけるのに2日かかりました💦

いろいろがんばったが、測定結果は、17.8fpsという結果😭JTOP画面で、ちゃんとNVJPGを使っていることは確認できているのですが、30fps出ないのです。

 fps=17.849
 CPU=17%、72%、10%、6%

■4K(3840×2160)nvv4l2h264enc(ハードウェアエンコード)with nvv4l2decoder

4K動画の撮影を挫折仕掛けていましたが、ダメモトでNVIDIA forumで質問したら親切な方が教えてくれました‼️この方法は、どこにも書いていないのですが、カメラからの入力をJPEG画像ではなくMJPG動画として扱い、NVJPGデコーダを使ってデコードします!

そして!測定結果は、29.6fpsという結果‼️‼️出ました30fps😍

 fps=29.556
 CPU=31%、14%、24%、18%

②h265エンコード性能

■4K(3840×2160)x265(ソフトウェアエンコード:1CPU)

h265の場合も、まずはJetson nanoのCPU(1個)を使ったx265動画圧縮(ソフトウェアエンコード)の測定結果です。fps=9.781という結果です。まあ、CPUでは辛いですよね。

 fps=9.781
 CPU=100%、4%、11%、6%

638

■4K(3840×2160)nvv4l2h265enc(ハードウェアエンコード)

h265ハードウェアエンコーダを利用した場合の測定結果です。ハードウェアエンコードが効いていますが、10fpsですね。JPEGデコードボトルネックです。

 fps=10.716
 CPU=22%、12%、76%、30%

■4K(3840×2160)nvv4l2h265enc(ハードウェアエンコード)with nvjpegdec

NVJPGデコーダとh265エンコーダを併用した、h265圧縮性能の測定結果です。結果は、fps=17.6という結果。やはりnvjpegdecでは、30fpsでません😭

 fps=17.551
 CPU=46%、48%、18%、19%

■4K(3840×2160)nvv4l2h265enc(ハードウェアエンコード)with nvv4l2decoder

NVJPGエンコーダとh265エンコーダを併用し、nvv4l2decoderを用いたの測定結果です‼️結果は、fps=29.6という結果‼️h265でもちゃんと30fpsでました😀

 fps=29.602
 CPU=19%、16%、9%、10%

測定結果サマリー

測定条件を変えながら実機検証した、4K動画とフルHD動画の測定結果のサマリーです。

おわりに

NVIDIA Jetson nanoで4K動画がどこまで扱えるか、3840×2160@30fps、MJPG転送の4Kカメラと実機を使って検証してみました。フルHD動画についてはh265/h265ハードウェアエンコーダが使え問題なし!という結論です。

4K動画についても、結論としてはh264/h265ハードウェアエンコーダとjpegハードウェアデコーダを併用すれば問題なしです。ただし、MJPG転送のカメラでは、取得したMJPG動画をデコードする処理が非常に重く、この処理をjpegハードウェアデコーダに任せないと17fps程度しか出ません。

ただし、RAW画像の転送に対応したカメラであればh264/h265ハードウェアエンコーダにそのまま流せるので、この問題は発生しないはずです。ただ、3840×2160@30fps、RAW転送に対応したカメラは、日本のAmazonでは見つけれませんでした。

よって、Jetson nanoを使えば、4K@30fpsのh264/h265エンコード可能です!

関連記事

記事が参考になったら、ブログランキングに協力(クリック)して貰えると嬉しいです。

昼間はIT企業に勤めてますが、プライベートでは「育児×家事×IoT」をテーマに家のスマートホーム化に取り組んでいます。Androidアプリも作っているので使って下さい。質問・コメントは、↓のコメント蘭でもFacebookメッセンジャーでもどちらでも大丈夫です。
E-mail:naka.kazz.d@gmail.com

naka-kazzをフォローする
スマートホーム開発者向け
スポンサーリンク
naka-kazzをフォローする
スマートホーム×DIY

コメント

  1. 当方Jetson xavier NXを購入し、ウェブカメラC920を使って色々遊んでおりまして
    こちらの記事が大変参考になり感謝しております。
    つかぬことをお伺いしますが、こちらの項で紹介頂いているコマンドですが、
    >4K(3840×2160)nvv4l2h264enc(ハードウェアエンコード)with nvv4l2decoder

    私の手元で実行したところ確かに30fpsで録画が出来たのですが、動画に色ズレが発生してしまっていました。
    そちらでは撮影動画の画に問題は見られませんでしたか?

    gst-launch-1.0 -e v4l2src device=/dev/video0 io-mode=2 ! image/jpeg, width=1920, height=1080, framerate=30/1 ! nvv4l2decoder mjpeg=1 ! ‘video/x-raw(memory:NVMM)’ ! nvv4l2h264enc ! h264parse ! queue2 ! qtmux ! filesink location=4K_h264HW_nvv4l2decoder.mp4
    $mediainfo 4K_h264HW_nvv4l2decoder.mp4

タイトルとURLをコピーしました