SmartCameraの4Kストリーミング
4Kの確認
前回、SmartCameraで色々とパラメータを変えて試してみましたが、4Kの確認ができていなかったので、今回4Kの確認をしていきます。
※前回の記事はこちら
今回もKV260のカメラ映像をH.264エンコードしてストリーミング配信し、もう一方のPCで受信して映像表示するという構成で確認します。
KV260側の準備
KV260の電源を起動して、IPアドレスを変更します。
$ sudo ifconfig eth0 192.168.0.20
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
SmartCameraに接続しているMIPIカメラCAVBA-000A
の解像度を確認します。
$ gst-device-monitor-1.0
Probing devices...
Device found:
name : isp_vcap_csi output 0
class : Video/Source
caps : video/x-raw, format=(string)NV12, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 2, 32768 ], height=(int)[ 1, 8191 ], interlace-mode=(string)alternate;
video/x-raw, format=(string)NV12, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 2, 32768 ], height=(int)[ 1, 8191 ], interlace-mode=(string){ progressive, interleaved };
video/x-raw, format=(string)NV12, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 2, 32768 ], height=(int)[ 1, 8191 ], interlace-mode=(string)alternate;
video/x-raw, format=(string)NV12, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 2, 32768 ], height=(int)[ 1, 8191 ], interlace-mode=(string){ progressive, interleaved };
properties:
udev-probed = true
device.bus_path = platform-axi:isp_vcap_csi
sysfs.path = /sys/devices/platform/axi/axi:isp_vcap_csi/video4linux/video0
device.subsystem = video4linux
device.product.name = "isp_vcap_csi\ output\ 0"
device.capabilities = :
device.api = v4l2
device.path = /dev/video0
v4l2.device.driver = xilinx-vipp
v4l2.device.card = "isp_vcap_csi\ output\ 0"
v4l2.device.bus_info = platform:isp_vcap_csi:0
v4l2.device.version = 330240 (0x00050a00)
v4l2.device.capabilities = 2216693760 (0x84201000)
v4l2.device.device_caps = 69210112 (0x04201000)
gst-launch-1.0 v4l2src ! ...
ただし上記の通りwidthが32768となりきちんと取れていない模様。
代わりに以下のコマンドを実行してみる。
$ v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture Multiplanar
[0]: 'NM12' (Y/CbCr 4:2:0 (N-C))
[1]: 'NV12' (Y/CbCr 4:2:0)
こちらも正しく取れていない。MIPIカメラの仕様なのかドライバーソフトの問題なのか解らないので取り合えず先に進めてみます。
次にsmartcam
のソースコードを見てみます。
するとmain.c
のCheckMIPISrc()
関数でw = 3840, h = 2160
の入力をサポートしている事がわかります。
static int CheckMIPISrc()
{
mipidev = FindMIPIDev();
if (mipidev == "")
{
g_printerr("ERROR: MIPI device is not ready.\n%s", msgFirmware);
return 1;
}
if ( access( mipidev.c_str(), F_OK ) != 0 )
{
g_printerr("ERROR: Device %s is not ready.\n%s", mipidev.c_str(), msgFirmware);
return 1;
}
if( !(w == 1920 && h == 1080 ) && !(w == 3840 && h == 2160) )
{
g_printerr("ERROR: MIPI src resolution can only be:\n 1) 1920x1080@30\n 2) 3840x2160@30\n");
return 1;
}
return 0;
}
ソースコードを元に、KV260で下記のコマンドを実行します。
$ sudo smartcam --mipi -W 3840 -H 2160 --target-bitrate=30000000 --target rtsp
stream ready at:
rtsp://192.168.0.20:554/test
エラーは特に発生することなく、正常に動作しているように見えます。
PC側での受信再生
次に、受信側の方の設定をしていきます。
始めに、4K映像を受信して表示するので画面内に映像が収まるようにPCの解像度を変更します。
CMDプロンプトを起動して以下のGstreamerコマンドを起動して、ストリーミングの受信・再生を実行してみます。
$ gst-launch-1.0 rtspsrc location=rtsp://192.168.0.20:554/test ! rtph264depay ! queue ! h264parse ! queue ! d3d11h264dec ! videoconvert ! d3d11videosink
表示結果は以下の画像のようになりました。
カラー表現がおかしく、また短冊ノイズがところどころに乗っている状態です。
フレームレートも体感で3フレーム程度といったところでしょうか。
どこかの処理が間に合っていないのか? もしくはバッファ量が足りずにデータが抜け落ちているのか?怪しいところは色々とありますが、今回は深追いはやめておくことにします。(次の機会に改めてという事で。)
終わりに
今回4Kはすんなりとは動いてくれませんでした。
前にも書いた通りで怪しい箇所は色々と考えられるので、試行錯誤しながら色々と調べて行く必要があります。これまでに色々なデバイスで同じような事をやってきましたが、2Kと4Kストリーミングの間には一種の壁があるように感じます。
Discussion