Tange Cloud for Device
 Rev.333
载入中...
搜索中...
未找到
设备能力描述

  • 粗体为默认值 。能力查询 TciCB::get_feature() 回调返回-1,或能力描述返回错误值、空值都归于默认值
  • 能力 取值大小写不敏感
  • 多通道(镜头)设备 :
    • 如果每一路有不同属性, 采用 json 数组 格式来描述每个通道的属性
    • 如果描述值不是json数组,则认为属性适用于所有通道
    • 一些特殊形态的设备(例如双目设备)有特殊描述方式,注意文档说明

      ‍例如:对一个2通道的设备的 DoubleLight 属性,固件返回 "Yes"意味两个通道都有白光灯。等同于 ["Yes", "Yes"]。如果返回 ["Yes", "No"]则表示仅在第一个通道上有白光灯。

  • 多(扩展)属性表达与解析 能力可能有多个属性, 如果属性值是字符串格式,多个属性间用分隔符隔开。

    分隔符可以是','或';'。之前的文档里,有的指定';',有的指定',',一般情况下这两者在功效上并没有区别。因此,除特殊情况(目前是Cap-Zoom),APP要能兼容这两种分隔符.

    因为多属性的存在,除了No值以外,APP端要避免直接字符串比较。而是要先用 ','和';'分割,再在分割得到数组中搜索。

    多属性情形,属性间可能存在依赖关系。为方便解析,规定主属性在前。

索引

设备能力详解


4G

是否支持4G [2024/4/17 rev.190 更新支持simtype]

  • No - 不支持
  • imei:yyyy;iccid:xxxx;simtype:ZZZ - 支持,并在此返回imei/iccid号和SIM类型
  • {"imei":"yyyy", "iccid":"xxxx", "simtype":"ZZZ"} - 支持,以json格式返回imei、iccid和SIM卡类型

其中 simtype是可选的,取值:

  • "esim" ESIM卡
  • "vsim" VSIM卡
  • 其它值或无simtype键时,表示普通物理卡

AlarmLight

是否支持报警灯


AlertSound

是否有蜂鸣器

扩展属性

当设备支持蜂鸣器时,还可以有以下扩展属性(用','分隔)。能力值中具有扩展属性时,Yes可省略。


AudioFmt

支持的对讲音频格式: “音频编码:采样频率:采样位宽:声道数”

如果没有此描述,默认为 "g711a:8000:16:1"。或者在收到实时音频后取与之相同的配置。

  • 音频编码: TCMEDIA 中定义的媒体类型对应的字符串
  • 采样频率: ENUM_AUDIO_SAMPLERATE 中定义的采样频率
  • 采样位宽: 16
  • 声道数: 1 或 2

AutoTracking

是否支持自动追踪

  • No - 不支持
  • Yes - 支持

BatteryCam

电池摄像机能力

扩展属性

扩展属性用‘’;'`分隔,追加到主能力后面。

Dormant类型摄像机,定义如下扩展属性:


CallTime

呼叫的时间配置。

CallTime = 呼叫超时时间[[,最大持续时间],下电行为标志]

时间单位为秒,计时从触发呼叫那一刻开始(对app来说是呼叫事件的时间)。

  • 呼叫超时时间: 超时无人接听,设备呼叫终止,事件状态为missed

    超时后设备端的默认行为是下电(否则设置标志),APP应退出接听界面或不再尝试连接。

    门锁的默认值是60", 其余设备类型为30"。

  • 最大持续时间: 如果非0,接听在到达最大存在时间时强行中止。

    设备端强行中止时要调用 TciForceSleeping(), app会在视频通道上收到 RTM_GOINGTO_SLEEP 通知。

    APP端收到通知,或倒计时到0,都要断开连接。

  • 下电行为标志: 默认为0。仅对【被动】【电池】【设置了 最大持续时间 】的设备有意义
    • bit-0: 呼叫超时不下电,会继续工作直到 最大持续时间
    • bit-1: 挂断拒接不下电,会继续工作直到 最大持续时间
    • bit-2: 开锁后不立即下电,会继续工作直到 最大持续时间  –  目前还没有这样的需求

举例

CallTime = "30"

30“呼叫超时后,设备下电;拒接或挂断后设备立即下电;用户接听后可以一直通话。

CallTime = "30,180"

30"呼叫超时后,设备下电;拒接或挂断后设备立即下电;用户接听到180"(从呼叫开始计时)强制关断设备下电。

CallTime = "30,180,3"

30"呼叫超时后,设备和app端停止振铃;在180”内用户可以任意接听、挂断、重新连接和退出;180"时强制下电。


Cap-AI

AI能力分硬AI(设备设备硬件的AI能力,hw_ai)和软AI(通过AI服务器获取的AI能力,'sw_ai')两种. 设备在此描述中分别描述这两种能力.

上报格式为一个json数组,格式见例子。

NOTE – 见后面的说明 !!!

1.取值

ai能力类型(type):

