# 通用视频软件视频协议 本文档定义通用视频软件与平台之间的视频相关 MQTT 协议。 本版本仅将实时视频心跳和实时播放地址获取作为联调依据。录像查询、录像播放章节为预留章节,暂缓实现,本版本不作为联调依据。 ## 1. MQTT 连接 连接参数由软件运行目录下的 `config.json` 提供: | 字段 | 说明 | | --- | --- | | `mqtt_server.address` | MQTT 服务器地址 | | `mqtt_server.port` | MQTT 服务器端口 | | `mqtt_server.client_id` | MQTT client id | | `mqtt_server.username` | MQTT 用户名 | | `mqtt_server.password` | MQTT 密码 | | `mqtt_server.veh_id` | 设备/车辆唯一编号,协议 topic 中记为 `{vid}` | | `mqtt_server.topic_profile` | topic 配置,默认 `protocol`,可切换为 `legacy` | ## 2. MQTT Topic 默认 `topic_profile=protocol` 时使用协议主题: | 用途 | Topic | | --- | --- | | 实时视频状态上报 | `/zxwl/sweeper/{vid}/video/status` | | 实时播放地址获取 | `/zxwl/sweeper/{vid}/video/query` | | 录像段查询,预留 | `/zxwl/sweeper/{vid}/record/query` | | 录像段播放,预留 | `/zxwl/sweeper/{vid}/record/play` | 兼容 `topic_profile=legacy` 时使用旧主题: | 用途 | Topic | | --- | --- | | 实时视频状态上报 | `/kun/vehicle/video/status/{vid}` | | 实时播放地址获取 | `/kun/vehicle/video/request/{vid}` | | 录像段查询,预留 | `/kun/vehicle/video/record/query/{vid}` | | 录像段播放,预留 | `/kun/vehicle/video/record/play/{vid}` | ## 3. 实时视频状态上报 ### 3.1 数据协议 | 项目 | 内容 | | --- | --- | | 协议 | MQTT + JSON | | 发送方 | 视频软件 | | 接收方 | 平台 | | 上报频率 | 默认 1s 一次,由 `mqtt_server.mqtt_heart_threshold` 配置 | | 默认 topic | `/zxwl/sweeper/{vid}/video/status` | ### 3.2 消息内容 | 字段 | 类型 | 说明 | | --- | --- | --- | | `timestamp` | long | 上报时间戳,13 位毫秒 | | `status` | int | `0`:未推流或全部异常;`1`:全部实时通道正常;`2`:部分实时通道异常 | | `channels` | array | 各通道实时推流状态 | `channels` 对象结构: | 字段 | 类型 | 说明 | | --- | --- | --- | | `loc` | int | 摄像头位置索引,0-7 | | `running` | bool | 当前实时推流是否正常 | | `reason` | string/null | 不正常时的原因;正常时为 `null` | 服务启动默认不向 live SRS 外推实时流。未收到 `switch=1` 前,心跳中通道 `running=false`,`reason` 表示实时推流未开启。 ### 3.3 示例 ```json { "timestamp": 1744247201000, "status": 0, "channels": [ { "loc": 0, "running": false, "reason": "Live stream not requested" } ] } ``` ## 4. 实时播放地址获取 ### 4.1 数据协议 | 项目 | 内容 | | --- | --- | | 协议 | MQTT + JSON | | 请求方 | 平台 | | 应答方 | 视频软件 | | 默认 topic | `/zxwl/sweeper/{vid}/video/query` | 请求和应答使用同一个 topic,通过 `type` 和 `seqNo` 区分。 ### 4.2 请求内容 | 字段 | 类型 | 说明 | | --- | --- | --- | | `type` | string | 固定为 `request` | | `seqNo` | long/string | 应答流水号,请求和应答保持一致 | | `data` | object | 请求内容 | `data` 对象结构: | 字段 | 类型 | 说明 | | --- | --- | --- | | `switch` | int | `1`:开始向服务器推实时视频并返回播放 URL;`0`:停止向服务器推实时视频,避免持续消耗外网流量 | ### 4.3 开始实时推流示例 请求: ```json { "type": "request", "seqNo": 1234567890, "data": { "switch": 1 } } ``` 应答: ```json { "type": "response", "seqNo": 1234567890, "data": [ { "loc": 0, "url": "http://36.153.162.171:11985/rtc/v1/whep/?app=camera&stream=AHD1_main&vhost=live&eip=36.153.162.171:8000" } ] } ``` 说明: - URL 使用当前 `srs.live_playback_profile` 生成。 - 公网 profile 必须带 `eip=36.153.162.171:8000`。 - `stream` 使用 `AHD*_main`,不带 `.flv`。 - 切换实时推流状态时允许视频管线短暂重启。 ### 4.4 停止实时推流示例 请求: ```json { "type": "request", "seqNo": 1234567891, "data": { "switch": 0 } } ``` 应答: ```json { "type": "response", "seqNo": 1234567891, "data": [] } ``` 收到 `switch=0` 后,视频软件停止向 live SRS 外推实时流;服务进程继续运行,录像分支仍由 `srs.record_enabled` 配置决定。 ## 5. 录像段查询接口,预留 本章节暂缓实现,本版本不作为联调依据。当前已有录像代码不主动删除,但不纳入本次协议联调目标。 预留 topic: ```text /zxwl/sweeper/{vid}/record/query ``` 预留请求字段: | 字段 | 类型 | 说明 | | --- | --- | --- | | `loc` | int | 摄像头位置索引 | | `startTime` | long | 查询开始时间,毫秒 | | `endTime` | long | 查询结束时间,毫秒 | ## 6. 录像段播放接口,预留 本章节暂缓实现,本版本不作为联调依据。当前已有录像代码不主动删除,但不纳入本次协议联调目标。 预留 topic: ```text /zxwl/sweeper/{vid}/record/play ``` 预留请求字段: | 字段 | 类型 | 说明 | | --- | --- | --- | | `loc` | int | 摄像头位置索引 | | `segmentId` | string | 录像段 ID |