Nvidia JetsonでMIPI-4Kカメラを使う

少し前にこれを買って、遊んでみた記録。

 

www.switch-science.com

 

 

4Kで記録する方法

これ、純粋な4K解像度(3840x2160)ではない(4032x3040)ので、4Kで動かすにはcropが必要でした。

 

GST_ARGUS: 4032 x 3040 FR = 29.999999 fps Duration = 33333334 ; Analog Gain range min 1.000000, max 22.250000; Exposure Range min 13000, max 683709000;

GST_ARGUS: 1920 x 1080 FR = 59.999999 fps Duration = 16666667 ; Analog Gain range min 1.000000, max 22.250000; Exposure Range min 13000, max 683709000;

GST_ARGUS: 2592 x 1944 FR = 29.999999 fps Duration = 33333334 ; Analog Gain range min 1.000000, max 22.250000; Exposure Range min 13000, max 683709000;

GST_ARGUS: 2560 x 1440 FR = 40.000000 fps Duration = 25000000 ; Analog Gain range min 1.000000, max 22.250000; Exposure Range min 13000, max 683709000;

 

cropするには、nvvidconvを使います。

 

gst-launch-1.0 -e nvarguscamerasrc timeout=20 ! 'video/x-raw(memory:NVMM), width=4032, height=3040, format=(string)NV12, framerate=(fraction)30/1' ! nvvidconv top=440 bottom=2600 left=96 right=3936 ! 'video/x-raw(memory:NVMM), width=3840, height=2160, pixel-aspect-ratio=1/1, format=(string)NV12, framerate=(fraction)30/1' ! ...

 

top/bottom/left/rightは絶対座標みたいです。

pixel-aspect-ratio=1/1を使わないと、元の縦横比のままになるので、16:9になりませんでした。

 

静止画を明るくとる方法

 

静止画を撮ると、露出時間が足りないのか暗くしか取れなかったので、露出時間を無理やり伸ばしました。あと、avenc_bmpがNV12を受け付けないので、BGRAにコンバート。

 

露出時間を延ばすには、nvarguscamerasrcのオプションにexposuretimerangeを指定します。(露出時間は適当です。。。)

 

gst-launch-1.0 -e nvarguscamerasrc exposuretimerange="358733000 358733000" num-buffers=1 ! 'video/x-raw(memory:NVMM), width=1920, height=1080, format=(string)NV12, framerate=(fraction)1/1' ! nvvidconv ! video/x-raw ! videoconvert ! 'video/x-raw, format=(string)BGRA' ! avenc_bmp ! filesink location=filename

 

カメラの撮影時間を指定する方法

20秒録画したいと思ったのですが、Ctrl-Cだとさすがにイケてないので、自動で終わる方法にしました。

nvarguscamerasrcにtimeoutオプションをつけることで可能です。(EOSを送信する[-e]オプションをgst-launchにつけることを忘れずに。)

 

gst-launch-1.0 -e nvarguscamerasrc timeout=20 ! ...

 

Web上ではtimeoutコマンドを使ってる例(timeout 20 gst-launch-1.0 ...)がありましたが、gstreamer自体の起動に時間がかかるのでnvarguscamerasrcのオプションのほうが正確に20秒取れました。

 

ロスレスで動画を撮る方法

 

非圧縮で動画を撮るのを調べていたのので、I420非圧縮と、H264/H265の可逆圧縮をやってみました。

 

H264/H265はエンコーダに以下のオプションをつけることがポイントのようです。

control-rate=0 qp-range=0,1:0,1:0,1 quant-i-frames=0 quant-p-frames=0

 

gst-launch-1.0 -e nvarguscamerasrc timeout=20 ! 'video/x-raw(memory:NVMM), width=1920, height=1080, format=(string)NV12, framerate=(fraction)30/1' ! omxh264enc control-rate=0 qp-range=0,1:0,1:0,1 quant-i-frames=0 quant-p-frames=0 ! queue ! h264parse ! mp4mux ! filesink location=filename

 