* fd – 人脸检测 (face detection) * fr – 人脸识别 (face recognition) * mt – 移动跟踪 (movement tracking) * ot – 物体跟踪 (object tracking)

  • body – 人体检测。
  • cry – 哭声检测(cry)
  • bad_posture – 坐姿检测(sitting pose detection)
  • tumble – 摔倒
  • pet – 宠物
  • car – 汽车

下面两种取值不再有效,要合并并改为 body [Rev217, 2024/8/29]

  • bd – 人体检测 (body detection)
  • bt – 人体跟踪 (body tracking)

硬AI能力标志位(flags):

  • bit 0 - 0:要购买服务; 1:不需要购买服务
  • bit 1 - 边框显示标志
    • 0:不支持显示边框
    • 1:支持为目标加边框。 要实现指令 TCI_CMD_SET_SHOW_BOX/ TCI_CMD_GET_SHOW_BOX
  • bit 2 - 特写功能标志
    • 0:不支持特写
    • 1:支持特写。当检测到对象时输出对象局部放大的图像。 要实现指令 TCI_CMD_SET_ENABLE_CLOSEUP/ TCI_CMD_GET_ENABLE_CLOSEUP
  • bit 3 - 本地AI上报需经平台进一步验证。这个用在本地AI误报较多的情形

2.格式举例

{
"sw_ai":[
"mt"
],
"hw_ai":[
{"type":"body","flags":3},
{"type":"fd", "flags":0},
{"type":"bad_posture", "flags":8}
]
}

表示设备有如下软AI能力:  [软AI "sw_ai" 已废弃]

* 移动跟踪(mt): 要购买服务 ----— 软AI都要通过购买猎取

硬AI能力:

  • 人体检测(body): 不用购买服务即开启; 支持在人体外加边框
  • 人脸检测(fd?): 要购买服务
  • 坐姿检测(bad_posture): 设备上报的坐姿事件需要到ai服务器做进一步确认(要购买服务)

3.说明

为保持兼容,APP要支持旧的"用逗号隔开的一种或多种ai能力字符串"格式(形如:"body,fd,mt"),对这种描述,其标志值按=0处理, 即要购买服务。

4.扩展AI类型与上报事件

新增AI类型,这个类型的名字会以平台注册,但在SDK不会再添加一个对应事件类型的枚举类型(例如 ECEVENT_CRY)。对这类事件,固件要采用自定义事件标签的方式上报(EVENTPARAM::event=ECEVENT_USER_DEFINED),事件的名字与AI类型的名字一致。

/*扩展AI事件的上报*/
memset(&evtp, 0. sizeof(evtp));
evtp.x_event_name = "pet";
....
@ ECEVENT_USER_DEFINED
自定义事件。使用方式见文档 EventSet, Cap-AI
ECEVENT event
事件类型. 参数(evt_data)见事件的说明
const char * x_event_name
[2024/3/25添加] 如果event为 ECEVENT_USER_DEFINED, 这里为自定义事件名.
事件上报参数.

有对应的事件枚举定义的,可以继续使用特定枚举的方式。

在此处描述的ai类型,其对应事件不用在 EventSet 里再描述一次。


Cap-Defence

布撤防能力

  • No - 不支持。报警功能的开闭时间由设备自己决定
  • bundle - 所有报警源共用一个布撤防设置
  • "0xNNN[:0xMMM]" - 字符串型的支持布撤防的报警类型掩码。
  • ["0xNNN", "0xMMM"] - json数组表示的报警类型掩码(使用字符串是为了避免出现数值溢出)

掩码

0xNNN/0xMMM: 都是数值的16进制 字符串 表示。转成数值后位n如果为1,表示事件n被设置。事件n取值见 ECEVENT

0xNNN: 为支持独立配置的报警类型。

0xMMM: 为不支持独立(合并在一起)配置的报警类型。如果缺省,表示其余类型不支持布/撤防。

要支持指令

设备支持布撤防时,要支持指令: TCI_CMD_GET_DEFENCE_REQ/ TCI_CMD_SET_DEFENCE_REQ

支持独立设置的报警源,还要支持指令: TCI_CMD_SET_EVENT_STATE / TCI_CMD_GET_EVENT_STATE

能力描述举例

如果设备支持 移动侦测人形检测声音三种报警, 并且声音报警可以单独开关。三种报警类型常数为

于是:

  • 独立设置项:1<<ECEVENT_SOUND = 0x08,
  • 合并设置项:(1<<ECEVENT_MOTION_DETECTED | 1<<ECEVENT_HUMAN_BODY) = 0x06

最后,得到能力描述为 "0x08:0x06"["0x08", "0x06"]
如果设备返回 "0x08", 则意味着仅可以对声音报警进行布撤防设置。

实现上的问题

固件兼容

设备报告支持独立设置,APP在实现上也可能选择一起配置。固件要能处理这种情况

以上面的能力描述为例。设备报告声音侦测支持独立设置,但APP实现还是采用的统一布撤防。固件在收到的 TCI_CMD_SET_DEFENCE_REQ 命令的请求中 Tcis_SetDefenceReq::items[0].event_mask 值为 ECEVENT_ALL0x0e,那么声音侦测的布撤防采用本处的统一设置。

