SmartCameraのストリーミング品質改善
はじめに
前回、SmartCameraでカメラ映像をディスプレイ表示してみました。
今回はKV260とPCをイーサーネットでつないでストリーミング配信を試してみます。
環境の準備
KV260とPCのIPアドレスを設定します。
KV260の電源を入れます。ターミナルソフトからログインして以下のコマンドでIPアドレスを一時的に設定します。ここでは192.168.0.20
とします。
$ sudo ifconfig eth0 192.168.0.20
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.20 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::20a:35ff:fe0d:c473 prefixlen 64 scopeid 0x20<link>
ether 00:0a:35:0d:c4:73 txqueuelen 1000 (Ethernet)
RX packets 53 bytes 3256 (3.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 14 bytes 2372 (2.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 52
PC側をクライアントとして設定します。
最初にIPアドレスを設定します。ここでは192.168.0.15
とします。
KV260で、SmartCameraのファームウエアを読み込みます。
$ sudo xmutil unloadapp
$ sudo xmutil loadapp kv260-smartcam
$ sudo xmutil listapps
Accelerator Base Type #slots Active_slot
kv260-dp kv260-dp XRT_FLAT 0 -1
kv260-smartcam kv260-smartcam XRT_FLAT 0 0,
Socket 6 closed by client
それとクライアント側にストリーミング再生用にGstreamerをインストールしておきます。
※以下の記事の6を参照
ストリーミング動作
KV260のターミナルソフト上からアプリケーションを実行します。
ストリーミングの場合はターゲットをrtsp
に指定します。
$ sudo smartcam --mipi -W 1920 -H 1080 --target rtsp
PC側はコマンドプロンプトから以下のコマンドを実行します。
$ gst-launch-1.0 rtspsrc location=rtsp://192.168.0.20:554/test ! rtph264depay ! queue ! h264parse ! queue ! d3d11h264dec ! videoconvert ! d3d11videosink
画面にKV260カメラの映像が表示され、ストリーミングされていることが確認できます。
ただし、見たところ遅延が3秒あり、画質もかなり悪いので、ちょっとパラメータをいじってみたいと思います。
遅延時間の改善
SmartCamでさわれるパラメータは以下のコマンドで確認できます。
$ smartcam -h
Usage:
smartcam [OPTION?] - Application for facedetion detction on SoM board of Xilinx.
Help Options:
-h, --help Show help options
--help-all Show all help options
--help-gst Show GStreamer Options
Application Options:
-m, --mipi= use MIPI camera as input source, auto detect, fail if no mipi connected
-u, --usb=media ID usb camera media device id, e.g. 0 for /dev/media0
-f, --file=file path location of h26x file as input
-i, --infile-type=h264 input file type: [h264 | h265]
-W, --width=1920 resolution w of the input
-H, --height=1080 resolution h of the input
-r, --framerate=30 framerate of the input
-t, --target=dp [dp|rtsp|file]
-o, --outmedia-type=h264 output file type: [h264 | h265]
-p, --port=554 Port to listen on (default: 554)
-a, --aitask select AI task to be run: [facedetect|ssd|refinedet]
-n, --nodet no AI inference
-A, --audio RTSP with I2S audio
-R, --report report fps
-s, --screenfps display fps on screen, notice this will cause performance degradation
--ROI-off turn off ROI
--control-rate=low-latency Encoder parameter control-rate
--target-bitrate=3000 Encoder parameter target-bitrate
--gop-length=60
--profile Encoder parameter profile.
--level Encoder parameter level
--tier Encoder parameter tier
--encodeEnhancedParam String for fully customizing the encoder in the form "param1=val1, param2=val2,...", where paramn is the name of the encoder parameter
- AI処理をOFF
パラメータリストに-n, --nodet (no AI inference)
があります。デフォルトでAI処理が適用されているようなので、-n
を指定して動作させてみましたが、、体感での遅延に改善は見られませんでした。 - レートコントロール
こちらはデフォルトでlow-latency
に設定されている。
https://github.com/Xilinx/smartcam/blob/2021.1/src/main.cpp - GOP長
Iピクチャの挿入間隔で、30フレームに対し60がデフォルトなので2秒に1回の間隔になる。これを15に変更してみたが、負荷が重いせいなのか逆にフレームレートが落ちることが分かった。
結局のところ、パラメータ調整では遅延は解決しない。アプリケーションではRTSPサーバを立ち上げて送信しているので、直接GstreamerコマンドをたたいてUDP送信をしてみることに。
gst-launch-1.0 v4l2src io-mode=4 device=/dev/video0 ! videoconvert ! video/x-raw, format=NV12, framerate=30/1, width=1920, height=1080 ! omxh264enc ! h264parse ! queue ! rtph264pay ! udpsink host=192.168.0.15 port=554 buffer-size=20000000
gst-launch-1.0.exe udpsrc name=video_src port=554 caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264" ! rtph264depay ! queue ! h264parse ! queue ! d3d11h264dec ! videoconvert ! d3d11videosink
このケースでは、遅延が1秒以内に収まります。
どうやらRTSPサーバーの送信に問題があるようですが環境依存の可能性も考えられるので、ここでは問題ありそうだという事だけ認識しておくことにします。
画質の改善
UDPにする事で低遅延でストリーミングできるようにはなりましたが、画質については依然として良くないので、今度は画質改善について見ていきます。
-
ターゲットビットレート
デフォルトでは--target-bitrate=3000
で3Kbpsに設定されていて、明らかに低いので
30000000(30Mbps)に設定してみます。設定通りのデータ量をPC側で受け取れていることが確認できます。
映像を目視確認してもブロックノイズは目立たなくいい感じです。
終わりに
K260でSmartCameraを動かしてみましたが、ZCU104の時と比べて動画品質が向上していす。
これならドローンの映像配信にも使えるのではないでしょうか。
今後、これをベースにAIや画像処理機能を追加していくことをモチベーションに色々と試して行こうと思います。
Discussion