gst-launch-1.0 -e nvarguscamerasrc timeout=20 ! 'video/x-raw(memory:NVMM), width=1920, height=1080, format=(string)NV12, framerate=(fraction)30/1' ! omxh265enc control-rate=0 qp-range=0,1:0,1:0,1 quant-i-frames=0 quant-p-frames=0 ! queue ! h265parse ! mp4mux ! filesink location=filename

 

I420はそのまま保存すればいいんですね。

 

gst-launch-1.0 -e nvarguscamerasrc timeout=20 ! 'video/x-raw(memory:NVMM), width=1920, height=1080, format=NV12, framerate=30/1' ! nvvidconv ! 'video/x-raw, width=1920, height=1080, format=I420, framerate=30/1' ! filesink location=filename

 

I420をgstreamerで再生する方法です。

 

gst-launch-1.0 filesrc location=filename ! videoparse width=1920 height=1080 framerate=30/1 ! xvimagesink

 

I420をWindowsVLCで再生する方法です。

 

"\Program Files\VideoLAN\VLC\vlc.exe" --demux rawvideo --rawvid-width 1920 --rawvid-height 1080 --rawvid-fps 30 --rawvid-chroma I420 filename

 

砂嵐パターンを録画する方法

 

結局カメラの映像だと動きが少なくて可逆/非可逆圧縮の差が分かりにくかったので、砂嵐パターンを録画しました。

 

videotestsrc pattern=snowで可能です。時間指定はできないので、30fps*20sで600枚分のバッファを指定しています。

 

gst-launch-1.0 -e videotestsrc pattern=snow num-buffers=600 ! 'video/x-raw, width=1920, height=1080, format=(string)NV12, framerate=(fraction)30/1' ! omxh264enc bitrate=10000000 ! queue ! h264parse ! mp4mux ! filesink location=filename

 

動画をBMPに展開する方法

下記はH265の例ですが、デコード後にBGRAに変換してavenc_bmpBMP化した後、multifilesinkでファイルに保存するのがポイントです。ファイル名に[%d]をつけると連番になります。

 

gst-launch-1.0 filesrc location=filename ! qtdemux ! h265parse ! omxh265dec ! nvvidconv ! video/x-raw ! videoconvert ! 'video/x-raw, format=(string)BGRA' ! avenc_bmp ! multifilesink location="filename%d.bmp"

 

 

Jetson NanoでYOLO

Jetson NanoでYOLOの勉強。

 

以下を参考に。

wisteriahill.sakura.ne.jp

 

使用するのはTensorRT_Demos。

github.com

 

NanoのアップデートかけたらChromiumがsnapになったとのことで、以降aptがエラーはくようになってしまったので、Jetpack4.5.1でクリーンインストール

 

Docker Containerはl4t-mlを使用するということだが、指定されていたバージョンでは起動しなかったので、最新(r32.5.0-py3)に変更。

 

ngc.nvidia.com

 

コンテナ作成時に$DISPLAYの指定を見逃し、terminal上でやってしまう。

config.v2.jsonを直接書き換えたらよいとのことで、書き換え後再起動で対応。

 

hawksnowlog.blogspot.com

 

OpenCVがバージョンアップされていて、CUDA対応されているとのことなので、OpenCV4.5.2をインストール。

 

qengineering.eu

 

TensorRTとONNXのバージョンは組み合わせが決まっているとのことで、onnx1.4.1にしてとりあえずうまくいったんだけど、Jetpack4.5.1だとTensorRT7.1.3のような。

developer.nvidia.com

 

qiita.com

 

で、onnx1.4.1を入れるときにエラー。

下記にしたがって、CMakeLists.txtを修正。

github.com

 

protobufも最新のprotobuf-3.16.0をインストール。

make test のIoTest.LargeOutputでメモリが取れずにエラーが出るが、INT_MAXのメモリが取れないFAILだったので無視しました。

 