之后APP升级,对声音采用单独布撤防设置,event_mast取值为 0x08, 那么声音侦测要采用新的的配置,原来的统一设置中要排除声音侦测。

APP 获取配置

APP调用 TCI_CMD_GET_DEFENCE_REQ 获取配置时,如果能力为 "bundle", 命令参数被忽略。否则要使用以下参数结构:

typedef struct Tcis_GetDefenceReq {
uint32_t event; // 事件类型 ECEVENT
uint32_t reserved;
} __PACKED__ Tcis_GetDefenceReq;
uint32_t event
0 - 表示获取所有非单独设置的报警类型的配置。见Cap-Defence 的说明 <0x10000 - 要获取其配置的事件类型 ECEVENT 。
获取布/撤防设置.

以前面的配置为例,需要在进入声音的布撤防界面前,以

req.reserved = 0;
@ ECEVENT_SOUND
[sound] (=3)

请求声音布撤防配置。在进入另一个对其它项的配置界面前,以 req.event = 0获取其它报警类型共用的布撤防配置。


Cap-Zoom

设备的变倍(焦)参数及相关属性描述

"times:DESC,DESC[,TOTAL]"
"times:DESC[,,TOTAL]"
变焦能力描述 TCI_CMD_SET_PTZ_POS
TCI_CMD_PTZ_LONG_COMMAND
变焦操作控制指令说明
"times:unknown" 支持,但是变焦倍数未知. APP上只有Z+/Z-按钮
"2lenses" 双目摄像机 TCI_CMD_SET_PTZ_POS
双目摄像机的控制
云台配置
"2lenses;times:xxx" 双目+变焦. 双目和变焦描述的组合,用一个';'隔开 TCI_CMD_SET_PTZ_POS
TCI_CMD_PTZ_LONG_COMMAND
TCI_CMD_GET_PSP
双目+变焦摄像机的控制
其它 不支持  

扩展属性

扩展属性用 ‘’;'`与其它发生隔开


DayNight

是否支持日夜切换

白光灯配置 白光灯规则 红外灯状态
白天灭,夜间亮
白天灭,晚上亮
自动 白天灭。晚上触发移动侦测时亮 白天灭,晚上亮。有移动侦测时灭,并触发白光灯

DeviceType

设备类型。

设备类型规定了设备主要的行为模式。但相关能力配置仍然需要准确描述。例如台灯类别默认有灯、灯光可调、支持定时器,这些能力仍然需要在DoubleLight里配置。

  • DriveRec - 行车记录仪. see also Profile
  • DoorBell - 门铃
  • LockBell - 门锁
  • LampCam -台灯(或"Lamp WebCam")
  • BirdFeeder - 喂鸟器
  • PetFeeder - 喂食器。要支持 TgCloudCmd_sp.h 中喂食器定义的接口 喂食器
  • IPC - 普通网络摄像机 (默认) see also Profile
  • KLM - Kid's Learning Monitor(或称AI伴读宝,但仅在监视功能上增加(并仅支持)坐姿 ECEVENT_SITPOS、入座`x:seated` 、离座 x:off-seat检查,app端增加统计功能)

DoubleLight

是否支持白光灯。(实际应叫 WhiteLight, 从历史)

  • No - 不支持
  • Yes - 支持。TCI_CMD_GET_DOUBLELIGHT_REQ/ TCI_CMD_SET_DOUBLELIGHT_RESP.

    DayNight配置为Auto时,状态与红外灯联动(见DayNight的状态表格), 否则为独立控制。

扩展属性

当设备支持白光灯时,还可以有以下扩展属性(用','分隔)。能力值中具有扩展属性时,Yes可省略。


ExtFlags

扩展功能的位标识

该能力的值为一个无限位整数的16进制字符串表示。这个字符串表示的数值可以超出本机可以表示的最大整数值。

功能 说明
0 为1时表示设备端正确支持了SD卡录像列表中的事件类型
SAvExEvent::event
以前的 iCam365/WeCAM App没有检查设备SD卡录像列表中事件类型成员 SAvExEvent::event, 导致旧的固件中没有正确返回的这个值。新 iCam365/WeCAM APP 的 UI 将要显示使用这个成员。为了与旧的固件作区分,如果固件正确设置了 SAvExEvent::event, 则设置此标志,App按返回值显示具体事件类型;否则只区分是否为事件。
客户自己开发设备和App的,可以忽略此标志或自行约定

例子

ExtFlags = ”0x4001"

更长的例子

ExtFlags = "0x12341234567890abcdef"

假设应用能处理的最大整数类型是uint32,这个字符串表示的值已经溢出。应用要把它解析成3个32位整数的数组:

unsigned int vals[] = { 0x90abcdef, 0x12345678, 0x1234 };

标志的第N位,在数组中对应 vals[N/32] 的 位 (N%32)

