交互场景
一、典型业务场景
场景一:首次接入新摄像头
客户网点新装一台 IPC,接入平台开始上传画面。
| 步骤 | 操作 | 平台行为 |
|---|---|---|
| ① | 摄像头 web 界面填写国标 SIP 参数(server-id / domain / 端口 / 设备编号 / 密码) | — |
| ② | 摄像头主动 REGISTER | 平台 401 nonce 挑战 |
| ③ | 摄像头重发携 Digest | 验证通过 + 设备状态置 ONLINE + 发布上线事件 |
| ④ | 管理员前端点击"同步目录" | 平台发 Catalog Query |
| ⑤ | 设备 NOTIFY 回通道列表(可能分批) | 平台按 SN 聚合 + 落库通道 |
| ⑥ | 行政区划自动建分组 | 按 civilCode 自动归类到分组树 |
场景二:实时点播一路 IPC
操作员在监控大屏上点开一个通道实时画面。
子码流场景
若网络受限或同屏多路时切换子码流,前提是通道支持双码流。 SDP 中同时下发多厂商兼容字段(streamnumber + streamprofile + i=Stream:1)以适配海康/大华/宇视。
场景三:回放上周某段视频
| 步骤 | 操作 | 平台行为 |
|---|---|---|
| ① | 选定通道 + 时间区间 → 查询录像 | 平台向设备发 RecordInfo Query |
| ② | 平台返回 sn,前端轮询拉结果 | 设备分批 NOTIFY,平台按 SN 聚合 |
| ③ | 选定具体录像段 → 启动回放 | 起 INVITE Playback(s=Playback / t=startUnix endUnix) |
| ④ | 前端 ws-flv 播放 | 与点播一致 |
| ⑤ | 暂停 / 快进 / 拖动 | 平台发 INFO MANSRTSP(PAUSE / SCALE / Range) |
场景四:执法记录仪 GPS 轨迹监控
移动单兵设备每分钟上报 GPS,平台显示运动轨迹。
| 步骤 | 操作 | 平台行为 |
|---|---|---|
| ① | 管理员开启该设备的 GPS 订阅(interval=60) | 平台发 SUBSCRIBE Event=MobilePosition |
| ② | 设备每 60s NOTIFY 一次位置 | 平台解析 Time / 经/纬/速/向/海拔 |
| ③ | 业务层校验 WGS84 坐标合理性 | 经度 ∈ [-180,180] / 纬度 ∈ [-90,90] 越界直接丢弃 |
| ④ | 更新通道最近位置 | 入库经/纬/速/向/海拔/最近上报时间 |
| ⑤ | 订阅自动续约 | 平台后台任务每 30 分钟扫描,优先 in-dialog refresh |
MobilePosition 字段
GB28181 NOTIFY 报文携带:Time / Longitude / Latitude / Speed(km/h) / Direction(0-360°) / Altitude(米)。 固定摄像头无 GPS 硬件时订阅无响应,仅适用于车载 / 单兵 / 无人机等移动终端。
场景五:周末自动录像归档
工地每周末 0:00-8:00 自动录制重点通道,归档到 OSS 保留 30 天。
| 步骤 | 操作 | 平台行为 |
|---|---|---|
| ① | 管理员创建录像计划(cron + duration + retainDays) | 计划入库 |
| ② | 计划到点 | 后台任务每 60s 扫描"next_fire_time ≤ now" |
| ③ | 阶段 1 同步:起回放 → 等流就绪 → 开启录制 | 立即返回,不阻塞工作线程 |
| ④ | 阶段 2 异步(duration+5s 后自动回调) | 停止录制 → MP4 上传 OSS → 删本地临时文件 → 更新归档状态为完成 |
| ⑤ | 到达保留期 | 平台后台清理任务每天凌晨 02:00 清理 OSS + 数据库记录 |
长录像不占线程的设计
平台把执行拆为两阶段,通过定时器异步回调收尾,避免直接阻塞工作线程数小时。 即使同时有多个长录像任务并发,工作线程池也不会被耗尽。
场景六:智能告警 + AI 事件联动
摄像头本地 AI 检测到入侵 → 平台收到智能告警 → 触发下游工单 / 短信。
AI 事件过滤
下游 Spring 事件监听里按 AlarmMethod=5 AND AlarmType IN (2,5,6,7,8,12) 过滤典型视频分析事件: 2=运动 / 5=绊线 / 6=入侵 / 7=逆行 / 8=徘徊 / 12=快速移动。
场景七:运维人员手动抓图存档
巡查时点击"截图",留档到 OSS。
| 步骤 | 操作 | 平台行为 |
|---|---|---|
| ① | 前端触发抓图(channelId) | 平台业务层接收 |
| ② | 检查是否有进行中的直播会话 | 有 → 直接调流媒体抓帧 |
| ③ | 若无现存流 → 自动开流 | 等待流就绪(最多 5s) + 二次校验 |
| ④ | 取关键帧 jpeg byte[] | 流媒体返回图像数据 |
| ⑤ | 上传 OSS | 按"vms/snapshot/{年}/{月}/{日}/{channelId}-{uuid}.jpg" 命名 |
| ⑥ | 自动开流场景下关流 | 释放 SSRC |
| ⑦ | 7 天后过期清理 | 后台任务每天凌晨 02:30 清理 |
场景八:接入区/市级公安上级平台
把本平台作为下级注册到上级国标平台,响应上级 Catalog Query / SUBSCRIBE / INVITE(被点播)/ Control 转发 / BYE。
qop=auth 兼容(雪亮工程必需)
部分上级强制 qop=auth(RFC 2617 增强 Digest),下级若仅实现 RFC 2069 简化模式 (response = MD5(HA1:nonce:HA2))会陷入 401 循环。本实现解析 WWW-Authenticate.qop,支持两种模式自动切换(nc/cnonce 自动生成), 并按 RFC 3261 §22.4 在 401 二次注册时复用首次 REGISTER 的 Call-ID,避免严格上级再次返回 401。
上级被点播 + BYE 的三路收敛
上级 INVITE 命中本平台后,业务层 CascadeInviteAcceptor 申请 SSRC、起本端 RTP 接收、通知流媒体 startSendRtp 向上转发,200 OK 携带 SDP 完成 dialog 建立,session 落库 sessionType=cascade + sipCallId=上级 Call-ID。关闭路径"三路收敛"任意一路触发即可:上级 BYE(按 Call-ID 反查)/ 下级断流(SSRC 反查 + 主动 stopSendRtp + 清上级 dialog)/ ACK 超时 + GC 兜底(默认 2h)。已终止状态接到后续路径直接 no-op,保证幂等。
二、数据流向总览
三、常见问题
Q:点播延迟为什么有 2-3 秒?
走 RTP/PS → 流媒体 → WS-FLV 链路,首帧延迟主要由设备首关键帧间隔(典型 1-2s) + 流媒体拉流缓冲组成。WebRTC 输出可降到 500ms 内,但需要部署 STUN/TURN 服务。
Q:为什么订阅 MobilePosition 后没收到 NOTIFY?
90% 概率是设备本身不带 GPS(固定摄像头通常无 GPS)。其余可能是 Event 头不兼容(部分海康老固件用 Catalog;id=xx),可通过配置项覆盖。
Q:Catalog 同步偶尔丢通道怎么办?
设备分批 NOTIFY 时偶有 UDP 丢包,导致已收数 < 总数。30s 内不再聚合则触发兜底按当前已收 items 完成同步。可手动再次"同步目录"补全。
Q:CLOSE_PENDING 会一直累积吗?
不会。后台重试任务每 5 分钟扫描重试关流,任一终止条件触发转 EXPIRED:
- 累积时间超过会话 TTL(默认 2h)
- 单个会话连续失败 ≥ 5 次(可配置)
EXPIRED 是终态,SQL 报表可识别"长期关流失败"的孤立会话,运维介入排查流媒体健康。
Q:跨租户能看到别的租户设备吗?
不能。BladeX 框架租户拦截器自动注入 SQL 条件拦截所有数据库查询。 协议层入站 SIP 报文经反查租户后注入上下文,确保跨租户隔离。 异步查询缓存额外做租户 ID 比对,跨租户读取一律返回 null。
Q:设备校时为什么用北京时间?能改吗?
GB28181-2016 §9.10 明确规定校时标准时间是北京时间(UTC+8),协议不携带时区信息。 本实现强制按北京时区构造时间字符串,不受平台服务器系统时区影响(云端跨区部署常见)。 不建议改,改了会与国标合规设备时间冲突。
Q:订阅会丢吗?设备断电再上电会怎样?
订阅在数据库持久化,设备 REGISTER 上线时平台自动重发该设备所有 ACTIVE 订阅, 不依赖设备端订阅状态记忆,即使设备清空全部上下文也能恢复。
Q:抓图和录像存哪里?
走 OSS 抽象,后端可切换 MinIO / 阿里云 / 腾讯云 / 华为云 / 七牛云,业务代码无感知。 下载 / 抓图提供 */url 端点返回 OSS 外链(JSON),前端拿到后直连 OSS,平台不中转流量(亦保留 */file 302 端点);前端优先用 */url,避免 blob 直拉跟随 302 时把平台凭证发往 OSS 域。
