连锁门店要解决的是收银台能看清、打烊后还能看、门口少装一路、货架盲区能转过去、远程能喊一声店员。这五项分别对应码流、夜视模式、广角能力、云台指令和语音对讲。能不能用,以该设备当前的能力集和已开通服务为准。
采购备注上的五个词,上线后按钮对不上
区域督导在群里丢来一张表:每家店门口、收银台、后仓各一台,备注写着「高清、夜视、广角、云台、双向语音」。集成同学按备注把五个按钮都做进巡店页。验收那天,收银台一切高清就卡,后仓切「全彩」接口直接失败,门口那台云台键点了没反应,对讲按钮亮着,店里听不见人声。
返工点通常不在播放器。摄像机已经在网上,配网 App 里也能看。业务系统要的是:这一路到底有哪几项,页面上就只给哪几项。五项写成统一套餐下发,缺能力的通道会在联调时一颗颗爆出来。
这篇把核对收成一张点位表。读完可以做完这几件事:
- 按收银台、夜间、门口、货架、远程喊人,决定这一路优先要哪一项。
- 用能力集判断该通道是否真有夜视模式、广角、云台、语音对讲。
- 高清和标清按码流分开用,宫格和单路点开不要用同一档。
- 只在能力允许时读夜视模式、转一次云台、开一次语音对讲。
场景:连锁门店巡店页给不同点位配能力,而不是五店同一套按钮。核心接口:
listDeviceAbility、getNightVisionMode、getKitToken,云台用controlMovePTZ或轻应用云台控件,语音对讲用预览成功后的startTalk()。交付物:一张按通道打勾的五项清单,以及只对打勾项开放的页面控件。
这五项在设备和接口里各是什么
五个词里,只有「高清」主要是取流参数。其余四项先看能力集里有没有对应标识,再决定后台出不出现开关。
高清。集成时的高清和标清是两条码流。createDeviceFlvLive在实时预览下返回标清flv和高清flvHD。HLS 用bindDeviceLive的streamId:0是高清主码流,1是标清辅码流。轻应用播放器同样用streamId,0高清,1标清。能力集文档里有1080P这项,说明写的是「设备支持的最大能力集」。把它当作分辨率相关参考即可。页面上的清晰度切换,仍按码流走。某一型号的像素、码率以该设备能力集为准,不按采购备注承诺。
夜视。能切换夜视模式的前提是能力集里有NVM。getNightVisionMode返回当前mode,以及这台设备支持的modes。文档列出的取值是Intelligent、FullColor、Infrared、Off、LowLight、SmartLowLight,对应智能夜视、全彩夜视、红外夜视、关闭、微光夜视、智能微光夜视。设备实际支持哪几个,只认返回的modes。InfraredLight表示设备有红外灯,WhiteLight表示有白光灯,LEDSW是补光灯开关。灯在不在,和「后台能不能改夜视模式」是两件事。模式切换只在有NVM时提供。
广角。能力集里的广角标识是WideAngle。全景图是另一项Panorama。广角描述的是镜头覆盖,接口不返回视场角数值,也不能靠这个标识推算「一路能替代几路」。装多高、离收银台多远,仍要到店里看画面。广角把脸和价签拍小之后,再切高清主码流,补的是码流清晰度,不把人拉回镜头正中。
云台。云台是短指令,不是一条更清晰的流。listDeviceAbility的能力字符串按英文逗号分隔。文档里和转动相关的有:PTZ(云台及数字变倍)、PT(云台)、PT1(四向,不做放大缩小和数字变倍)、PT2(只有左右)。controlMovePTZ的备注要求设备具备PT或PTZ。operation里0到3是上下左右,4到7是斜向,8、9是放大缩小,10是停止。PT1不要发8和9,PT2只保留左右和停止。SmartTrack(智能追踪)、TimedCruise(定时巡航)、CollectionPoint(收藏点)是另外的能力项。页面上有方向键,不表示这台机会自己跟着人转。
双向语音。语音对讲看AudioTalk或AudioTalkV1。AudioEncodeOff表示无音频输入,实时流里听不到店内声音。TalkSoundModify是对讲音量调节,有它才做音量档位。轻应用里语音对讲是player.startTalk()。startTalk("video")是视频对讲,要设备支持可视对讲,和「远程喊一声店员」不是同一条链路。云直播适合把一条链接发出去看画面,对讲不走这条路径。自有 App 用 OpenSDK 时,先判断能力集包含AudioTalk或AudioTalkV1,并在预览已经成功之后再开对讲。
能力集分三类,查的时候不要只看设备那一条字符串。I 类(如InfraredLight、WhiteLight)标在设备上。II 类(如NVM、WideAngle、PTZ)在单通道设备上标在设备上,多通道设备标在通道上。III 类(如AudioTalk)设备或通道都可能出现。稳妥做法是把该设备的ability和目标通道的channelAbility合在一起再判断。
用门店点位决定要不要,用能力集决定能不能
先定这一路要解决的事,再查能力集。同一家店的三台摄像机,清单应当不一样。
| 点位 | 值班员真正要的 | 优先能力 | 能力集里先找 | 集成时怎么验收 |
|---|---|---|---|---|
| 收银台、价签、小票 | 看清人和小字 | 高清主码流 | 码流可切;1080P只作参考 | 单路streamId=0或flvHD能看清该工位 |
| 打烊后门店、后仓、夜间通道 | 灯灭了仍能看 | 夜视模式 | NVM;灯看InfraredLight/WhiteLight | getNightVisionMode返回的modes里选定一项 |
| 门口、卖场中部、希望少装机 | 一路盖住更大范围 | 广角 | WideAngle | 现场画面盖住门口主通道;人脸过小就另加近景 |
| 货架通道、需要转到盲区 | 值班员把镜头转过去 | 云台 | PT/PTZ/PT1/PT2 | 发一次方向,再发10停止,画面里镜头动一下再停 |
| 督导远程喊店员 | 店里听得见、这边听得见店 | 双向语音 | AudioTalk或AudioTalkV1 | 预览已出后startTalk(),店内扬声器有声,回调出现talkStart |
点位和能力可以叠加,但不要五项都当成默认项。收银台固定机位,优先高清近景。门口如果已经用广角盖住通道,云台常常是多余的,镜头还容易被碰偏。夜间后仓优先确认NVM和modes,再决定要不要全彩。远程喊人只放在有人值守、需要开口的那一路,不必每格都挂对讲。
判断顺序可以记成一句:点位决定「要不要」,能力集决定「能不能」,modes和一次真实预览决定「页面上显示哪几个选项」。样机在配网 App 里能看,只说明消费端账号下有画面。巡店后台要的是当前这个开发者应用已经绑定,并且listDeviceAbility查到的是这一台、这一通道。
listDeviceAbility的请求地址是https://openapi.lechange.cn/openapi/listDeviceAbility。deviceList里带deviceId和channelList(通道号逗号分隔,查一路就传该通道号)。返回里用设备ability和通道channelAbility。通道号从设备列表拿,例如listDeviceDetailsByPage,不要整店写死"0"。
上线前先排掉的错配
下面这些在验收周最常见。先改清单或隐藏按钮,再查播放器。
| 现象 | 常见根因 | 先做什么 |
|---|---|---|
| 采购备注写了五项,后台缺按钮或一点就失败 | 按型号口头承诺,没查这台的能力集 | 对该通道跑listDeviceAbility,缺标识就不要做对应控件 |
| 四宫格一起切高清后卡顿、带宽告警 | 主码流并发上去了 | 宫格用streamId=1,只有点开的那一路用0;到控制台看流量和带宽 |
| 设置夜视返回失败,或模式和现场不一致 | 没有NVM,或mode不在该设备modes里 | 先getNightVisionMode,下拉框只渲染返回的modes |
| 有红外灯,后台却没有夜视开关 | 把InfraredLight当成NVM | 灯和模式分开显示;没有NVM就不提供切换 |
| 广角装完,收银台小票仍看不清 | 视场大,人或价签在画面边缘变得很小 | 广角负责覆盖,近景另用一路高清;主码流不改变构图 |
| 云台键无效,或只有左右能动 | 没有PT/PTZ/PT1/PT2,或PT2被发了上下 | 按标识收窄方向键;PT1去掉变倍 |
| 指令返回成功,镜头几乎不动 | duration太短,或只发了方向没发停止 | 按下发方向,松开发operation=10 |
对讲无声,或轻应用2004 | 预览还没起来,或浏览器没有麦克风权限 | 先play(),出现playStart再startTalk() |
轻应用2002、2008 | 已经有一路语音对讲,或对讲忙线 | 同一时刻只保留一路startTalk(),结束用stopTalk() |
| 直播链接能看,对讲没有 | 这条路径走的是云直播 | 对讲改到轻应用或 OpenSDK,并确认AudioTalk/AudioTalkV1 |
| 能喊话,听不到店里 | 能力集有AudioEncodeOff | 这一路无法承诺「双向都听得见」;以能力集为准 |
还有一类错配出在权限,不在摄像机。夜视模式查询和设置,子账号最小权限是Config,资源形式为cam:序列号:通道号。浏览器里只放播放用的kitToken。appSecret和管理员accessToken留在服务端。
同一套接口怎么进巡店后台
这些调用共用一个开发者应用的appId:设备绑定、能力查询、实时取流、夜视模式、云台和对讲,都走https://openapi.lechange.cn/openapi/{method}。门店台账和页面权限留在业务系统,签名和令牌留在服务端。乐橙云开放平台的控制台 ,应用信息从这里查看。
终端不一样,五项的接法也不一样。
| 巡店入口 | 接法 | 五项里怎么落 |
|---|---|---|
| 已有 Web 后台、H5 | 轻应用imouPlayer | 清晰度用streamId;云台、对讲做成控件。光学变焦入口要取流能力里带ZoomFocus或PTZ才显示 |
| 自有 Android、iOS、桌面客户端 | OpenSDK | 预览窗口自己布局;对讲前确认AudioTalk或AudioTalkV1,并先开预览。窗口类名以 OpenSDK 文档和 Demo 为准 |
| 只给店长一条外链看一眼 | 云直播 | 适合看画面。对讲不要算进这条路径 |
getKitToken的type和播放器的type不是同一套枚举。播放凭证里0是这些权限一起给,1实时预览,2录像回放,6云台转动。播放器type里1是直播,2是回放。凭证有效期 2 小时,服务端缓存约 1 小时即可,不必每次点击都重新申请。
签名按现行开发规范:原始串是time:{time},nonce:{nonce},appSecret:{appSecret},先对appSecret做 SHA-256 得到小写十六进制密钥,再对原始串做 HMAC-SHA256,最后 Base64。time与服务器相差不能超过 5 分钟,nonce5 分钟内不能重复。用文档里的标准案例在本地对一下计算结果。
第一版后台只做「清单打勾 + 一路预览」。夜视写入、云台、对讲都叠在预览已经出来之后。五项同时开工,定位问题时分不清是能力缺失还是页面写错。
从一台样机验到五项可开关
用一家店的收银台和后仓两台样机即可。收银台验收高清,后仓验收夜视;云台和对讲只在能力集打勾的那一台做。广角以现场覆盖为准,接口侧只确认有没有WideAngle。
第一步:拿到应用凭证并绑定样机
在控制台「我的应用 → 应用信息」读取appId和appSecret,写入服务端环境变量。设备先完成配网,再绑到当前开发者账号。配网 App 里能预览,只说明设备在那个账号下;开放接口要的是当前应用账号已经绑定。
成功的样子是服务端能拿到管理员accessToken,设备列表里能看到样机序列号和通道号。失败时先看签名案例是否对得上,以及time、nonce是否触发SN1002、SN1005。
第二步:合成能力集,给五项打勾
channelList传上一步拿到的通道号。下面把设备能力和通道能力并成一个集合。缺标识就保持关闭,不要给默认开。
functionsplitTags(text){returnString(text||'').split(',').map((s)=>s.trim()).filter(Boolean);}functionscoreStoreChannel(deviceAbility,channelAbility){consttags=newSet([...splitTags(deviceAbility),...splitTags(channelAbility)]);consthit=(names)=>names.filter((name)=>tags.has(name));constptz=hit(['PTZ','PT','PT1','PT2']);return{nightMode:tags.has('NVM'),lamps:hit(['InfraredLight','WhiteLight','LEDSW']),wideAngle:tags.has('WideAngle'),ptz,talk:hit(['AudioTalk','AudioTalkV1']),noAudioIn:tags.has('AudioEncodeOff'),};}成功的样子是收银台、后仓各打出一份结果:夜视、广角、云台、对讲各自是开或关。code为"0"只说明查询成功。某一项为关,就是这一路没有该项,不必再下发对应指令。高清不在这个函数里判断,它走下一步的码流。
第三步:有 NVM 才读夜视模式
仅当nightMode === true时调用getNightVisionMode。参数是token、deviceId、channelId。返回的modes是这台设备允许的集合,页面下拉框只渲染这份数组。
需要切换时再调setNightVisionMode,mode必须先出现在modes里。文档要求设置前先查询。全彩、智能、微光都不是每台设备的默认项。没有NVM的通道,夜间验收改成「现场关灯看红外或白光实际画面」,后台不提供模式开关。
成功的样子是后仓返回mode和一组modes。若业务要改模式,改完再查一次,mode与刚写入的值一致,并且关灯后的画面和所选模式相符。以该设备能力集与开通服务为准。
第四步:收银台出高清,宫格留标清
Web 巡店用轻应用时,服务端对收银台通道签发getKitToken。单路点开用高清,多路宫格用标清。播放器type用1(直播)。
constplayer=newimouPlayer({id:'cashier',width:800,height:450,deviceId:DEVICE_ID,channelId:CHANNEL_ID,token:KIT_TOKEN,type:1,streamId:0,});player.play();宫格把streamId改成1,并静音,避免多路声音叠在一起。成功的样子是收银台出现playStart,小票或人脸达到值班员能看清的程度。宫格同时改成0之后变卡,先把宫格退回1,再看控制台带宽,而不是先换摄像机。
若业务用 FLV 自播,同一通道取flvHD给收银台、flv给宫格。HLS 则streamId取0或1,HTTPS 页面要用getLiveStreamInfo里的 HTTPS 地址。直播地址只在服务端签发。
第五步:能力集允许时,转一下再停下
ptz数组为空,方向键不渲染。有PT2且没有PT/PTZ/PT1时,只留左右。有PT1且没有PT/PTZ时,不要发变倍。
轻应用可以把云台放进控件,播放凭证需要包含云台权限(type为6或0)。自研按钮则走controlMovePTZ:按下发一个短duration和方向,松开发operation为10。成功的样子是两次调用code都为"0",画面里镜头动一下再停。DV1019是能力集不支持,DV1026是设备不支持该调用。出现这两个码,回到第二步核对标识,不要重试刷接口。
第六步:预览已经在播,再开语音对讲
talk为空,或者noAudioIn为真,对讲按钮无法承诺「两边都听得见」。noAudioIn为真时,至少听店内这一侧不成立。
轻应用在playStart之后调用语音对讲,不要传"video"。
player.startTalk();// 结束:player.stopTalk();成功的样子是回调talkStart,店内扬声器能听到值班员。结束时talkEnd。2004先看麦克风权限,2002和2008先保证没有第二路对讲占线。OpenSDK 侧同样是:能力集含AudioTalk或AudioTalkV1,预览成功后再playTalk。类名和参数以 OpenSDK 文档及 Demo 为准。
广角没有第六步里的运行时开关。wideAngle为真,只说明该通道带广角能力。验收仍是站在门口看主通道有没有进画面,收银台要不要另加近景。
按钮跟着能力集走
五项按点位打开:收银台走高清主码流,夜间通道先看NVM和modes,门口确认WideAngle,货架只在有PT/PTZ/PT1/PT2时给方向键,需要喊人的那一路在预览成功后调用startTalk()。页面按钮跟着能力集走,采购备注只用来提需求。
只在配网 App 里看自己的设备、并不嵌进巡店或督导系统的,不必接这套接口。门店对讲涉及店员是否知情、谁有权开口,按企业自己的权限和告知来做。夜视、云台、对讲、清晰度是否可用,以该设备能力集和已开通服务为准。