はまった、やらかしたのはこれくらい。

 

Elgato Cam Link 4k on Ubuntu 18.04

Linux対応のUSBキャプチャって高いので、オンライン会議用に買ったElgato Cam Link 4kがLinuxで使えるか試してみた。

※ひょっとして、UVC対応してたら、たいてい何でもいけるのかも。。。

 

https://www.elgato.com/ja/gaming/cam-link-4k

 

Sony a6500 3840x2160 + Elgato Cam Link 4kで検証。

(a6500、生産終了なんですね。)

https://nakamura.yokohama/2019-9-5-ilce-6500-price-change-49212.html

 

gstreamer + V4lであっさり動きました。

gst-launch-1.0 v4l2src ! video/x-raw,format=NV12 ! videoconvert ! ximagesink

 

Cam Link 4k挿すとUSBデバイスが2つ見えるので、数字の若いほうを指定してあげればOK。

 

けど、VLCだとちゃんと見えない。VLCはNV12に対応してない模様。

2K表示だとYUYVだけど、4KはNV12になるみたい。

 

会社で8万円くらいするLinux対応のものを買ったけど、4KはNV12だったから、もっと安いのでよかったな。。。

GoPro Hero 6のh264の色フォーマットとnvenc

GoPro Hero 6で4K30フレームで動画を撮った場合、色フォーマットがyuvj420pなんていうフォーマットになってました。

 

で、nvencではこの色フォーマットで出力できないようです。

 

GoProで撮った動画を無劣化で結合する場合に、色フォーマットが違うと結合後に正しく再生できないので、上下反転してるとかでエンコードしないといけない場合は、ソフトウェアエンコードでyuvj420pでする必要があるみたい。

 

ffmpeg -i input -codec:v libx264 -b:v 70000k -pix_fmt yuvj420p -codec:a copy output

 

nvencで出力できるフォーマットって、どこでわかるんだろう?ここかな?

https://developer.nvidia.com/video-encode-decode-gpu-support-matrix

Adobe Premiere Elements 2018でnvenc_exportを使う方法

なんかほしい→モニタを買い替えよう→4Kがいいな→4Kにするにはグラフィックを強化しないと、の流れでGeforce GTX 1050 Tiを購入。

jp.msi.com

 

で、せっかくなので、NVENCを使って動画のエンコード速度を上げたいな、と思い、動画編集ソフトで使えないかと思ったら、意外と対応していない。

 

NVIDIA ShadowPlay … 動画配信とかしないので×。

AviUtl … なんか使いにくそうなので、好きじゃない。

Davinci Resolve … 使えるのかがよくわかってない。

A's Video Converter … 編集できなさそうなので×。

TMPGEnc Video Mastering Works 7 … 悪くなさそうだけど、持ってない。

Adobe Premiere Elements 2018 … 持ってる。

Adobe Premiere Pro CC … Daniel2とかでできるみたいだけど、そもそも持ってない。

 

ということで、Adobe Premiere Elements 2018でなんとか使えるようにしたいなーと。

Adobe Premiereだと、Daniel2とNVENC_exportが使えれば使えそう。

Daniel2 … 公式にはProしか対応していない。ElementsのPluginフォルダにコピーしてみたけど、エラーが出て使えない。

www.daniel2.com

 

NVENC_export … ProとElements両方対応しているようだが、最近のバージョンでは使えない、という話も。2018で使ってみたけど、ビデオカードが未対応と怒られる。

forums.adobe.com

 

で、調べに調べて、回避策をようやく発見。PremiereのGPUFoundation.dllが変わったせいで使えなくなっているらしい。

www.voukoder.org

 

このパッチで使えるようにはなりました。ただ、H265で変換かけてみたら、1カ所ブロックノイズが出ていました。常用に耐えるものかどうかは、ちょっとあやしいかもしれません。

以上、忘備録を兼ねて。