Nvidia JetsonでMIPI-4Kカメラを使う
少し前にこれを買って、遊んでみた記録。
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
"\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_bmpでBMP化した後、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の勉強。
以下を参考に。
使用するのはTensorRT_Demos。
NanoのアップデートかけたらChromiumがsnapになったとのことで、以降aptがエラーはくようになってしまったので、Jetpack4.5.1でクリーンインストール。
Docker Containerはl4t-mlを使用するということだが、指定されていたバージョンでは起動しなかったので、最新(r32.5.0-py3)に変更。
コンテナ作成時に$DISPLAYの指定を見逃し、terminal上でやってしまう。
config.v2.jsonを直接書き換えたらよいとのことで、書き換え後再起動で対応。
OpenCVがバージョンアップされていて、CUDA対応されているとのことなので、OpenCV4.5.2をインストール。
TensorRTとONNXのバージョンは組み合わせが決まっているとのことで、onnx1.4.1にしてとりあえずうまくいったんだけど、Jetpack4.5.1だとTensorRT7.1.3のような。
で、onnx1.4.1を入れるときにエラー。
下記にしたがって、CMakeLists.txtを修正。
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を購入。
で、せっかくなので、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フォルダにコピーしてみたけど、エラーが出て使えない。
NVENC_export … ProとElements両方対応しているようだが、最近のバージョンでは使えない、という話も。2018で使ってみたけど、ビデオカードが未対応と怒られる。
で、調べに調べて、回避策をようやく発見。PremiereのGPUFoundation.dllが変わったせいで使えなくなっているらしい。
このパッチで使えるようにはなりました。ただ、H265で変換かけてみたら、1カ所ブロックノイズが出ていました。常用に耐えるものかどうかは、ちょっとあやしいかもしれません。
以上、忘備録を兼ねて。
放置プレー
やっちゃった。
そして、そんなことしてる間に、冬が終わった模様。
最高気温20℃越え。
(華氏だと…分かりません。フェーレンハイトって言うらしい)
ikea online
IKEAのオンラインで頼んだ家具が届いた。
わりとスムーズに届いたので、またどこかで解説したいなと思いつつ、今日は寝ます。