🎣

SmartCameraの4Kストリーミング

2022/03/26に公開約4,600字

4Kの確認

前回、SmartCameraで色々とパラメータを変えて試してみましたが、4Kの確認ができていなかったので、今回4Kの確認をしていきます。
※前回の記事はこちら

https://zenn.dev/youkou/articles/04c1e4b104a481

今回も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のソースコードを見てみます。

https://github.com/Xilinx/smartcam/blob/2021.1/src/main.cpp

するとmain.cCheckMIPISrc()関数で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

ログインするとコメントできます