はじめに
前回は以下の記事で、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では、メーカ名が表示されない😭まあ、認識されているので良し。
1 2 3 4 5 |
root@Jetson:~# dmesg [ 121.491867] usb 1-2.2: Product: HD USB CAMERA [ 121.491871] usb 1-2.2: Manufacturer: 4K USB CAMERA [ 121.491873] usb 1-2.2: SerialNumber: 01.00.00 |
1 2 3 4 5 6 7 8 |
root@Jetson:~# lsusb Bus 002 Device 002: ID 0bda:0411 Realtek Semiconductor Corp. Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 0bda:8179 RTL8188EUS 802.11n Wireless Network Adapter Bus 001 Device 003: ID 32e4:0317 Bus 001 Device 002: ID 0bda:5411 Realtek Semiconductor Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub |
②v4l2-ctlで確認
UVC接続のUSBカメラは、Linuxでは「v4l2」というドライバを経由して制御します。そこでv4l2経由でカメラの情報を確認します。ちゃんと「HD USB CAMERA」として/dev/video0で認識されています。あれ?Raspbery Piではvideo0とvideo1の2つで認識されていたが、Jetson nanoでは1つしか認識されない。まあ、2個もいらないしOK 😁
1 2 3 4 5 |
root@Jetson:~# v4l2-ctl --list-devices HD USB CAMERA (usb-70090000.xusb-2.2): /dev/video0 |
③対応フォーマットの確認
次に、カメラが対応している動画フォーマットを確認します。今回使用したカメラの対応フォーマットは以下の通りでした。4Kカメラだけに、4K(3840×2160)はもちろん、フルHD(1920×1080)等にも対応しています。また、フォーマットは「’MJPG’ (Motion-JPEG, compressed)」と「’YUYV’ (YUYV 4:2:2)」に対応しています。ただ、4Kの対応はMJPGのみ!これが後に大きな問題に・・・。
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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
root@Jetson:~# v4l2-ctl --list-formats-ext ioctl: VIDIOC_ENUM_FMT Index : 0 Type : Video Capture Pixel Format: 'MJPG' (compressed) Name : Motion-JPEG Size: Discrete 3840x2160 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 1920x1080 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 2592x1944 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 2048x1536 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 1600x1200 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 1280x960 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 1280x720 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 1024x768 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 800x600 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 320x240 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Index : 1 Type : Video Capture Pixel Format: 'YUYV' Name : YUYV 4:2:2 Size: Discrete 3840x2160 Interval: Discrete 1.000s (1.000 fps) Size: Discrete 1920x1080 Interval: Discrete 0.333s (3.000 fps) Size: Discrete 2592x1944 Interval: Discrete 1.000s (1.000 fps) Size: Discrete 2048x1536 Interval: Discrete 0.333s (3.000 fps) Size: Discrete 1600x1200 Interval: Discrete 0.333s (3.000 fps) Size: Discrete 1280x960 Interval: Discrete 0.200s (5.000 fps) Size: Discrete 1280x720 Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 1024x768 Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 800x600 Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) Size: Discrete 320x240 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.040s (25.000 fps) Interval: Discrete 0.050s (20.000 fps) Interval: Discrete 0.067s (15.000 fps) Interval: Discrete 0.100s (10.000 fps) Interval: Discrete 0.200s (5.000 fps) root@Jetson:~# |
④カメラ性能の検証
それでは、カメラ性能について検証していきます。この検証は、単純にカメラから4Kのデータが取得できるかというもので、いわばUSB3.0ポートの性能検証の意味合いです。
■フルHD(1920×1080)での検証結果
30fps程度のフレームレートが出ており、問題なし!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
root@Jetson:~# v4l2-ctl --set-fmt-video=width=1280,height=720,pixelformat=0 root@Jetson:~# v4l2-ctl -p 30 Frame rate set to 30.000 fps root@Jetson:~# v4l2-ctl --stream-mmap=3 --stream-count=300 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.39 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.19 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.13 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.17 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.13 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.11 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.14 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.12 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.11 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<< root@Jetson:~# |
■4K(3840×2160)での検証結果
4Kでもちゃんと30fps程度のフレームレートが出ており、問題なし!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
root@Jetson:~# v4l2-ctl --set-fmt-video=width=3840,height=2160,pixelformat=0 root@Jetson:~# v4l2-ctl -p 30 Frame rate set to 30.000 fps root@Jetson:~# v4l2-ctl --stream-mmap=3 --stream-count=300 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.09 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.19 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.13 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.09 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.13 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.11 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.14 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.12 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.11 fps <<<<<<<<<<<<<<<<<<<<<<<<<<<< root@Jetson:~# |
以上でカメラ性能の検証は完了です!!結論は問題なし!ということで、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%
1 2 3 4 5 6 7 8 9 10 11 |
$gst-launch-1.0 -e v4l2src device=/dev/video1 ! 'image/jpeg,width=1920,height=1080,framerate=30/1' ! jpegdec ! queue ! videoconvert ! queue ! x264enc threads=1 ! h264parse ! qtmux ! filesink location=FHD_h264SW1x.mp4 -e $mediainfo FHD_h264SW1x.mp4 ---省略--- Bit rate : 258 kb/s Nominal bit rate : 2 048 kb/s Maximum bit rate : 2 097 kb/s ---省略--- Frame rate : 4.384 FPS Minimum frame rate : 0.455 FPS Maximum frame rate : 31.250 FPS |
■フルHD(1920×1080)x264(ソフトウェアエンコード:4CPU)
Jetson nanoのCPU(4個)をフルに使ったx264動画圧縮(ソフトウェアエンコード)の測定結果です。fps=8.2という結果です。CPU1個の場合と比較して2倍程度にはなりましたが、4倍にはなりません。
fps=8.229
CPU=100%、100%、98%、100%
1 2 3 4 5 6 7 8 9 10 11 |
$gst-launch-1.0 -e v4l2src device=/dev/video1 ! 'image/jpeg,width=1920,height=1080,framerate=30/1' ! jpegdec ! queue ! videoconvert ! queue ! x264enc threads=4 ! h264parse ! qtmux ! filesink location=FHD_h264SW4x.mp4 -e $mediainfo FHD_h264SW4x.mp4 ---省略--- Bit rate : 467 kb/s Nominal bit rate : 2 048 kb/s Maximum bit rate : 2 097 kb/s ---省略--- Frame rate : 8.229 FPS Minimum frame rate : 0.579 FPS Maximum frame rate : 34.091 FPS |
■フルHD(1920×1080)nvv4l2h264enc(ハードウェアエンコード)
Jetson nanoに搭載されたハードウェアエンコーダを利用したh264動画圧縮の測定結果です。ハードウェアエンコードが効いて、CPUをほとんど使わず、ほぼ30fpsが出ています❗️
JTOP画面の左下「NVENC」の欄にも192MHzと表示されており、ハードウェアエンコーダを使っていることも確認できます。
fps=29.768
CPU=73%、2%、0%、9%
1 2 3 4 5 6 7 8 9 |
$gst-launch-1.0 -e v4l2src device=/dev/video1 ! 'image/jpeg,width=1920,height=1080,framerate=30/1' ! jpegdec ! nvvidconv ! nvv4l2h264enc ! h264parse ! queue2 ! qtmux ! filesink location=FHD_h264HW.mp4 -e $mediainfo FHD_h264HW.mp4 ---省略--- Bit rate : 3 960 kb/s Maximum bit rate : 21.9 Mb/s ---省略--- Frame rate : 29.768 FPS Minimum frame rate : 2.688 FPS Maximum frame rate : 31.579 FPS |
②h265エンコード性能
■フルHD(1920×1080)x265(ソフトウェアエンコード:1CPU)
Jetson nanoのCPU(1個)を使ったx265動画圧縮(ソフトウェアエンコード)の測定結果です。CPU1つでがんばって、fps=2.7という結果です。さらに、x265はマルチスレッドのオプションが無いのでこれが限界です。まあ、使い物になりません。
fps=2.749
CPU=14%、10%、16%、100%
1 2 3 4 5 6 7 8 9 10 |
$gst-launch-1.0 -e v4l2src device=/dev/video1 ! 'image/jpeg,width=1920,height=1080,framerate=30/1' ! jpegdec ! queue ! videoconvert ! queue ! x265enc ! h265parse ! qtmux ! filesink location=FHD_h265SW.mp4 -e $mediainfo FHD_h265SW.mp4 ---省略--- Bit rate : 114 kb/s Maximum bit rate : 8 670 kb/s ---省略--- Frame rate : 2.749 FPS Minimum frame rate : 0.082 FPS Maximum frame rate : 31.250 FPS |
■フルHD(1920×1080)nvv4l2h265enc(ハードウェアエンコード)
次に、h265の圧縮性能です。Jetson nanoに搭載されたハードウェアエンコーダを利用した場合の測定結果です。ハードウェアエンコードが効いて、CPUをほとんど使わず、ほぼ30fpsが出ています。さすがです!
fps=29.779
CPU=75%、5%、5%、8%
1 2 3 4 5 6 7 8 9 10 |
$gst-launch-1.0 -e v4l2src device=/dev/video1 ! 'image/jpeg,width=1920,height=1080,framerate=30/1' ! jpegdec ! nvvidconv ! nvv4l2h265enc ! h265parse ! queue2 ! qtmux ! filesink location=FHD_h265HW.mp4 -e $mediainfo FHD_h265HW.mp4 ---省略--- Bit rate : 3 971 kb/s Maximum bit rate : 24.6 Mb/s ---省略--- Frame rate : 29.779 FPS Minimum frame rate : 2.688 FPS Maximum frame rate : 31.579 FPS |
4K動画の測定結果
いよいよ本題の4K動画の測定結果です。
①h264エンコード性能
■4K(3840×2160)x264(ソフトウェアエンコード:4CPU)
Jetson nanoのCPU(4個)をフルに使ったx264動画圧縮(ソフトウェアエンコード)の測定結果です。fps=3.7という結果です。やはりソフトウェアエンコードでは辛いですね。
fps=3.678
CPU=100%、98%、86%、100%
1 2 3 4 5 6 7 8 9 10 |
$gst-launch-1.0 -e v4l2src device=/dev/video1 ! 'image/jpeg,width=3840,height=2160,framerate=30/1' ! jpegdec ! queue ! videoconvert ! queue ! x264enc threads=4 ! h264parse ! qtmux ! filesink location=4K_h264SW4x.mp4 -e $mediainfo 4K_h264SW4x.mp4 ---省略--- Bit rate : 193 kb/s Nominal bit rate : 2 048 kb/s Maximum bit rate : 2 097 kb/s ---省略--- Frame rate : 3.678 FPS Minimum frame rate : 0.128 FPS Maximum frame rate : 31.250 FPS |
■4K(3840×2160)nvv4l2h264enc(ハードウェアエンコード)
Jetson nanoに搭載されたハードウェアエンコーダを利用したh264動画圧縮の測定結果です。CPUをほとんど使わず、ハードウェアエンコーダも「396MHz」で動いていますが、10.8fps‼️
あれ?30fpsじゃないの?そう、30fps出ないんです💦原因はカメラから受信したMJPGをデコードする「jpegdec」の部分。ここがボトルネックになっているようです。
fps=10.783
CPU=30%、40%、15%、54%
1 2 3 4 5 6 7 8 9 |
$gst-launch-1.0 -e v4l2src device=/dev/video1 ! 'image/jpeg,width=3840,height=2160,framerate=30/1' ! jpegdec ! nvvidconv ! nvv4l2h264enc ! h264parse ! queue2 ! qtmux ! filesink location=4K_h264HW.mp4 -e $mediainfo 4K_h264HW.mp4 ---省略--- Bit rate : 1 438 kb/s Maximum bit rate : 20.7 Mb/s ---省略--- Frame rate : 10.783 FPS Minimum frame rate : 2.686 FPS Maximum frame rate : 31.579 FPS |
■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%
1 2 3 4 5 6 7 8 9 |
$gst-launch-1.0 -e v4l2src device=/dev/video1 io-mode=2 ! 'image/jpeg,width=3840,height=2160,framerate=30/1' ! nvjpegdec ! 'video/x-raw' ! nvvidconv ! nvv4l2h264enc ! h264parse ! queue2 ! qtmux ! filesink location=4K_h264HW_nvjpeg.mp4 -e $mediainfo 4K_h264HW_nvjpeg.mp4 ---省略--- Bit rate : 2 374 kb/s Maximum bit rate : 25.3 Mb/s ---省略--- Frame rate : 17.849 FPS Minimum frame rate : 2.686 FPS Maximum frame rate : 31.250 FPS |
■4K(3840×2160)nvv4l2h264enc(ハードウェアエンコード)with nvv4l2decoder
4K動画の撮影を挫折仕掛けていましたが、ダメモトでNVIDIA forumで質問したら親切な方が教えてくれました‼️この方法は、どこにも書いていないのですが、カメラからの入力をJPEG画像ではなくMJPG動画として扱い、NVJPGデコーダを使ってデコードします!
そして!測定結果は、29.6fpsという結果‼️‼️出ました30fps😍
fps=29.556
CPU=31%、14%、24%、18%
1 2 3 4 5 6 7 8 9 |
$gst-launch-1.0 -e v4l2src device=/dev/video0 io-mode=2 ! image/jpeg, width=3840, height=2160, 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 ---省略--- Bit rate : 3 915 kb/s Maximum bit rate : 30.4 Mb/s ---省略--- Frame rate : 29.566 FPS Minimum frame rate : 2.688 FPS Maximum frame rate : 31.579 FPS |
②h265エンコード性能
■4K(3840×2160)x265(ソフトウェアエンコード:1CPU)
h265の場合も、まずはJetson nanoのCPU(1個)を使ったx265動画圧縮(ソフトウェアエンコード)の測定結果です。fps=9.781という結果です。まあ、CPUでは辛いですよね。
fps=9.781
CPU=100%、4%、11%、6%
1 2 3 4 5 6 7 8 9 |
$gst-launch-1.0 -e v4l2src device=/dev/video1 ! 'image/jpeg,width=3840,height=2160,framerate=30/1' ! jpegdec ! queue ! videoconvert ! queue ! x265enc ! h265parse ! qtmux ! filesink location=4K_h265SW.mp4 -e $mediainfo 4K_h265SW.mp4 ---省略--- Bit rate : 535 kb/s Maximum bit rate : 7 394 kb/s ---省略--- Frame rate : 9.781 FPS Minimum frame rate : 1.453 FPS Maximum frame rate : 31.250 FPS |
■4K(3840×2160)nvv4l2h265enc(ハードウェアエンコード)
h265ハードウェアエンコーダを利用した場合の測定結果です。ハードウェアエンコードが効いていますが、10fpsですね。JPEGデコードボトルネックです。
fps=10.716
CPU=22%、12%、76%、30%
1 2 3 4 5 6 7 8 9 |
$gst-launch-1.0 -e v4l2src device=/dev/video1 ! 'image/jpeg,width=3840,height=2160,framerate=30/1' ! jpegdec ! nvvidconv ! nvv4l2h265enc ! h265parse ! queue2 ! qtmux ! filesink location=4K_h265HW.mp4 $mediainfo 4K_h265HW.mp4 ---省略--- Bit rate : 1 438 kb/s Maximum bit rate : 14.9 Mb/s ---省略--- Frame rate : 10.716 FPS Minimum frame rate : 2.688 FPS Maximum frame rate : 31.250 FPS |
■4K(3840×2160)nvv4l2h265enc(ハードウェアエンコード)with nvjpegdec
NVJPGデコーダとh265エンコーダを併用した、h265圧縮性能の測定結果です。結果は、fps=17.6という結果。やはりnvjpegdecでは、30fpsでません😭
fps=17.551
CPU=46%、48%、18%、19%
1 2 3 4 5 6 7 8 9 |
$gst-launch-1.0 -e v4l2src device=/dev/video1 io-mode=2 ! 'image/jpeg,width=3840,height=2160,framerate=30/1' ! nvjpegdec ! 'video/x-raw' ! nvvidconv ! nvv4l2h265enc ! h265parse ! queue2 ! qtmux ! filesink location=4K_h265HW_nvjpeg.mp4 -e $mediainfo 4K_h265HW_nvjpeg.mp4 ---省略--- Bit rate : 2 347 kb/s Maximum bit rate : 16.5 Mb/s ---省略--- Frame rate : 17.551 FPS Minimum frame rate : 2.941 FPS Maximum frame rate : 31.250 FPS |
■4K(3840×2160)nvv4l2h265enc(ハードウェアエンコード)with nvv4l2decoder
NVJPGエンコーダとh265エンコーダを併用し、nvv4l2decoderを用いたの測定結果です‼️結果は、fps=29.6という結果‼️h265でもちゃんと30fpsでました😀
fps=29.602
CPU=19%、16%、9%、10%
1 2 3 4 5 6 7 8 9 |
$gst-launch-1.0 -e v4l2src device=/dev/video0 io-mode=2 ! image/jpeg, width=3840, height=2160, framerate=30/1 ! nvv4l2decoder mjpeg=1 ! 'video/x-raw(memory:NVMM)' ! nvv4l2h265enc ! h265parse ! queue2 ! qtmux ! filesink location=4K_h265HW_nvv4l2decoder.mp4 $mediainfo 4K_h265HW_nvv4l2decoder.mp4 ---省略--- Bit rate : 3 949 kb/s Maximum bit rate : 19.1 Mb/s ---省略--- Frame rate : 29.602 FPS Minimum frame rate : 2.688 FPS Maximum frame rate : 37.975 FPS |
測定結果サマリー
測定条件を変えながら実機検証した、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エンコード可能です!
コメント
当方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
ブログをお読みいただきありがとうございます。私も色がおかしくなりまし。すぐにパッチがでると思い書きませんでしたが、libnvtvmr.soのバグのようです。NVIDIA Developper Forumで提供されている libnvtvmr.soに置き換えると治りますよ。
https://forums.developer.nvidia.com/uploads/short-url/4G5XLdepLt247pmBbLTp2rIw2n.zip