2.7. ビデオデバイス映像取得用ノード 【AI-Addon】

2.7.1. ice video

入力端子から入力されたカメラデバイスのアドレス(URLやエッジサーバ上のOSのデバイスの識別子) で接続できるカメラから映像を取得し、 Node-REDフローにカメラからの画像を出力したり簡易的な録画を行うノードです。

本ノードは1ノードで複数のカメラと接続することができます。

録画を行う場合、出力されるファイルはavi形式のファイルとなります。 ファイル名はice videoノード、カメラデバイス、保存時刻ごとに ${Destination/${ノードのID}/${object_id}_yyyyMMdd_hhmmss.aviとなります。

注釈

接続可能なデバイス数の上限はICE Coreの設定により定めるデバイスアダプタの上限により決定されます。 この上限は他のデバイスアダプタ数も含んだ上限となります。 詳細はDevice Adapterによるセンサデータ収集を参照ください。

2.7.1.1. 設定項目

ice videoには以下の設定項目があります。

Device
接続するカメラデバイスへのアドレスを直接指定します。 この項目を設定した場合、入力端子が非表示になり、 入力を受け付けなくなります。 このため、本項目を入力した場合は1ノードで1カメラとのみ接続します。 また、Profileに入力されたデバイスプロファイルを使用してバックエンドに対してデバイスを登録します。
Profile
デバイスを登録する際に使用される情報です。 デバイスの特徴等をJSON形式で記述してください。 Deviceに入力がある場合のみ表示され、必須項目となります。
Mode
動作モードを画像出力モード(Image Output)、録画モード(Record)のいずれかからプルダウンで選択することができます。 画像出力モードでは指定されたフォーマットでカメラから取得したフレーム画像をNode-REDフローに出力します。 録画モードではカメラ映像を映像ファイルに録画します。 必須項目です。
Image Type
出力する画像のフォーマットを指定します。 JPEG, PNG, RAWDATAからプルダウン形式で選択することができます。 PNGの場合はRGB24, RAWDATAの場合はRGBAのピクセルフォーマットで出力します。 画像出力モードの時のみ表示され、必須項目となります。
Width
出力する画像の横ピクセル数を指定します。 空欄の場合、カメラ映像の横ピクセル数をそのまま使用します。 省略された場合、0以下が入力された場合はカメラの横ピクセル数が使用されます。 最大値は1920になります。これを超えた値が指定された場合、1920として扱われます。
Height
出力する画像の縦ピクセル数を指定します。 空欄の場合、カメラ映像の縦ピクセル数をそのまま使用します。 省略された場合、0以下が入力された場合はカメラの縦ピクセル数が使用されます。 最大値は1080です。これを超えた値が指定された場合、1080として扱われます。
Keep Aspect Ratio
アスペクト比を維持するかどうかをチェックボックスで指定します。 デフォルトではチェックがされています。 チェックされた場合、アスペクト比を維持する形でWidth, Heightに指定された値かのうち、 サイズが最小となる指定値を使用して画像サイズが決定されます。 たとえば16:9の画像でWidthに1280, Heightに360が指定された場合、サイズは640x360となります。
FPS
1つのカメラから出力される画像の1秒間あたりの枚数を指定します。 カメラのFPSが指定されたFPSより小さい場合、カメラのFPSに合わせて出力されます。 省略された場合、0が入力された場合はカメラに指定されたFPSが使用されます。
User for RTSP
RTSP接続をする場合に利用する認証用ユーザIDです。
Password for RTSP
RTSP接続をする場合に利用する認証用パスワードです。
Base64 Encode
出力する画像をBase64エンコードするかどうかをチェックボックスで指定をします。 デフォルトではチェックがされていません。 画像出力モードのときのみ表示されます。
Record Onetime
本項目にチェックをした場合、一度だけ録画ファイルを出力します。 チェックされていない場合はフローが停止するまで録画ファイルの出力を継続します。 録画モードのときのみ表示され、デフォルトではチェックがされていません。
Interval
映像をファイル出力する際の時間間隔を指定します。単位は秒です。 録画モードのときのみ表示され必須項目となります。 0より大きい整数を入力してください。既定値は60です。
Destination
ファイルを出力するディレクトリを絶対パスで指定します。 ice file transferノードを用いてバックエンドに転送したい場合、 core_config.jsonのupload.white_dirsに記述したディレクトリ以下のパスを指定してください。 録画モードのときのみ表示され必須項目となります。 規定値は/tmpになっています。
Max Save Num
カメラデバイス(Object ID)ごとに保存する音声ファイルの個数を指定します。 ここで指定された個数を超えた映像ファイルは古い順に削除されます。 0以下の数字が指定された場合、無限に保存することが可能です。この場合、自動的に削除はされないのでご注意ください。 録画モードのときのみ表示され必須項目となります。 既定値は5になっています。
Retry Times
カメラとの接続が切れたとき、何回まで再接続を試みるかを指定します。 0以下の数字が指定された場合、カメラとの接続が切れても再接続を行いません。 必須項目であり、規定値は0になっています。
Retry Interval
カメラとの再接続を試みる間隔を指定します。単位はミリ秒です。 カメラとの接続が切れたとき、指定された秒数だけ待ってから再接続を行います。 必須項目であり、規定値は30000になっています。
Data Type
イベントデータとして発行するData Typeを指定します。必須項目であり、規定値は「video」になっています。
Name
ノードの名称を設定することができます。

2.7.1.2. メッセージ構造

2.7.1.2.1. 入力メッセージ

ice videoノードは以下の形式のメッセージ入力を受け付けます。 画像出力モードの場合、新しいカメラの情報が入力された際に入力に対応したカメラに接続します。 録画モードの場合も同様に新しいカメラの情報が入力された際に入力に対応したカメラに接続して録画を開始します。 Record Onetimeにチェックがあった場合、録画の終わったカメラが再度入力された場合、新しいカメラとして録画を行います。 本モジュールでは、すでに接続されているカメラと同一のdeviceが入力された場合、 接続済みのカメラと入力されたカメラの情報は同一であると判断するため、 入力されたカメラに対して接続を行いません。

{
    "payload":{
        "object_id" : "",              //onvif連携用ノードと組み合わせて使用する場合にonvif連携用ノードで割り振られるobject_idを入力します。
                                       //省略した場合、自動でobject_idが割り振られます。
        "device" : "rtsp://xxxx",  //接続するカメラの識別子を入力します。
        "profile" : {                  //デバイスのプロファイルを渡します。object_idが省略された場合必須です。
            ...
        }
    }
}

なお、以下の形式でも入力が可能です。

{
    "payload":{
        "object_id" : "",              //onvif連携用ノードと組み合わせて使用する場合にonvif連携用ノードで割り振られるobject_idを入力します。
                                       //省略した場合、自動でobject_idが割り振られます。
        "camera" : {
            "stream_uri" : "rtsp://xxxx"   //接続するカメラの識別子を入力します。deviceに相当します
        },
        "profile" : {                  //デバイスのプロファイルを渡します。object_idが省略された場合必須です。
            ...
        }
    }
}

または、

{
    "payload":{
        "object_id" : "",              //onvif連携用ノードと組み合わせて使用する場合にonvif連携用ノードで割り振られるobject_idを入力します。
                                       //省略した場合、自動でobject_idが割り振られます。
        "onvif_out" : {
            "getStreamUriResponse" :{
                "mediaUri" :{
                    "uri": "rtsp://xxxx"  // onvif pipeノードでGetStreamUriを実行した場合の出力です。 deviceに相当します。
                }
            }
        },
        "profile" : {                  //デバイスのプロファイルを渡します。object_idが省略された場合必須です。
            ...
        }
    }
}

2.7.1.2.2. 出力メッセージ

ice videoノードは以下の形式でNode-REDフローにメッセージを送出します。

  • ModeがImage Output(画像出力モード)の時
{
    "_msg_id": メッセージID,
    "payload": 画像データ,         //Base64 Encodeにチェックがある場合にはBase64エンコードされた文字列が出力されます。
    "media_params" : {
        "type" : "image",         //image固定
        "image_type" : "jpeg",     //image_dataに出力される画像のフォーマット jpeg/png/rawdataが選択できます。
        "frame_id": 1,           //同一のカメラから出力されたフレームの数です。カメラごとに1から順にインクリメントされます。
        "timestamp": 1500000000, //フレームのタイムスタンプです
        "width": 1920,           //出力される画像の横ピクセル数です
        "height": 1080,          //出力される画像の縦ピクセル数です
    },
    "ice_params": {
        "type": "event_data",  //event_data固定
        "data_type": "...",     //Data Typeに指定した値
        "object_id": "..."     //カメラのObject ID。object_idが入力された場合はその値が代入されます。ない場合には自動で割り振られた値が入力されます。
    }
}
  • ModeがRecord(録画モード)の時
{
    "payload" : "ファイルパス",           //映像ファイルのファイルパスを出力します。
    "media_params":{
        "type": "movie",    //movie固定
        "format" : "avi", // avi固定
        "encode": "mjpeg",    //mjpeg固定
        "length" : 60,       //再生時間を秒数で出力します
        "timestamp": 150000000  //録画を開始したタイムスタンプを出力します
    },
    "ice_params":{
        "type": "event_data",  //event_data固定
        "data_type": "...",     //Data Typeに指定した値
        "object_id": "..."     //カメラデバイスのObject ID
    }
}

2.7.1.3. 使用方法

  • 自動発見したONVIF対応カメラから映像を取得する

onvif discoveryノードの出力を接続すると発見したカメラから映像を取得します。 複数のカメラを接続する場合は、onvif discoveryノードからの出力を switchノードで分け、それぞれice videoに接続してください。 カメラのObject IDにはonvif discoveryで割り振られたIDが使用されます。

usage_ice_video1

  • 自動発見したONVIF対応カメラに初期設定を実行した上で映像を取得する

onvif discoveryノードとonvif pipeノードを使用して カメラに初期設定をした後に映像を取得することができます。 ice videoノードの入力端子にGetStreamURIファンクションを実行するonvif pipeノードの出力を接続してください。

カメラのObject IDにはonvif discoveryで割り振られたIDが使用されます。

usage_ice_video2

  • アドレスを直接指定してカメラから映像を取得する

injectノードからカメラのアドレスを指定してice videoノードに接続することで、 指定したカメラのアドレスから映像を取得できます。 injectノードからフローの開始時にメッセージを出力するように設定することで、 フロー開始時に自動的に指定のカメラから映像を取得できます。

usage_ice_video3

  • 設定ファイルから指定してカメラから映像を取得する

fileノードを使用して設定ファイルから接続先カメラのリストを取得することで、 設定ファイルを書き換えれば接続先カメラを変更可能なフローを作成できます。

たとえば以下のようなJSONファイルを読み込み、カメラごとに分解してice videoノードに入力することで、 リストに登録されたカメラから映像を取得することができます。

[
    {
        "device": "デバイスのアドレス",
        "profile": {
            ...
        }
    },
    {
        "device": "デバイスのアドレス",
        "profile": {
            ...
        }
    },...
]

usage_ice_video4

2.7.1.4. 注意事項

ice videoノードは${ICE_HOME}/native/user/配下に接続されたカメラごとにデバイスアダプタを作成します。 デバイスアダプタはデフォルトではログを出力しないようになっています。 ログを出力させたい場合は、 ${ICE_HOME}/native/lib/_video_device_adapter配下のconfig.jsonを以下のように編集してください。

{
    "command": "video_device_adapter",
    "args":["device_adapter_profile.json"],
    "respawn": 0,
    "priority":10,
    "wait_for_shutdown": "true",
    "stdout": "file",
    "stderr": "file"
}

C APIの内部処理メッセージもログに出力したい場合は、 上記の通りconfig.jsonを編集した上で、 デバッグメッセージ出力機能の 「6.8.3.2.1. デバッグメッセージ出力機能」に記載の通り、環境変数を設定してください。