bit_n = (vals[n/32] & (1<<(n%32)) ? 1 : 0;

EventSet

设备额外支持或屏蔽的事件集合。

设备按类型,参考硬件配置,会被赋予有一个默认允许的事件集合。集合外的事件会被过滤掉。如果要支持或屏蔽额外的事件,需要在此处报告。

自定义事件需要在此处报告

EventSet的是一个2元或4元素的数组,每两个元素组为一对,每一对的第一个元素表示要开启的事件,第二个元素表示要屏蔽的事件(或者表述为:下标0、2的表示开启,下标1、3的元素表示禁止)。

元素类型可以是一个整数(用第N位表示事件N),也可以是一个字符串(内容为逗号‘’,'或分号';'`分割的事件名列表),还可以是另一个JSON数组(事件名)。

整数用来表达SDK预定义事件,因为SDK只对外提供了事件的数值符号,没有公开名称。

字符串或 JSON 字符串数组用来表达用户扩展的事件。

扩展事件以 "`x:`" 开头,仍然需要先在平台注册

示例

预定义事件

门铃设备默认支持呼叫事件 ECEVENT_DOORBELL,如果要额外支持pir和人形事件,禁用移动侦测(假设。实际门铃默认不支持移动侦测)。要开启和屏蔽的标志:

  • 开启标志: (1<< ECEVENT_PIR(=4)) | (1<<ECEVENT_BODY(=2)) = 16|4 = 20
  • 禁用标志: 1 << ECEVENT_MOTION_DETECTED(=1) = 2
EventSet = [20, 2]

SDK将EventSet上报给平台时会把掩码转成tag数组。例如:

{
"EventSet":[["pir", "body"], ["motion"]]
}

扩展事件

在前例基础上,假设用户定义并注册了两个扩展事件 "`x:earthquake`" 和 "`x:volcano_erpt`", 下面的表达都是有效的

EventSet = [ 20, 2, "x:earthquake;x:valcano_erpt", "" ]
EventSet = [ 20, 2, ["x:earchquake", "x:valcano_erpt"], [] ]
EventSet = [ 20, 2, ["x:earchquake", "x:valcano_erpt"], "" ]

SDK通知给平台的内容

{
"EventSet":[
["pir", "body", "x:earthquake", "x:valcano_erpt"],
["motion"]
]
}

ExtInstructions

(最后更新于 2024-06-28 rev207)

支持的扩展指令集。格式为分号';'(APP端要允许逗号','分隔)隔开的指令名,或者是一个 JSON 数组。

示例:

  • 字符串:"close-device;pbrate;status-led"
  • JSON数组:["close-device", "pbrate", "status-led"]
元素说明支持的指令
close-device 设备开关 TCI_CMD_SET_DEVICE_STATUS
TCI_CMD_GET_DEVICE_STATUS
alarm-bell 警铃设置. 仅当"AlertSound"为"YES"才有效 TCI_CMD_SET_ALARM_BELL
TCI_CMD_GET_ALARM_BELL
pbrate SD卡倍速回放 TCI_CMD_RECORD_PLAYCONTROL 命令的command参数要支持 TCIC_RECORD_PLAY_FORWARD
alarmtone 报警音设置("AlertSound"为”YES“才有效) TCI_CMD_GET_ALARMTONE_CAP
TCI_CMD_SET_ALARMTONE
TCI_CMD_PLAY_ALARMTONE
status-led 状态指示灯 TCI_CMD_SET_LED_STATUS
TCI_CMD_GET_LED_STATUS
voice-prompt 报警音之外的提示音。例如操作提示等,内容由设备自行决定 TCI_CMD_SET_VOICE_PROMPT_STATUS
TCI_CMD_GET_VOICE_PROMPT_STATUS
close-plan 设备关闭计划 TCI_CMD_SET_CLOSE_PLAN
TCI_CMD_GET_CLOSE_PLAN
ai-switch AI功能开关 TCI_CMD_SET_AI
TCI_CMD_GET_AI
ipconfig 手动配置IP地址 TCI_CMD_SET_IPCONFIG
TCI_CMD_GET_IPCONFIG
temper 温度 TCI_CMD_GET_TEMPERATURE_SETTING
TCI_CMD_SET_TEMPERATURE_THRESHOLD
humidity 湿度 TCI_CMD_GET_HUMIDITY_SETTING
TCI_CMD_SET_HUMIDITY_THRESHOLD
humidity 湿度 TCI_CMD_GET_HUMIDITY_SETTING
TCI_CMD_SET_HUMIDITY_THRESHOLD
parking-mon 停车监控设置 TCI_CMD_GET_PARKING_DET
TCI_CMD_SET_PARKING_DET
TCI_CMD_GET_PARKING_MONITOR
TCI_CMD_SET_PARKING_MONITOR
pwr-stgy 能耗模式(2024-06-28 rev207) TCI_CMD_GET_POWER_STRATEGY
TCI_CMD_SET_POWER_STRATEGY
recdays 录像存在的日期(2024-06-28 rev207) TCI_CMD_LIST_RECORDDAYS
selchn 卡回放支持选择回放通道 Tcis_PlayRecord::channel

G-Sensor

是否支持G-Sensor

停车碰撞检测

【2022/10/24】

如果只支持灵敏度设置,可以设置G-Sensor为"scene",并处理 scene=1(GSENSORSCENE::GSENSOR_SCENE_PARKING) 的情形

但推荐使用新的能力值: 在 ExtInstructions 中包含 "parking-mon"


Gps

是否支持Gps


MD-Capabilities

移动侦测能力

  • No - 不支持
  • Default - 支持
  • Sensitivity - 支持灵敏度设置
  • Zone - 支持区域
  • VisibleZone - 支持区域,并且区域可显示
  • Sensitivity,Zone - 同时支持灵敏度和区域设置。
  • Sensitivity,VisibleZone - 支持灵敏度和区域设置。区域可显示

支持时要实现的指令:TCI_CMD_SETMOTIONDETECT_REQ, TCI_CMD_GETMOTIONDETECT_REQ

如果区域可显示(VisibleZone), 需要支持TCI_CMD_GET_MDAREA_STATE, TCI_CMD_SET_MDAREA_STATE

通道选择(2022/12/19)

多通道设备(例如画中画),如果只对某一个通道进行设置,配置要写成数组形式。例如

["No", "Sensitivity,Zone"]

表示要在通道1上进行移动侦测设置


Microphone

是否有麦克风。默认为有,但不能控制。下面的值要明确指定。

附加属性

附加属性以','隔开追加在主属性后面

  • AEC - 设备支持回声消除算法(因此支持全双工对讲)

2023-04-07: 


MultiChannels

多路图像

  • "{n}-{relation}" 支持 n 路视频。

    {relation}为:
    "composed": 多路视频一路音频
    "independ": 多路独立音视频

说明

  • 画中画设备: "2-composed"
  • 双目设备: 不要设置

PIR

是否支持PIR(灵敏度设置)


Profile

用于选择设备支持的服务。内容分公共属性特定属性

特定属性同设备类型相关,同时具体内容取决于需求文档的约定。

Profile的值是一个json字符串(2024/04/28) ,不再使用非格式化的字符串表示(App要保留对旧的设备的支持,目前只有"EyeplusEU"一种无格式取值)

公共属性

  • NoRemoteLiveAccess – 是否禁用远程实时音视频访问
    • 1 不能远程访问实时音视频
    • 0 默认值。可以正常访问
  • NoCloudStorageService – 是否禁用云存服务
    • 1 禁用云存服务
    • 0 默认值。有云服务
  • WxVoIP – 是否支持微信VoIP
    • 1 支持
    • 0 默认值。 不支持
  • NoVideo – 设备是否没有视频能力
    • 1 无视频。因此无实时视频访问/无云存/无AI 以及其它所有同视频相关的功能
      • 如果连音频也没有,配置 Microphone=No
    • 0 默认。有音视频
  • ExtFuncSet – 扩展功能集(Extended Function Set), 其值是一个json数组。

    • "KLM" - 增加学习监视功能(坐姿 ECEVENT_SITPOS、入座`x:seated` 、离座 x:off-seat检查,app端增加统计功能)

    例子: Profile = { "ExtFuncSet":["KLM"] }

特定属性

  • DeviceType = DriveRec

    这种配置用公共属性 ‘'NoRemoteLiveAccess’`代替

  • DeviceType = IPC

    LightSens - Sensor感光能力

    • Star – 星光级
    • Black – 黑光级

      例子: Profile={"LightSens": "Black"}


RecordConf

(是否支持)SD卡录像配置

多个开关值用‘’,'隔开,或写成json数组格式。例如:"res,time-lapse"["res", "time-lpase"]`


RotateVideo

是否支持画面旋转


Resolutions

设备支持的图像质量

图像质量描述项的组合.默认 0HD+1SD. 参见 多码流支持


Screen

设备屏显描述

  • 简单描述方式: "{编码}:{分辨率}:{拉伸标志}[:{旋转}]"
    • {编码} : 可以是 mjpg|h264|h265
    • {分辨率} : {width}x{height}
    • {拉伸标志} - 0:不具拉伸能力; 1:有拉伸能力
    • {旋转} - cw90|cw180|cw270(与 RotateVideo 的取值一样)。app端在编码前要旋转的角度(手机竖屏时为0度)。该配置的可选的。【增加于2023/12/21】

举例

"mjpg:320x240:0:cw90" 要求App抓取320*240的jpeg图片,并且把图像顺时针旋转90度.

"h264:1280x720:1" App可以视网络情况传输 1280*720 或 640*360(或别的分辨率) 的h264图像,图像的长宽比应基本一致。

说明

  1. 传输比设备要求的分辨率大的图像,会消耗带宽和加大设备端处理,没有任何好处。所以App就当避免这种情况。
  2. 当设备不具拉伸能力时,App端应尽量传输与设备端要求大小精确匹配的图像。
  3. 设备有拉伸能力时,App可以传输等于或小于设备要求分辨率的图像,以在清晰度和流畅度间取得平衡(例如在设备端有图像质量选择,或者App根据发送情况自动选择清晰度)
  4. 帧率/码流大小参照IPC的建议
  5. 设备必须支持命令 TCI_CMD_SET_SCREEN_DISPLAY/ TCI_CMD_GET_SCREEN_DISPLAY

Speaker

扬声器属性


SupportPTZ

是否支持云台, 以及云台控制方式和其它属性

要支持云台,设备必须在属性中返回 "Yes", "Relative", "Absolute", "Hybrid" 中的一个值("Yes""Relative"是等效的)【2023-03-31】

其它属性(预置位/守望位等)

如果设备支持云台,能力描述中可以追加其它属性。追加属性放在后面,用','隔开。

多枪一球的联动

【多枪一球的产品,约定有云台的这一路为通道0】

品字形布局、双枪并列的机器,当球与两路枪联动时,如果不另加说明,App默认将两路枪的图像按在数组中出现的顺序左右排列,并将两路图像从逻辑上视为合为一路(一枪)。发送 `TCI_CMD_LOCATE_IN_PIC` 时,x取值基于合成的后的图像。

吕字形双枪一球联动

X/Y的计算方式

Y:计算方式不变。

X:‘X’ = 先按原来的方式计算相对原始图像(通道1或通道2)宽度的比例除以2。对通道1,X=X'; 对通道2,X=X'+0.5`

参数中的channel忽略(可传0,即带云台这一路的通道号)

双目和画中画设备的云台配置说明

传统摄像机,一路视频就对应一个镜头、一路音频、0或一个云台等。命令中用到的channel参数,就意味这样一套实体的组合。

双目和画中画摄像机,存在独立或共享云台(可能还有别的硬件)情形,在描述上会有一些特殊的地方。

  • 如果两个镜头不是随动(独立)的,要用一个长度为2的数组来描述哪一个镜头下可以操纵云台。
    数组元素0和1分别对应画中画设备的通道0、1,双目摄像机的远景和近景。
    云台控制命令中channel01,对应数组下标。

    SupportPTZ = ["No", "Yes"]为例:

SupportPTZ 元素0(No) 元素1(Yes)
画中画 通道0: 不支持云台 通道1 支持云台
双目摄像机 远景: 不支持云台 近景 支持云台
  • 如果两个镜头是随动的(即只有一个云台),描述只需要一个字符串。例如:"Relative,PresetPos"
    操作云台时,channel=0

预置位的实现方式

  1. 云台支持 Absolute属性
    • 设备不支持 PresetPos

      预置位功能完全在APP端实现。APP调用 TCI_CMD_GET_PTZ_POS 获取当前位置并保存为一个预置位,以后调用 TCI_CMD_SET_PTZ_POS 来恢复到预定位置

    • 设备支持PresetPos

      这种配置是为了让APP保存预置位时,调用 TCI_CMD_SET_PSP 通知设备,以便于设备连接第三方控制器(NVR)时预置位信息可以在APP和第三方间保持同步。

  2. 云台支持RelativePresetPos

UDF

用户自定义Feature

这个值用于第三方开发者扩展自己的属性。获取能力集时,这个值透传给App端,App的SDK再返回给应用自行处理。

UDF的值是一个json对象的字符串表示。例如 {"feat1":"value1", "feat2":"value2"}

如果对象中含有一个名为 ext_attrs 的属性,这个属性值会传给平台并在平台端保存。在获取设备列表时可以在 ext_attrs::udf 里得到这个值。从rev320起设备端取消ext_attrs。UDF的所有内容都上报到平台

例子

{
"feat1":"v1",
"feat2":"v2"
}

在App从设备获取能力集时,可以在 "UDF" 下拿到上面的值:

"UDF":{"feat1":"v1","feat2":"v2"}

从平台拉取列表时,可以得到:

"ext_attrs": "{\"udf\":{\"feat1\":\"v1\",\"feat2\":\"v2\"}}"

变焦设备(Cap-Zoom="times:xxx")变倍能力描述

1.变倍能力描述

1.1 语法

本语法用来描述设备所具有的变倍能力的类型(光学/电子放大)、放大倍数和控制方式。

下面公式中的 '+', 空格,[], 引号 是用来表示连接、分隔和常量字符串,不是最终能力字符中一部分

变倍能力 ::= "times:unknown" | {TIMESSTR}
TIMESSTR := "times:" + {DESC},{DESC} [,{DESC}]* [,{TOTALSTEPS}]
DESC ::= EMPTYDESC | {['L'|'E'|'S'] {TIMES} [{STEPLIST} | {STEPS}]}
TOTALSTEPS ::= [{total_steps}] [X{}]
TIMES ::= {times} ['F' {presentation}]
STEPLIST := "@(" + {tlist} + ')'
tlist := t1:t2[:t3[:t4...]]
STEPS ::= '/' + num_of_steps
  • total_steps - 总的变倍步数. 如果单独指定了各级变倍的步数,则不需要这个值. 缺省为总的变倍倍数
  • num_of_steps - 某一级的变倍步数
  • EMPTYDESC - 空字符串,等于不支持变倍(1倍)
  • tlist - 支持的倍数列表
  • ‘'L’- 光学变倍 *'E'- 电子变倍 *'S'- APP模拟电子变倍 *times- 放大倍数, <span style="color:red">浮点类型</span> *presentation-times`的表征放大倍数, 浮点类型。 待解释

1.2 补充说明

  1. 新的固件要使用带字母前缀的 {DESC}
  2. TIMESSTR中,有两个或两个以上的{DESC}

2.举例

  • times:4,1.5

    4倍光学/1.5倍电子,6.0步调整(默认)

  • times:4,2,5

    4倍光学/2倍电子,5步调整。这种步数的描述太粗略,应该采用下面的形式

  • times:L4@(1:1.5:2:3:4),E2/9

    4倍光学变倍,可以分5步控制(在 1x/1.5x/2x/3x/4x 时停下来)

    2倍光学变倍,可以细分9步,每步间隔 (倍数2 - 1)/(步数9 - 1)。 本例中每步分别对应 1x, 1.125x, 1.25x, 1.375x, 1.5x, 1.625x, 1.75x, 1.875x, 2x.

  • times:S4,,

    这个是要求在APP端模拟4倍电子变焦。步数为默认的4步。因为只有一种变焦方式,所以第2个{DESC}为空

  • 2lenses;times:S1.5F3,S4

    这个是双目摄像机,两个镜头各自在APP端模拟1.5倍和4倍电子放大。并且,近景镜头放大到1.5倍时,APP会定位显示到3 -— 这个看效果!!!

变焦设备(Cap-Zoom="times:xxx")操作控制指令说明

变焦控制指令使用现有的云台操作命令,请求结构体不变,但参数增加新的语义。

APP端的UI可能有不同设计,因而操作方式也不一样:

  • Case1: 【变焦倍数可知】用户拖动滑块,请求设备变焦到特定倍数
zoom_cap.png
  • Case2: 用户短按zoom+/zoom-按钮
    • 【变焦倍数可知】设备zoom-in或zoom-out一步(不是一倍。见Cap-Zoom描述),发送命令同 Case1
  • 【变焦倍数未知】使用 TCI_CMD_PTZ_SHORT_COMMAND 命令发送 Tcis_PtzShortCmd, space结构成员中x=y=0, zoom>0表示zoom-in, zoom<0表示zoom-out,设备在执行变焦操作后调动一个定时器(或延时),到时后停止动作
  • Case3:【变焦倍数未知】 用户长按zoom+/zoom-按钮
    • APP使用 TCI_CMD_PTZ_LONG_COMMAND 命令,发送Tcis_PtzCmd 结构。control=TCIC_LENS_ZOOM_IN(23)或TCIC_LENS_ZOOM_OUT(24),设备执行zoom-in或zoom-out动作。用户释放按钮时control=TCIC_PTZ_STOP(0),设备动作停止。

双目摄像机(Cap-Zoom="2lenses")的控制

双目摄像机(Cap-Zoom = "2lenses"),两个镜头的切换,视为2倍变焦摄像机在1x和2x间做变倍操作。

使用 TCI_CMD_SET_PTZ_POS 指令,参数 PtzPosz0.01.0,分别对应APP界面上的两个快捷按钮【近景】和【远景】。

双目摄像机镜头切换时在视频流中插入标志

void TciSendLensSwitchFlag(int channel, int stream);
#define TciSendLensSwitchFlag(channel, stream)

切换镜头时,要在新的镜头的第一帧前调用 TciSendLensSwitchFlag() 插入一个标志帧。

在APP端会收到一个 FRAMEINFO_t结构,其成员 flags = 1,其余皆为0.

双目+变焦摄像机的控制

【双目+变焦】 摄像机,可以有两种控制UI:

  1. APP上只有变焦界面,对用户隐藏双目切换操作。

    设备按普通变焦像机上报能力(Cap-Zoom="times:xxx")和响应 TCI_CMD_SET_PTZ_POS 指令

  2. APP上有变焦和远/近景切换界面。

    设备要上报能力 Cap-Zoom="2lenses;times:xxxx"(双目和变焦能力的组合,用';'隔开),响应 TCI_CMD_SET_PTZ_POS 指令

    远/近景按钮对应的变倍位置z不再是固定的0.01.0,而是通过指令 TCI_CMD_GET_PSP 获取

多码流(Resolutions)支持

此处码流的概念,定义为某种质量的图像输出。选择一种码流,即是选择一种不同的图像质量(分辨率/fps/bitrate等的不同)。 双码流设备支持同时输出两种不同质量的码流。 三码流设备可以输出3种不同质量的码流,但不一定有能力同时输出。当不能同时输出时,靠切换某一路码流的质量实现。

1.码流(质量)描述

1.1 概念

  • 质量组合: 设备可以输出的图像质量。由质量描述项,按质量从高到低的顺序,用‘’+'`连接.
  • 质量描述项: 由码流编号连接质量描述符构成。
  • 码流编号0, 1, 2, ...,低的编号对应更高的分辨率
  • 质量描述符:
SD -- 标清
HD -- 高清
FHD -- 全高清 ==> 显示为 "超清" [2022/10/24]
UHD -- 超高清 ==> 显示为 "超清" [2022/10/24]
WQHD -- 极清

质量描述符不一定限于分辨率。例如可能是HD12fpsHD30fpsPrefer等任意字符串。其意义由固件自行解释,并与APP约定在UI上提示的方式

质量描述项举例:

  • 0HD: 表示码流0上的高清图像
  • 1SD: 表示码流1上的标清图像

质量组合举例:

0HD+1SD: 设备只支持双码流,在码流0上输出高清,码流1上输出标清 0FHD+1HD+2SD: 设备支持3路码流同时编码, 分别在码流0/1/2上输出全高清/高清/标清图像 0FHD+1HD+1SD: 设备支持3种质量,但同时只能编码两路图像。它的码流0固定为FHD,码流1可以为SD或HD。

2.码流选择命令接口

2.1 当前双码流设备的码流选择逻辑

  1. APP发送 TCI_CMD_SETSTREAMCTRL_REQ 命令,在命令请求里携带质量参数quality。取值TCIC_QUALITY_MAX(1)TCIC_QUALITY_MIN(5), 分别对应设备的高分辨率(0)和低分辨率码流(1)
  2. 设备SDK内部处理此请求(不通知固件应用层),对高分请求发送码流0的数据,低分请求发送码流1数据

2.2 修改后的逻辑

修改后的逻辑使用同样的命令和quality参数。但quality的值会映射到质量描述项而不是码流。

2.2.1 质量常数

为了兼容旧实现,保留原有的图像质量常数定义。

typedef enum
{
//TCIC_QUALITY_UNKNOWN = 0x00,
TCIC_QUALITY_MAX = 0x01, // 最高质量
TCIC_QUALITY_HIGH = 0x02,
TCIC_QUALITY_MIDDLE = 0x03,
TCIC_QUALITY_LOW = 0x04,
TCIC_QUALITY_MIN = 0x05 // 最低质量
ENUM_QUALITY_LEVEL
doxygen 里匿名变量的占位符。定义为空,仅为了生成文档用
@ TCIC_QUALITY_MIN
最低质量
@ TCIC_QUALITY_MAX
最高质量

暂时最多支持5种质量。质量常数与码流的对应关系,要看设备的Resolutions能力。

2.2.2 质量常数<=>质量描述项

使用索引来引用质量描述项是最简单的。但为了兼容,需要使用一种更复杂的映射方式:

  • 如果设备支持N种质量,下表中第3列包含数字N的,其对应的质量常数会被用来标识N种质量中的一种。
质量常数 含义 设备支持的码流(质量)数
TCIC_QUALITY_MAX 最高质量 2,3,4,5
TCIC_QUALITY_HIGH 4,5
TCIC_QUALITY_MIDDLE 中等质量 3,4,5
TCIC_QUALITY_LOW 5
TCIC_QUALITY_MIN 最低质量 2,3,4,5

例如,设备支持3种质量(码流),则会用到3种质量常数TCIC_QUALITY_MAX/TCIC_QUALITY_MIDDLE/TCIC_QUALITY_MIN,分别对应设备上报的Resolutions中的第1/2/3种质量。

2.2.3 APP行为

APP收到设备的Resolutions能力后,忽略质量描述项前面的数字(注意可能存在旧的固件没有数字)。

将描述符转成文字在UI上显示

根据描述项数目,确定每个描述项对应的质量常数(如前表)

用户在UI选择 高清/标清/... 时,APP在 TCI_CMD_SETSTREAMCTRL_REQ 命令的quality中传入相应的质量常数

2.2.4 设备行为

SDK收到质量选择命令,如果请求的质量对应的码流下有多个质量设置,则将质量常数转换为质量描述项, 调用应用的TciCB::switch_quality(int channel, int stream, const char *qstr) 回调。

参数 stream/qstr对应Resolutions中某一项的值。例如 "0FHD"对应stream=0, qstr="FHD".

设备检查对应码流的质量设置是否与请求一致,如果不一致则修改之。

2.3 举例

设备能力: 0FHD+1HD+1SD

质量常数和设备端对应的码流/质量:

质量描述项 质量常数 APP显示 当前设置
0FHD TCIC_QUALITY_MAX 全高清 *
1HD TCIC_QUALITY_MIDDLE 高清 *
1SD TCIC_QUALITY_MIN 标清(或流畅)

假设设备当前设置为:

  • 码流0 - FHD
  • 码流1-HD

用户打开APP时,默认请求的高清图像。

  1. 现在用户在APP上选择【流畅】, APP在 TCI_CMD_SETSTREAMCTRL_REQ 命令的 quality参数中传入 TCIC_QUALITY_MIN
  2. TCIC_QUALITY_MIN对应的质量描述项1SD(码流为1,支持HDSD两种质量)。SDK调用TciCB::switch_quality(0, 1, "SD"),固件知道当前质量为高清,因此将码流1的质量设为标清。
  3. SDK将码流1的数据传给APP。
  4. 如果用户选择【全高清】。因为对应的码流0只支持一种质量,SDK不会将此命令传给固件,而是直接传送码流0的数据给APP。