# 文档 ## 摄像头控制 Controller MVP API 接口: - GET /camera/list 获取摄像头列表 - GET /camera/{id} 获取摄像头信息 - POST /camera/switch 切换摄像头通道 - GET /camera/current 获取当前通道 后台 PTZ 接口(可选): - POST /camera/{id}/ptz/start 开始 PTZ 控制 - POST /camera/{id}/ptz/stop 停止 PTZ 控制 ### 获取摄像头列表 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/camera/list - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/camera/list 描述:获取摄像头列表 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --------- | ------ | ---- | -------- | --------------- | ----------- | | machineId | String | 否 | - | 机器 ID(可选) | machine_001 | #### 请求示例 ``` { "machineId": "machine_001" } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | array | 否 | | 响应数据 (ActualType: List) | | | └ cameraId | String | 否 | - | 摄像头 ID | cam_001 | | └ name | String | 否 | - | 摄像头名称 | 主摄像头 | | └ lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 | | └ model | String | 否 | - | 摄像头型号 | DS-2CD2143G2-IS | | └ rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/Streaming/Channels/101 | | └ channelNo | String | 否 | - | 通道号 | 1 | | └ status | String | 否 | - | 摄像头状态: ONLINE, OFFLINE | ONLINE | | └ capability | String | 否 | - | 摄像头能力: switch_only, ptz_enabled | ptz_enabled | | └ ptzSupported | Boolean | 否 | - | 是否支持 PTZ | true | | └ remark | String | 否 | - | 备注 | | | └ enabled | Boolean | 否 | - | 是否启用 | true | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": [ { "cameraId": "cam_001", "name": "主摄像头", "lssId": "lss_001", "model": "DS-2CD2143G2-IS", "rtspUrl": "rtsp://admin:password@192.168.1.100:554/Streaming/Channels/101", "channelNo": "1", "status": "ONLINE", "capability": "ptz_enabled", "ptzSupported": true, "remark": "string", "enabled": true } ] } ``` #### 错误码 无 ### 获取摄像头信息 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/camera/{cameraId} - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/camera/{cameraId} 描述:获取摄像头信息 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### Path 参数 | 名称 | 必填 | 描述 | 示例值 | | -------- | ---- | --------- | ---------- | | cameraId | 是 | 摄像头 ID | camera_001 | #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: CameraDTO) | | | └ cameraId | String | 否 | - | 摄像头 ID | cam_001 | | └ name | String | 否 | - | 摄像头名称 | 主摄像头 | | └ lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 | | └ model | String | 否 | - | 摄像头型号 | DS-2CD2143G2-IS | | └ rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/Streaming/Channels/101 | | └ channelNo | String | 否 | - | 通道号 | 1 | | └ status | String | 否 | - | 摄像头状态: ONLINE, OFFLINE | ONLINE | | └ capability | String | 否 | - | 摄像头能力: switch_only, ptz_enabled | ptz_enabled | | └ ptzSupported | Boolean | 否 | - | 是否支持 PTZ | true | | └ remark | String | 否 | - | 备注 | | | └ enabled | Boolean | 否 | - | 是否启用 | true | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "cameraId": "cam_001", "name": "主摄像头", "lssId": "lss_001", "model": "DS-2CD2143G2-IS", "rtspUrl": "rtsp://admin:password@192.168.1.100:554/Streaming/Channels/101", "channelNo": "1", "status": "ONLINE", "capability": "ptz_enabled", "ptzSupported": true, "remark": "string", "enabled": true } } ``` #### 错误码 无 ### 切换摄像头通道(MVP 核心) 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/camera/switch - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/camera/switch 描述:切换摄像头通道(MVP 核心) ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --------- | ------ | ---- | -------- | ----------- | ----------- | | machineId | String | 是 | - | 机器 ID | machine_001 | | channelId | String | 是 | - | 目标通道 ID | ch_001 | #### 请求示例 ``` { "machineId": "machine_001", "channelId": "ch_001" } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------------- | ------- | ---- | -------- | --------------------------------- | -------------------------------- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: ChannelDTO) | | | └ channelId | String | 否 | - | 通道 ID | ch_001 | | └ name | String | 否 | - | 通道名称 | 主通道 | | └ rtspUrl | String | 否 | - | RTSP 地址 | rtsp://192.168.1.100:554/stream1 | | └ defaultView | Boolean | 否 | - | 是否默认视角 | true | | └ status | String | 否 | - | 通道状态: ONLINE, OFFLINE | ONLINE | | └ cameraId | String | 否 | - | 所属摄像头 ID | cam_001 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "channelId": "ch_001", "name": "主通道", "rtspUrl": "rtsp://192.168.1.100:554/stream1", "defaultView": true, "status": "ONLINE", "cameraId": "cam_001" } } ``` #### 错误码 无 ### 获取当前活动通道 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/camera/current - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/camera/current 描述:获取当前活动通道 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --------- | ------ | ---- | -------- | ------- | ----------- | | machineId | string | 是 | - | 机器 ID | machine_001 | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------------- | ------- | ---- | -------- | --------------------------------- | -------------------------------- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: ChannelDTO) | | | └ channelId | String | 否 | - | 通道 ID | ch_001 | | └ name | String | 否 | - | 通道名称 | 主通道 | | └ rtspUrl | String | 否 | - | RTSP 地址 | rtsp://192.168.1.100:554/stream1 | | └ defaultView | Boolean | 否 | - | 是否默认视角 | true | | └ status | String | 否 | - | 通道状态: ONLINE, OFFLINE | ONLINE | | └ cameraId | String | 否 | - | 所属摄像头 ID | cam_001 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "channelId": "ch_001", "name": "主通道", "rtspUrl": "rtsp://192.168.1.100:554/stream1", "defaultView": true, "status": "ONLINE", "cameraId": "cam_001" } } ``` #### 错误码 无 ### 开始 PTZ 控制(后台专用) 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/camera/{cameraId}/ptz/start - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/camera/{cameraId}/ptz/start 描述:开始 PTZ 控制(后台专用) ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### Path 参数 | 名称 | 必填 | 描述 | 示例值 | | -------- | ---- | --------- | ------------- | | cameraId | 是 | 摄像头 ID | hikvision_ptz | #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------ | ------ | ---- | -------- | ----------- | ------ | | action | string | 是 | - | PTZ 动作 | up | | speed | int32 | 是 | - | 速度(1-100) | 50 | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无 ### 停止 PTZ 控制(后台专用) 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/camera/{cameraId}/ptz/stop - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/camera/{cameraId}/ptz/stop 描述:停止 PTZ 控制(后台专用) ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### Path 参数 | 名称 | 必填 | 描述 | 示例值 | | -------- | ---- | --------- | ------------- | | cameraId | 是 | 摄像头 ID | hikvision_ptz | #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无 ### PTZ 直接控制(兼容前端 pan/tilt/zoom 方式) 与前端海康调试接口一致:直接传 pan/tilt/zoom 值 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/camera/{cameraId}/ptz/control - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/camera/{cameraId}/ptz/control 描述:PTZ 直接控制(兼容前端 pan/tilt/zoom 方式) 与前端海康调试接口一致:直接传 pan/tilt/zoom 值 ContentType:`application/json` #### Path 参数 | 名称 | 必填 | 描述 | 示例值 | | -------- | ---- | --------- | ------------- | | cameraId | 是 | 摄像头 ID | hikvision_ptz | #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------- | ------- | ---- | -------- | ------------------------------------------------------ | ------ | | pan | Integer | 否 | 100 | 水平移动速度
负值向左,正值向右
范围: -100 ~ 100 | 0 | | tilt | Integer | 否 | 100 | 垂直移动速度
负值向下,正值向上
范围: -100 ~ 100 | 0 | | zoom | Integer | 否 | 100 | 缩放速度
负值缩小,正值放大
范围: -100 ~ 100 | 0 | | channel | Integer | 否 | - | 通道号(可选,默认 1) | 0 | #### 请求示例 ``` { "pan": 0, "tilt": 0, "zoom": 0, "channel": 0 } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无 ## 摄像头管理 ### 获取摄像头列表(分页) 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/list - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/list 描述:获取摄像头列表(分页) ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------- | ------- | ---- | -------- | ----------------------------------------------- | --------- | | page | Integer | 否 | - | 页码 (从 1 开始) | 1 | | size | Integer | 否 | - | 每页条数 | 10 | | keyword | String | 否 | - | 搜索关键词 (模糊匹配名称、ID 等) | 摄像头 | | enabled | Boolean | 否 | - | 启用状态过滤 (null=全部, true=启用, false=禁用) | true | | sortBy | String | 否 | - | 排序字段 | createdAt | | sortDir | String | 否 | - | 排序方向 (ASC/DESC) | DESC | | lssId | String | 否 | - | LSS 节点 ID 过滤 | lss_001 | | status | String | 否 | - | 在线状态过滤 (ONLINE/OFFLINE) | ONLINE | #### 请求示例 ``` { "page": 1, "size": 10, "keyword": "摄像头", "enabled": true, "sortBy": "createdAt", "sortDir": "DESC", "lssId": "lss_001", "status": "ONLINE" } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: PageResponse) | | | └ list | List | 否 | | 数据列表 (ActualType: T) | | | └ id | Long | 否 | - | 主键 ID | 1 | | └ cameraId | String | 否 | - | 摄像头 ID | cam_001 | | └ name | String | 否 | - | 名称 | 主摄像头 | | └ ip | String | 否 | - | IP 地址 | 192.168.1.100 | | └ port | Integer | 否 | - | 端口 | 80 | | └ username | String | 否 | - | 用户名 | admin | | └ brand | String | 否 | - | 品牌 | hikvision | | └ capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled | | └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE | | └ lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 | | └ model | String | 否 | - | 摄像头型号 | DS-2CD2T47G2-LSU/SL | | └ rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/stream1 | | └ channelNo | String | 否 | - | 通道号 | 1 | | └ remark | String | 否 | - | 备注 | | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 | | └ page | Integer | 否 | - | 当前页码 (从 1 开始) | 1 | | └ size | Integer | 否 | - | 每页条数 | 10 | | └ total | Long | 否 | - | 总记录数 | 100 | | └ totalPages | Integer | 否 | - | 总页数 | 10 | | └ hasNext | Boolean | 否 | - | 是否有下一页 | true | | └ hasPrevious | Boolean | 否 | - | 是否有上一页 | false | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "list": [ { "id": 1, "cameraId": "cam_001", "name": "主摄像头", "ip": "192.168.1.100", "port": 80, "username": "admin", "brand": "hikvision", "capability": "ptz_enabled", "status": "ONLINE", "lssId": "lss_001", "model": "DS-2CD2T47G2-LSU/SL", "rtspUrl": "rtsp://admin:password@192.168.1.100:554/stream1", "channelNo": "1", "remark": "string", "enabled": true, "createdAt": "2026-01-07T10:00:00", "updatedAt": "2026-01-07T10:00:00" } ], "page": 1, "size": 10, "total": 100, "totalPages": 10, "hasNext": true, "hasPrevious": false } } ``` #### 错误码 无 ### 获取摄像头列表(全部,不分页) 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/admin/cameras/listAll - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/cameras/listAll 描述:获取摄像头列表(全部,不分页) ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --------- | ------ | ---- | -------- | --------------- | ----------- | | machineId | string | 否 | - | 机器 ID(可选) | machine_001 | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | array | 否 | | 响应数据 (ActualType: List) | | | └ id | Long | 否 | - | 主键 ID | 1 | | └ cameraId | String | 否 | - | 摄像头 ID | cam_001 | | └ name | String | 否 | - | 名称 | 主摄像头 | | └ ip | String | 否 | - | IP 地址 | 192.168.1.100 | | └ port | Integer | 否 | - | 端口 | 80 | | └ username | String | 否 | - | 用户名 | admin | | └ brand | String | 否 | - | 品牌 | hikvision | | └ capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled | | └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE | | └ lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 | | └ model | String | 否 | - | 摄像头型号 | DS-2CD2T47G2-LSU/SL | | └ rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/stream1 | | └ channelNo | String | 否 | - | 通道号 | 1 | | └ remark | String | 否 | - | 备注 | | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": [ { "id": 1, "cameraId": "cam_001", "name": "主摄像头", "ip": "192.168.1.100", "port": 80, "username": "admin", "brand": "hikvision", "capability": "ptz_enabled", "status": "ONLINE", "lssId": "lss_001", "model": "DS-2CD2T47G2-LSU/SL", "rtspUrl": "rtsp://admin:password@192.168.1.100:554/stream1", "channelNo": "1", "remark": "string", "enabled": true, "createdAt": "2026-01-07T10:00:00", "updatedAt": "2026-01-07T10:00:00" } ] } ``` #### 错误码 无 ### 获取摄像头详情 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/admin/cameras/detail - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/cameras/detail 描述:获取摄像头详情 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---- | ----- | ---- | -------- | ------------- | ------ | | id | int64 | 是 | - | 摄像头主键 ID | 1 | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: CameraInfoDTO) | | | └ id | Long | 否 | - | 主键 ID | 1 | | └ cameraId | String | 否 | - | 摄像头 ID | cam_001 | | └ name | String | 否 | - | 名称 | 主摄像头 | | └ ip | String | 否 | - | IP 地址 | 192.168.1.100 | | └ port | Integer | 否 | - | 端口 | 80 | | └ username | String | 否 | - | 用户名 | admin | | └ brand | String | 否 | - | 品牌 | hikvision | | └ capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled | | └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE | | └ lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 | | └ model | String | 否 | - | 摄像头型号 | DS-2CD2T47G2-LSU/SL | | └ rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/stream1 | | └ channelNo | String | 否 | - | 通道号 | 1 | | └ remark | String | 否 | - | 备注 | | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "id": 1, "cameraId": "cam_001", "name": "主摄像头", "ip": "192.168.1.100", "port": 80, "username": "admin", "brand": "hikvision", "capability": "ptz_enabled", "status": "ONLINE", "lssId": "lss_001", "model": "DS-2CD2T47G2-LSU/SL", "rtspUrl": "rtsp://admin:password@192.168.1.100:554/stream1", "channelNo": "1", "remark": "string", "enabled": true, "createdAt": "2026-01-07T10:00:00", "updatedAt": "2026-01-07T10:00:00" } } ``` #### 错误码 无 ### 添加摄像头 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/add - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/add 描述:添加摄像头 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | cameraId | String | 是 | 50 | 摄像头 ID(唯一标识)
Validate[max: 50; ] | cam_001 | | name | String | 是 | 100 | 名称
Validate[max: 100; ] | 主摄像头 | | ip | String | 是 | - | IP 地址
Validate[regexp: ^((25[0-5] | 2[0-4]\\d | [01]?\\d\\d?)\\.){3}(25[0-5] | 2[0-4]\\d | [01]?\\d\\d?)$; ] | 192.168.1.100 | | port | Integer | 否 | - | 端口 | 80 | | username | String | 否 | 50 | 用户名
Validate[max: 50; ] | admin | | password | String | 否 | 100 | 密码
Validate[max: 100; ] | password123 | | brand | String | 否 | 30 | 品牌
Validate[max: 30; ] | hikvision | | capability | String | 否 | - | 能力: switch_only, ptz_enabled
Validate[regexp: ^(switch_only | ptz_enabled)$; ] | ptz_enabled | | lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 | | model | String | 否 | 100 | 摄像头型号
Validate[max: 100; ] | DS-2CD2T47G2-LSU/SL | | rtspUrl | String | 否 | 500 | RTSP 推流地址
Validate[max: 500; ] | rtsp://admin:password@192.168.1.100:554/stream1 | | channelNo | String | 否 | 20 | 通道号 (用于多通道摄像头)
Validate[max: 20; ] | 1 | | remark | String | 否 | 500 | 备注
Validate[max: 500; ] | | #### 请求示例 ``` { "cameraId": "cam_001", "name": "主摄像头", "ip": "192.168.1.100", "port": 80, "username": "admin", "password": "password123", "brand": "hikvision", "capability": "ptz_enabled", "lssId": "lss_001", "model": "DS-2CD2T47G2-LSU/SL", "rtspUrl": "rtsp://admin:password@192.168.1.100:554/stream1", "channelNo": "1", "remark": "string" } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: CameraInfoDTO) | | | └ id | Long | 否 | - | 主键 ID | 1 | | └ cameraId | String | 否 | - | 摄像头 ID | cam_001 | | └ name | String | 否 | - | 名称 | 主摄像头 | | └ ip | String | 否 | - | IP 地址 | 192.168.1.100 | | └ port | Integer | 否 | - | 端口 | 80 | | └ username | String | 否 | - | 用户名 | admin | | └ brand | String | 否 | - | 品牌 | hikvision | | └ capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled | | └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE | | └ lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 | | └ model | String | 否 | - | 摄像头型号 | DS-2CD2T47G2-LSU/SL | | └ rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/stream1 | | └ channelNo | String | 否 | - | 通道号 | 1 | | └ remark | String | 否 | - | 备注 | | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "id": 1, "cameraId": "cam_001", "name": "主摄像头", "ip": "192.168.1.100", "port": 80, "username": "admin", "brand": "hikvision", "capability": "ptz_enabled", "status": "ONLINE", "lssId": "lss_001", "model": "DS-2CD2T47G2-LSU/SL", "rtspUrl": "rtsp://admin:password@192.168.1.100:554/stream1", "channelNo": "1", "remark": "string", "enabled": true, "createdAt": "2026-01-07T10:00:00", "updatedAt": "2026-01-07T10:00:00" } } ``` #### 错误码 无 ### 更新摄像头 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/update - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/update 描述:更新摄像头 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | id | Long | 否 | - | 摄像头数据库 ID | 1 | | name | String | 否 | - | 名称 | 主摄像头 | | ip | String | 否 | - | IP 地址 | 192.168.1.100 | | port | Integer | 否 | - | 端口 | 80 | | username | String | 否 | - | 用户名 | admin | | password | String | 否 | - | 密码(不传或为空则不修改) | password123 | | brand | String | 否 | - | 品牌 | hikvision | | capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled | | lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 | | model | String | 否 | - | 摄像头型号 | DS-2CD2T47G2-LSU/SL | | rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/stream1 | | channelNo | String | 否 | - | 通道号 | 1 | | remark | String | 否 | - | 备注 | | | enabled | Boolean | 否 | - | 启用状态 | true | #### 请求示例 ``` { "id": 1, "name": "主摄像头", "ip": "192.168.1.100", "port": 80, "username": "admin", "password": "password123", "brand": "hikvision", "capability": "ptz_enabled", "lssId": "lss_001", "model": "DS-2CD2T47G2-LSU/SL", "rtspUrl": "rtsp://admin:password@192.168.1.100:554/stream1", "channelNo": "1", "remark": "string", "enabled": true } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: CameraInfoDTO) | | | └ id | Long | 否 | - | 主键 ID | 1 | | └ cameraId | String | 否 | - | 摄像头 ID | cam_001 | | └ name | String | 否 | - | 名称 | 主摄像头 | | └ ip | String | 否 | - | IP 地址 | 192.168.1.100 | | └ port | Integer | 否 | - | 端口 | 80 | | └ username | String | 否 | - | 用户名 | admin | | └ brand | String | 否 | - | 品牌 | hikvision | | └ capability | String | 否 | - | 能力: switch_only, ptz_enabled | ptz_enabled | | └ status | String | 否 | - | 状态: ONLINE, OFFLINE | ONLINE | | └ lssId | String | 否 | - | 绑定的 LSS 节点 ID | lss_001 | | └ model | String | 否 | - | 摄像头型号 | DS-2CD2T47G2-LSU/SL | | └ rtspUrl | String | 否 | - | RTSP 推流地址 | rtsp://admin:password@192.168.1.100:554/stream1 | | └ channelNo | String | 否 | - | 通道号 | 1 | | └ remark | String | 否 | - | 备注 | | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "id": 1, "cameraId": "cam_001", "name": "主摄像头", "ip": "192.168.1.100", "port": 80, "username": "admin", "brand": "hikvision", "capability": "ptz_enabled", "status": "ONLINE", "lssId": "lss_001", "model": "DS-2CD2T47G2-LSU/SL", "rtspUrl": "rtsp://admin:password@192.168.1.100:554/stream1", "channelNo": "1", "remark": "string", "enabled": true, "createdAt": "2026-01-07T10:00:00", "updatedAt": "2026-01-07T10:00:00" } } ``` #### 错误码 无 ### 删除摄像头 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/delete - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/delete 描述:删除摄像头 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---- | ----- | ---- | -------- | ------------- | ------ | | id | int64 | 是 | - | 摄像头主键 ID | 1 | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无 ### 检测摄像头连通性 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/check - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/check 描述:检测摄像头连通性 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---- | ----- | ---- | -------- | ------------- | ------ | | id | int64 | 是 | - | 摄像头主键 ID | 1 | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | ------------------------------ | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | boolean | 否 | - | 响应数据 (ActualType: Boolean) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": false } ``` #### 错误码 无 ### 获取摄像头快照 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/admin/cameras/snapshot - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/cameras/snapshot 描述:获取摄像头快照 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---- | ----- | ---- | -------- | ------------- | ------ | | id | int64 | 是 | - | 摄像头主键 ID | 1 | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | array | 否 | | 响应数据 (ActualType: byte) | | | └ - | array[byte[]] | 否 | - | array of byte[] | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": [ { " -": "" } ] } ``` #### 错误码 无 ### PTZ 控制 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/cameras/ptz - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/cameras/ptz 描述:PTZ 控制 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------ | ------ | ---- | -------- | ---------------- | ------ | | id | Long | 否 | - | 摄像头 ID | 1 | | action | String | 否 | - | PTZ 动作 | UP | | speed | Float | 否 | - | 速度 (0.0 - 1.0) | 0.5 | #### 请求示例 ``` { "id": 1, "action": "UP", "speed": 0.5 } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | ------------------------------ | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | boolean | 否 | - | 响应数据 (ActualType: Boolean) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": false } ``` #### 错误码 无 ## 机器管理 ### 获取机器列表(分页) 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/machines/list - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/machines/list 描述:获取机器列表(分页) ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------- | ------- | ---- | -------- | ----------------------------------------------- | --------- | | page | Integer | 否 | - | 页码 (从 1 开始) | 1 | | size | Integer | 否 | - | 每页条数 | 10 | | keyword | String | 否 | - | 搜索关键词 (模糊匹配名称、ID 等) | 摄像头 | | enabled | Boolean | 否 | - | 启用状态过滤 (null=全部, true=启用, false=禁用) | true | | sortBy | String | 否 | - | 排序字段 | createdAt | | sortDir | String | 否 | - | 排序方向 (ASC/DESC) | DESC | #### 请求示例 ``` { "page": 1, "size": 10, "keyword": "摄像头", "enabled": true, "sortBy": "createdAt", "sortDir": "DESC" } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------------- | ------------- | ---- | -------- | ----------------------------------- | ------------------- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: PageResponse) | | | └ list | List | 否 | | 数据列表 (ActualType: T) | | | └ id | Long | 否 | - | 主键 ID | 1 | | └ machineId | String | 否 | - | 机器 ID | machine_001 | | └ name | String | 否 | - | 名称 | 1 号机 | | └ location | String | 否 | - | 位置 | A 区 1 楼 | | └ description | String | 否 | - | 描述 | 主力机器 | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ cameraCount | Integer | 否 | - | 摄像头数量 | 3 | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 | | └ page | Integer | 否 | - | 当前页码 (从 1 开始) | 1 | | └ size | Integer | 否 | - | 每页条数 | 10 | | └ total | Long | 否 | - | 总记录数 | 100 | | └ totalPages | Integer | 否 | - | 总页数 | 10 | | └ hasNext | Boolean | 否 | - | 是否有下一页 | true | | └ hasPrevious | Boolean | 否 | - | 是否有上一页 | false | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "list": [ { "id": 1, "machineId": "machine_001", "name": "1号机", "location": "A区1楼", "description": "主力机器", "enabled": true, "cameraCount": 3, "createdAt": "2026-01-07T10:00:00", "updatedAt": "2026-01-07T10:00:00" } ], "page": 1, "size": 10, "total": 100, "totalPages": 10, "hasNext": true, "hasPrevious": false } } ``` #### 错误码 无 ### 获取机器列表(全部,不分页) 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/admin/machines/listAll - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/machines/listAll 描述:获取机器列表(全部,不分页) ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------------- | ------------- | ---- | -------- | --------------------------- | ------------------- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | array | 否 | | 响应数据 (ActualType: List) | | | └ id | Long | 否 | - | 主键 ID | 1 | | └ machineId | String | 否 | - | 机器 ID | machine_001 | | └ name | String | 否 | - | 名称 | 1 号机 | | └ location | String | 否 | - | 位置 | A 区 1 楼 | | └ description | String | 否 | - | 描述 | 主力机器 | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ cameraCount | Integer | 否 | - | 摄像头数量 | 3 | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": [ { "id": 1, "machineId": "machine_001", "name": "1号机", "location": "A区1楼", "description": "主力机器", "enabled": true, "cameraCount": 3, "createdAt": "2026-01-07T10:00:00", "updatedAt": "2026-01-07T10:00:00" } ] } ``` #### 错误码 无 ### 获取机器详情 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/admin/machines/detail - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/machines/detail 描述:获取机器详情 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---- | ----- | ---- | -------- | ----------- | ------ | | id | int64 | 是 | - | 机器主键 ID | 1 | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------------- | ------------- | ---- | -------- | --------------------------------- | ------------------- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: MachineDTO) | | | └ id | Long | 否 | - | 主键 ID | 1 | | └ machineId | String | 否 | - | 机器 ID | machine_001 | | └ name | String | 否 | - | 名称 | 1 号机 | | └ location | String | 否 | - | 位置 | A 区 1 楼 | | └ description | String | 否 | - | 描述 | 主力机器 | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ cameraCount | Integer | 否 | - | 摄像头数量 | 3 | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "id": 1, "machineId": "machine_001", "name": "1号机", "location": "A区1楼", "description": "主力机器", "enabled": true, "cameraCount": 3, "createdAt": "2026-01-07T10:00:00", "updatedAt": "2026-01-07T10:00:00" } } ``` #### 错误码 无 ### 添加机器 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/machines/add - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/machines/add 描述:添加机器 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ----------- | ------ | ---- | -------- | ------------------------------------------ | ----------- | | machineId | String | 是 | 50 | 机器 ID(唯一标识)
Validate[max: 50; ] | machine_001 | | name | String | 是 | 100 | 名称
Validate[max: 100; ] | 1 号机 | | location | String | 否 | 200 | 位置
Validate[max: 200; ] | A 区 1 楼 | | description | String | 否 | 500 | 描述
Validate[max: 500; ] | 主力机器 | #### 请求示例 ``` { "machineId": "machine_001", "name": "1号机", "location": "A区1楼", "description": "主力机器" } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------------- | ------------- | ---- | -------- | --------------------------------- | ------------------- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: MachineDTO) | | | └ id | Long | 否 | - | 主键 ID | 1 | | └ machineId | String | 否 | - | 机器 ID | machine_001 | | └ name | String | 否 | - | 名称 | 1 号机 | | └ location | String | 否 | - | 位置 | A 区 1 楼 | | └ description | String | 否 | - | 描述 | 主力机器 | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ cameraCount | Integer | 否 | - | 摄像头数量 | 3 | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "id": 1, "machineId": "machine_001", "name": "1号机", "location": "A区1楼", "description": "主力机器", "enabled": true, "cameraCount": 3, "createdAt": "2026-01-07T10:00:00", "updatedAt": "2026-01-07T10:00:00" } } ``` #### 错误码 无 ### 更新机器 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/machines/update - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/machines/update 描述:更新机器 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ----------- | ------- | ---- | -------- | ------------- | --------- | | id | Long | 否 | - | 机器数据库 ID | 1 | | name | String | 否 | - | 名称 | 1 号机 | | location | String | 否 | - | 位置 | A 区 1 楼 | | description | String | 否 | - | 描述 | 主力机器 | | enabled | Boolean | 否 | - | 启用状态 | true | #### 请求示例 ``` { "id": 1, "name": "1号机", "location": "A区1楼", "description": "主力机器", "enabled": true } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------------- | ------------- | ---- | -------- | --------------------------------- | ------------------- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: MachineDTO) | | | └ id | Long | 否 | - | 主键 ID | 1 | | └ machineId | String | 否 | - | 机器 ID | machine_001 | | └ name | String | 否 | - | 名称 | 1 号机 | | └ location | String | 否 | - | 位置 | A 区 1 楼 | | └ description | String | 否 | - | 描述 | 主力机器 | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ cameraCount | Integer | 否 | - | 摄像头数量 | 3 | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2026-01-07T10:00:00 | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2026-01-07T10:00:00 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "id": 1, "machineId": "machine_001", "name": "1号机", "location": "A区1楼", "description": "主力机器", "enabled": true, "cameraCount": 3, "createdAt": "2026-01-07T10:00:00", "updatedAt": "2026-01-07T10:00:00" } } ``` #### 错误码 无 ### 删除机器 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/machines/delete - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/machines/delete 描述:删除机器 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---- | ----- | ---- | -------- | ----------- | ------ | | id | int64 | 是 | - | 机器主键 ID | 1 | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无 ## 推流通道管理 ### 获取推流通道列表(分页) 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/stream-channels/list - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/stream-channels/list 描述:获取推流通道列表(分页) ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------- | ------- | ---- | -------- | ----------------------------------------------- | --------- | | page | Integer | 否 | - | 页码 (从 1 开始) | 1 | | size | Integer | 否 | - | 每页条数 | 10 | | keyword | String | 否 | - | 搜索关键词 (模糊匹配名称、ID 等) | 摄像头 | | enabled | Boolean | 否 | - | 启用状态过滤 (null=全部, true=启用, false=禁用) | true | | sortBy | String | 否 | - | 排序字段 | createdAt | | sortDir | String | 否 | - | 排序方向 (ASC/DESC) | DESC | #### 请求示例 ``` { "page": 1, "size": 10, "keyword": "摄像头", "enabled": true, "sortBy": "createdAt", "sortDir": "DESC" } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: PageResponse) | | | └ list | List | 否 | | 数据列表 (ActualType: T) | | | └ id | Long | 否 | - | 主键 ID | 1 | | └ channelId | String | 否 | - | 通道 ID | cf_channel_001 | | └ name | String | 否 | - | 通道名称 | 主推流通道 | | └ accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea | | └ liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 | | └ customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 | | └ mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP | | └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish | | └ rtmpsUrl | String | 否 | - | RTMPS 推流地址 | rtmps://live.cloudflare.com:443/live/xxx | | └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8 | | └ whepPlaybackUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play | | └ recordingEnabled | Boolean | 否 | - | 是否启用录制 | false | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-15T10:30:00 | | └ page | Integer | 否 | - | 当前页码 (从 1 开始) | 1 | | └ size | Integer | 否 | - | 每页条数 | 10 | | └ total | Long | 否 | - | 总记录数 | 100 | | └ totalPages | Integer | 否 | - | 总页数 | 10 | | └ hasNext | Boolean | 否 | - | 是否有下一页 | true | | └ hasPrevious | Boolean | 否 | - | 是否有上一页 | false | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "list": [ { "id": 1, "channelId": "cf_channel_001", "name": "主推流通道", "accountId": "5544eac7cfb260d4fec9467d49513cea", "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6", "customerSubdomain": "customer-pj89kn2ke2tcuh19", "mode": "WHIP", "whipUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish", "rtmpsUrl": "rtmps://live.cloudflare.com:443/live/xxx", "hlsPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8", "whepPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play", "recordingEnabled": false, "enabled": true, "createdAt": "2024-01-15T10:30:00", "updatedAt": "2024-01-15T10:30:00" } ], "page": 1, "size": 10, "total": 100, "totalPages": 10, "hasNext": true, "hasPrevious": false } } ``` #### 错误码 无 ### 获取推流通道列表(全部,不分页) 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/admin/stream-channels/listAll - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/stream-channels/listAll 描述:获取推流通道列表(全部,不分页) ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | array | 否 | | 响应数据 (ActualType: List) | | | └ id | Long | 否 | - | 主键 ID | 1 | | └ channelId | String | 否 | - | 通道 ID | cf_channel_001 | | └ name | String | 否 | - | 通道名称 | 主推流通道 | | └ accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea | | └ liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 | | └ customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 | | └ mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP | | └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish | | └ rtmpsUrl | String | 否 | - | RTMPS 推流地址 | rtmps://live.cloudflare.com:443/live/xxx | | └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8 | | └ whepPlaybackUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play | | └ recordingEnabled | Boolean | 否 | - | 是否启用录制 | false | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-15T10:30:00 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": [ { "id": 1, "channelId": "cf_channel_001", "name": "主推流通道", "accountId": "5544eac7cfb260d4fec9467d49513cea", "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6", "customerSubdomain": "customer-pj89kn2ke2tcuh19", "mode": "WHIP", "whipUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish", "rtmpsUrl": "rtmps://live.cloudflare.com:443/live/xxx", "hlsPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8", "whepPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play", "recordingEnabled": false, "enabled": true, "createdAt": "2024-01-15T10:30:00", "updatedAt": "2024-01-15T10:30:00" } ] } ``` #### 错误码 无 ### 获取推流通道详情 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/admin/stream-channels/detail - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/stream-channels/detail 描述:获取推流通道详情 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---- | ----- | ---- | -------- | --------------- | ------ | | id | int64 | 是 | - | 推流通道主键 ID | 1 | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: StreamChannelInfoDTO) | | | └ id | Long | 否 | - | 主键 ID | 1 | | └ channelId | String | 否 | - | 通道 ID | cf_channel_001 | | └ name | String | 否 | - | 通道名称 | 主推流通道 | | └ accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea | | └ liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 | | └ customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 | | └ mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP | | └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish | | └ rtmpsUrl | String | 否 | - | RTMPS 推流地址 | rtmps://live.cloudflare.com:443/live/xxx | | └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8 | | └ whepPlaybackUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play | | └ recordingEnabled | Boolean | 否 | - | 是否启用录制 | false | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-15T10:30:00 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "id": 1, "channelId": "cf_channel_001", "name": "主推流通道", "accountId": "5544eac7cfb260d4fec9467d49513cea", "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6", "customerSubdomain": "customer-pj89kn2ke2tcuh19", "mode": "WHIP", "whipUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish", "rtmpsUrl": "rtmps://live.cloudflare.com:443/live/xxx", "hlsPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8", "whepPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play", "recordingEnabled": false, "enabled": true, "createdAt": "2024-01-15T10:30:00", "updatedAt": "2024-01-15T10:30:00" } } ``` #### 错误码 无 ### 添加推流通道 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/stream-channels/add - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/stream-channels/add 描述:添加推流通道 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | channelId | String | 是 | - | 通道 ID | cf_channel_001 | | name | String | 是 | - | 通道名称 | 主推流通道 | | accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea | | apiToken | String | 否 | - | Cloudflare API Token | d_f4nGUKFlB66MMMIS3NfVlUbn0A0p4jlrW5BbZW | | liveInputId | String | 是 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 | | streamKey | String | 否 | - | 流密钥 (用于 RTMPS) | 8c108b4025d3278b188b443e8a6c5503kb51e49994b6fd9e56b6f1fdfcd339fe6 | | customerSubdomain | String | 是 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 | | mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP | | recordingEnabled | Boolean | 否 | - | 是否启用录制 | false | #### 请求示例 ``` { "channelId": "cf_channel_001", "name": "主推流通道", "accountId": "5544eac7cfb260d4fec9467d49513cea", "apiToken": "d_f4nGUKFlB66MMMIS3NfVlUbn0A0p4jlrW5BbZW", "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6", "streamKey": "8c108b4025d3278b188b443e8a6c5503kb51e49994b6fd9e56b6f1fdfcd339fe6", "customerSubdomain": "customer-pj89kn2ke2tcuh19", "mode": "WHIP", "recordingEnabled": false } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: StreamChannelInfoDTO) | | | └ id | Long | 否 | - | 主键 ID | 1 | | └ channelId | String | 否 | - | 通道 ID | cf_channel_001 | | └ name | String | 否 | - | 通道名称 | 主推流通道 | | └ accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea | | └ liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 | | └ customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 | | └ mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP | | └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish | | └ rtmpsUrl | String | 否 | - | RTMPS 推流地址 | rtmps://live.cloudflare.com:443/live/xxx | | └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8 | | └ whepPlaybackUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play | | └ recordingEnabled | Boolean | 否 | - | 是否启用录制 | false | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-15T10:30:00 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "id": 1, "channelId": "cf_channel_001", "name": "主推流通道", "accountId": "5544eac7cfb260d4fec9467d49513cea", "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6", "customerSubdomain": "customer-pj89kn2ke2tcuh19", "mode": "WHIP", "whipUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish", "rtmpsUrl": "rtmps://live.cloudflare.com:443/live/xxx", "hlsPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8", "whepPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play", "recordingEnabled": false, "enabled": true, "createdAt": "2024-01-15T10:30:00", "updatedAt": "2024-01-15T10:30:00" } } ``` #### 错误码 无 ### 更新推流通道 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/stream-channels/update - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/stream-channels/update 描述:更新推流通道 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | id | Long | 是 | - | 主键 ID | 1 | | name | String | 否 | - | 通道名称 | 主推流通道 | | accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea | | apiToken | String | 否 | - | Cloudflare API Token | d_f4nGUKFlB66MMMIS3NfVlUbn0A0p4jlrW5BbZW | | liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 | | streamKey | String | 否 | - | 流密钥 (用于 RTMPS) | 8c108b4025d3278b188b443e8a6c5503kb51e49994b6fd9e56b6f1fdfcd339fe6 | | customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 | | mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP | | recordingEnabled | Boolean | 否 | - | 是否启用录制 | false | | enabled | Boolean | 否 | - | 是否启用 | true | #### 请求示例 ``` { "id": 1, "name": "主推流通道", "accountId": "5544eac7cfb260d4fec9467d49513cea", "apiToken": "d_f4nGUKFlB66MMMIS3NfVlUbn0A0p4jlrW5BbZW", "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6", "streamKey": "8c108b4025d3278b188b443e8a6c5503kb51e49994b6fd9e56b6f1fdfcd339fe6", "customerSubdomain": "customer-pj89kn2ke2tcuh19", "mode": "WHIP", "recordingEnabled": false, "enabled": true } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: StreamChannelInfoDTO) | | | └ id | Long | 否 | - | 主键 ID | 1 | | └ channelId | String | 否 | - | 通道 ID | cf_channel_001 | | └ name | String | 否 | - | 通道名称 | 主推流通道 | | └ accountId | String | 否 | - | Cloudflare 账户 ID | 5544eac7cfb260d4fec9467d49513cea | | └ liveInputId | String | 否 | - | Cloudflare Live Input ID | b51e49994b6fd9e56b6f1fdfcd339fe6 | | └ customerSubdomain | String | 否 | - | 客户子域名 | customer-pj89kn2ke2tcuh19 | | └ mode | String | 否 | - | 推流模式: WHIP / RTMPS / SRT | WHIP | | └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish | | └ rtmpsUrl | String | 否 | - | RTMPS 推流地址 | rtmps://live.cloudflare.com:443/live/xxx | | └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8 | | └ whepPlaybackUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play | | └ recordingEnabled | Boolean | 否 | - | 是否启用录制 | false | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | 2024-01-15T10:30:00 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "id": 1, "channelId": "cf_channel_001", "name": "主推流通道", "accountId": "5544eac7cfb260d4fec9467d49513cea", "liveInputId": "b51e49994b6fd9e56b6f1fdfcd339fe6", "customerSubdomain": "customer-pj89kn2ke2tcuh19", "mode": "WHIP", "whipUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/publish", "rtmpsUrl": "rtmps://live.cloudflare.com:443/live/xxx", "hlsPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/manifest/video.m3u8", "whepPlaybackUrl": "https://customer-pj89kn2ke2tcuh19.cloudflarestream.com/b51e49994b6fd9e56b6f1fdfcd339fe6/webRTC/play", "recordingEnabled": false, "enabled": true, "createdAt": "2024-01-15T10:30:00", "updatedAt": "2024-01-15T10:30:00" } } ``` #### 错误码 无 ### 删除推流通道 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/stream-channels/delete - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/stream-channels/delete 描述:删除推流通道 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---- | ----- | ---- | -------- | --------------- | ------ | | id | int64 | 是 | - | 推流通道主键 ID | 1 | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无 ## 管理员认证 ### 登录 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/auth/login - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/auth/login 描述:登录 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | -------- | ------ | ---- | -------- | ----------------------------- | ------ | | username | String | 是 | 50 | 用户名
Validate[max: 50; ] | admin | | password | String | 是 | 100 | 密码
Validate[max: 100; ] | 123456 | #### 请求示例 ``` { "username": "admin", "password": "123456" } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: LoginResponse) | | | └ token | String | 否 | - | JWT Token | eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.xxx | | └ tokenType | String | 否 | - | Token 类型 | Bearer | | └ expiresIn | Long | 否 | - | 过期时间(秒) | 86400 | | └ admin | AdminInfoDTO | 否 | | 用户信息 | | | └ id | Long | 否 | - | 用户 ID | 1 | | └ username | String | 否 | - | 用户名 | admin | | └ nickname | String | 否 | - | 昵称 | 管理员 | | └ role | String | 否 | - | 角色 | ADMIN | | └ lastLoginAt | LocalDateTime | 否 | - | 最后登录时间 | 2026-01-07T10:00:00 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiJ9.xxx", "tokenType": "Bearer", "expiresIn": 86400, "admin": { "id": 1, "username": "admin", "nickname": "管理员", "role": "ADMIN", "lastLoginAt": "2026-01-07T10:00:00" } } } ``` #### 错误码 无 ### 登出 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/auth/logout - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/auth/logout 描述:登出 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无 ### 获取当前用户信息(直接从 Token 解析,不查询数据库) 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/admin/auth/info - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/auth/info 描述:获取当前用户信息(直接从 Token 解析,不查询数据库) ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------------- | ------------- | ---- | -------- | ----------------------------------- | ------------------- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: AdminInfoDTO) | | | └ id | Long | 否 | - | 用户 ID | 1 | | └ username | String | 否 | - | 用户名 | admin | | └ nickname | String | 否 | - | 昵称 | 管理员 | | └ role | String | 否 | - | 角色 | ADMIN | | └ lastLoginAt | LocalDateTime | 否 | - | 最后登录时间 | 2026-01-07T10:00:00 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "id": 1, "username": "admin", "nickname": "管理员", "role": "ADMIN", "lastLoginAt": "2026-01-07T10:00:00" } } ``` #### 错误码 无 ### 修改密码 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/auth/password - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/auth/password 描述:修改密码 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ----------- | ------ | ---- | -------- | -------------------------------------------- | ----------- | | oldPassword | String | 是 | - | 旧密码 | oldpassword | | newPassword | String | 是 | 100 | 新密码(6-100 字符)
Validate[max: 100; ] | newpassword | #### 请求示例 ``` { "oldPassword": "oldpassword", "newPassword": "newpassword" } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无 ## 统计 ### 获取仪表盘统计数据 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/admin/stats/dashboard - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/stats/dashboard 描述:获取仪表盘统计数据 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------------- | ------- | ---- | -------- | ---------------------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: DashboardStatsDTO) | | | └ machineTotal | Long | 否 | - | 机器总数 | 10 | | └ machineEnabled | Long | 否 | - | 启用的机器数 | 8 | | └ cameraTotal | Long | 否 | - | 摄像头总数 | 20 | | └ cameraOnline | Long | 否 | - | 在线摄像头数 | 15 | | └ cameraOffline | Long | 否 | - | 离线摄像头数 | 5 | | └ channelTotal | Long | 否 | - | 通道总数 | 40 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "machineTotal": 10, "machineEnabled": 8, "cameraTotal": 20, "cameraOnline": 15, "cameraOffline": 5, "channelTotal": 40 } } ``` #### 错误码 无 ## LSS 节点管理 ### 获取 LSS 节点列表(分页) 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/lss-nodes/list - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/lss-nodes/list 描述:获取 LSS 节点列表(分页) ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------- | ------- | ---- | -------- | ----------------------------------------------- | --------- | | page | Integer | 否 | - | 页码 (从 1 开始) | 1 | | size | Integer | 否 | - | 每页条数 | 10 | | keyword | String | 否 | - | 搜索关键词 (模糊匹配名称、ID 等) | 摄像头 | | enabled | Boolean | 否 | - | 启用状态过滤 (null=全部, true=启用, false=禁用) | true | | sortBy | String | 否 | - | 排序字段 | createdAt | | sortDir | String | 否 | - | 排序方向 (ASC/DESC) | DESC | #### 请求示例 ``` { "page": 1, "size": 10, "keyword": "摄像头", "enabled": true, "sortBy": "createdAt", "sortDir": "DESC" } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: PageResponse) | | | └ list | List | 否 | | 数据列表 (ActualType: T) | | | └ id | Long | 否 | - | 数据库主键 | 0 | | └ lssId | String | 否 | - | LSS 节点 ID | | | └ lssName | String | 否 | - | LSS 节点名称 | | | └ machineId | String | 否 | - | 关联的机器 ID | | | └ address | String | 否 | - | LSS 地址 (IP:Port) | | | └ maxTasks | Integer | 否 | - | 最大并发任务数 | 0 | | └ currentTasks | Integer | 否 | - | 当前任务数 | 0 | | └ status | String | 否 | - | 节点状态: ONLINE, OFFLINE, BUSY, MAINTENANCE | | | └ ffmpegVersion | String | 否 | - | FFmpeg 版本 | | | └ systemInfo | String | 否 | - | 系统信息 (JSON) | | | └ lastHeartbeatAt | LocalDateTime | 否 | - | 最后心跳时间 | yyyy-MM-dd HH:mm:ss | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ loadRate | Double | 否 | - | 负载率 (0.0 - 1.0) | 0.0 | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | yyyy-MM-dd HH:mm:ss | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | yyyy-MM-dd HH:mm:ss | | └ page | Integer | 否 | - | 当前页码 (从 1 开始) | 1 | | └ size | Integer | 否 | - | 每页条数 | 10 | | └ total | Long | 否 | - | 总记录数 | 100 | | └ totalPages | Integer | 否 | - | 总页数 | 10 | | └ hasNext | Boolean | 否 | - | 是否有下一页 | true | | └ hasPrevious | Boolean | 否 | - | 是否有上一页 | false | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "list": [ { "id": 0, "lssId": "string", "lssName": "string", "machineId": "string", "address": "string", "maxTasks": 0, "currentTasks": 0, "status": "string", "ffmpegVersion": "string", "systemInfo": "string", "lastHeartbeatAt": "yyyy-MM-dd HH:mm:ss", "enabled": true, "loadRate": 0, "createdAt": "yyyy-MM-dd HH:mm:ss", "updatedAt": "yyyy-MM-dd HH:mm:ss" } ], "page": 1, "size": 10, "total": 100, "totalPages": 10, "hasNext": true, "hasPrevious": false } } ``` #### 错误码 无 ### 获取全部 LSS 节点列表 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/admin/lss-nodes/listAll - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/lss-nodes/listAll 描述:获取全部 LSS 节点列表 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | array | 否 | | 响应数据 (ActualType: List) | | | └ id | Long | 否 | - | 数据库主键 | 0 | | └ lssId | String | 否 | - | LSS 节点 ID | | | └ lssName | String | 否 | - | LSS 节点名称 | | | └ machineId | String | 否 | - | 关联的机器 ID | | | └ address | String | 否 | - | LSS 地址 (IP:Port) | | | └ maxTasks | Integer | 否 | - | 最大并发任务数 | 0 | | └ currentTasks | Integer | 否 | - | 当前任务数 | 0 | | └ status | String | 否 | - | 节点状态: ONLINE, OFFLINE, BUSY, MAINTENANCE | | | └ ffmpegVersion | String | 否 | - | FFmpeg 版本 | | | └ systemInfo | String | 否 | - | 系统信息 (JSON) | | | └ lastHeartbeatAt | LocalDateTime | 否 | - | 最后心跳时间 | yyyy-MM-dd HH:mm:ss | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ loadRate | Double | 否 | - | 负载率 (0.0 - 1.0) | 0.0 | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | yyyy-MM-dd HH:mm:ss | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | yyyy-MM-dd HH:mm:ss | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": [ { "id": 0, "lssId": "string", "lssName": "string", "machineId": "string", "address": "string", "maxTasks": 0, "currentTasks": 0, "status": "string", "ffmpegVersion": "string", "systemInfo": "string", "lastHeartbeatAt": "yyyy-MM-dd HH:mm:ss", "enabled": true, "loadRate": 0, "createdAt": "yyyy-MM-dd HH:mm:ss", "updatedAt": "yyyy-MM-dd HH:mm:ss" } ] } ``` #### 错误码 无 ### 获取 LSS 节点详情 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/admin/lss-nodes/detail - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/lss-nodes/detail 描述:获取 LSS 节点详情 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ----- | ------ | ---- | -------- | ----------- | ------ | | lssId | string | 是 | - | LSS 节点 ID | | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: LssNodeDTO) | | | └ id | Long | 否 | - | 数据库主键 | 0 | | └ lssId | String | 否 | - | LSS 节点 ID | | | └ lssName | String | 否 | - | LSS 节点名称 | | | └ machineId | String | 否 | - | 关联的机器 ID | | | └ address | String | 否 | - | LSS 地址 (IP:Port) | | | └ maxTasks | Integer | 否 | - | 最大并发任务数 | 0 | | └ currentTasks | Integer | 否 | - | 当前任务数 | 0 | | └ status | String | 否 | - | 节点状态: ONLINE, OFFLINE, BUSY, MAINTENANCE | | | └ ffmpegVersion | String | 否 | - | FFmpeg 版本 | | | └ systemInfo | String | 否 | - | 系统信息 (JSON) | | | └ lastHeartbeatAt | LocalDateTime | 否 | - | 最后心跳时间 | yyyy-MM-dd HH:mm:ss | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ loadRate | Double | 否 | - | 负载率 (0.0 - 1.0) | 0.0 | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | yyyy-MM-dd HH:mm:ss | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | yyyy-MM-dd HH:mm:ss | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "id": 0, "lssId": "string", "lssName": "string", "machineId": "string", "address": "string", "maxTasks": 0, "currentTasks": 0, "status": "string", "ffmpegVersion": "string", "systemInfo": "string", "lastHeartbeatAt": "yyyy-MM-dd HH:mm:ss", "enabled": true, "loadRate": 0, "createdAt": "yyyy-MM-dd HH:mm:ss", "updatedAt": "yyyy-MM-dd HH:mm:ss" } } ``` #### 错误码 无 ### 根据机器 ID 获取关联的 LSS 节点 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/admin/lss-nodes/byMachine - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/lss-nodes/byMachine 描述:根据机器 ID 获取关联的 LSS 节点 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --------- | ------ | ---- | -------- | ------- | ------ | | machineId | string | 是 | - | 机器 ID | | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | array | 否 | | 响应数据 (ActualType: List) | | | └ id | Long | 否 | - | 数据库主键 | 0 | | └ lssId | String | 否 | - | LSS 节点 ID | | | └ lssName | String | 否 | - | LSS 节点名称 | | | └ machineId | String | 否 | - | 关联的机器 ID | | | └ address | String | 否 | - | LSS 地址 (IP:Port) | | | └ maxTasks | Integer | 否 | - | 最大并发任务数 | 0 | | └ currentTasks | Integer | 否 | - | 当前任务数 | 0 | | └ status | String | 否 | - | 节点状态: ONLINE, OFFLINE, BUSY, MAINTENANCE | | | └ ffmpegVersion | String | 否 | - | FFmpeg 版本 | | | └ systemInfo | String | 否 | - | 系统信息 (JSON) | | | └ lastHeartbeatAt | LocalDateTime | 否 | - | 最后心跳时间 | yyyy-MM-dd HH:mm:ss | | └ enabled | Boolean | 否 | - | 是否启用 | true | | └ loadRate | Double | 否 | - | 负载率 (0.0 - 1.0) | 0.0 | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | yyyy-MM-dd HH:mm:ss | | └ updatedAt | LocalDateTime | 否 | - | 更新时间 | yyyy-MM-dd HH:mm:ss | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": [ { "id": 0, "lssId": "string", "lssName": "string", "machineId": "string", "address": "string", "maxTasks": 0, "currentTasks": 0, "status": "string", "ffmpegVersion": "string", "systemInfo": "string", "lastHeartbeatAt": "yyyy-MM-dd HH:mm:ss", "enabled": true, "loadRate": 0, "createdAt": "yyyy-MM-dd HH:mm:ss", "updatedAt": "yyyy-MM-dd HH:mm:ss" } ] } ``` #### 错误码 无 ### 启用/禁用 LSS 节点 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/lss-nodes/setEnabled - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/lss-nodes/setEnabled 描述:启用/禁用 LSS 节点 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------- | ------- | ---- | -------- | ----------- | ------ | | lssId | string | 是 | - | LSS 节点 ID | | | enabled | boolean | 是 | - | 是否启用 | true | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无 ### 删除 LSS 节点 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/admin/lss-nodes/delete - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/admin/lss-nodes/delete 描述:删除 LSS 节点 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ----- | ------ | ---- | -------- | ----------- | ------ | | lssId | string | 是 | - | LSS 节点 ID | | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无 ### 获取 LSS 节点统计信息 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/admin/lss-nodes/stats - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/admin/lss-nodes/stats 描述:获取 LSS 节点统计信息 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------------- | ------- | ---- | -------- | ----------------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: LssNodeStats) | | | └ total | long | 否 | - | No comments found. | 0 | | └ online | long | 否 | - | No comments found. | 0 | | └ offline | long | 否 | - | No comments found. | 0 | | └ busy | long | 否 | - | No comments found. | 0 | | └ maintenance | long | 否 | - | No comments found. | 0 | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "total": 0, "online": 0, "offline": 0, "busy": 0, "maintenance": 0 } } ``` #### 错误码 无 ## 本地视频推流 Controller 本地视频直接推送到 Cloudflare WHIP: - POST /stream/local/start 启动本地视频推流 - POST /stream/local/stop 停止本地视频推流 - GET /stream/local/{name} 获取推流状态 - GET /stream/local/list 获取所有本地视频推流 ### 启动本地视频推流 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/stream/local/start - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/stream/local/start 描述:启动本地视频推流 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --------------- | ------- | ---- | -------- | ------------------------------------------- | ------ | | streamName | String | 否 | - | 流名称(唯一标识) | | | videoPath | String | 否 | - | 视频文件路径 | | | loop | Boolean | 否 | - | 是否循环播放 | true | | targetChannelId | String | 否 | - | 目标推流通道 ID(可选,不传则使用默认通道) | | #### 请求示例 ``` { "streamName": "string", "videoPath": "string", "loop": true, "targetChannelId": "string" } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | -------------- | ------- | ---- | -------- | ------------------------------------------ | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: LocalVideoStreamDTO) | | | └ streamName | String | 否 | - | 流名称 | | | └ sourceType | String | 否 | - | 源类型:local_video 或 rtsp_camera | | | └ sourcePath | String | 否 | - | 源路径(视频文件路径或 RTSP URL) | | | └ rtspUrl | String | 否 | - | MediaMTX 提供的 RTSP URL | | | └ loop | Boolean | 否 | - | 是否循环播放 | true | | └ streamTaskId | String | 否 | - | 推流任务 ID(如果已推送到 Cloudflare) | | | └ playbackUrl | String | 否 | - | 播放地址(Cloudflare HLS/WHEP) | | | └ status | String | 否 | - | 状态 | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "streamName": "string", "sourceType": "string", "sourcePath": "string", "rtspUrl": "string", "loop": true, "streamTaskId": "string", "playbackUrl": "string", "status": "string" } } ``` #### 错误码 无 ### 停止本地视频推流 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/stream/local/stop - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/stream/local/stop 描述:停止本地视频推流 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------ | ---- | -------- | ------------------ | ------ | | streamName | string | 是 | - | No comments found. | | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无 ### 获取本地视频推流状态 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/stream/local/{streamName} - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/local/{streamName} 描述:获取本地视频推流状态 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### Path 参数 | 名称 | 必填 | 描述 | 示例值 | | ---------- | ---- | ------------------ | ------ | | streamName | 是 | No comments found. | | #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | -------------- | ------- | ---- | -------- | ------------------------------------------ | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: LocalVideoStreamDTO) | | | └ streamName | String | 否 | - | 流名称 | | | └ sourceType | String | 否 | - | 源类型:local_video 或 rtsp_camera | | | └ sourcePath | String | 否 | - | 源路径(视频文件路径或 RTSP URL) | | | └ rtspUrl | String | 否 | - | MediaMTX 提供的 RTSP URL | | | └ loop | Boolean | 否 | - | 是否循环播放 | true | | └ streamTaskId | String | 否 | - | 推流任务 ID(如果已推送到 Cloudflare) | | | └ playbackUrl | String | 否 | - | 播放地址(Cloudflare HLS/WHEP) | | | └ status | String | 否 | - | 状态 | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "streamName": "string", "sourceType": "string", "sourcePath": "string", "rtspUrl": "string", "loop": true, "streamTaskId": "string", "playbackUrl": "string", "status": "string" } } ``` #### 错误码 无 ### 获取所有本地视频推流 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/stream/local/list - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/local/list 描述:获取所有本地视频推流 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | -------------- | ------- | ---- | -------- | -------------------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | array | 否 | | 响应数据 (ActualType: List) | | | └ streamName | String | 否 | - | 流名称 | | | └ sourceType | String | 否 | - | 源类型:local_video 或 rtsp_camera | | | └ sourcePath | String | 否 | - | 源路径(视频文件路径或 RTSP URL) | | | └ rtspUrl | String | 否 | - | MediaMTX 提供的 RTSP URL | | | └ loop | Boolean | 否 | - | 是否循环播放 | true | | └ streamTaskId | String | 否 | - | 推流任务 ID(如果已推送到 Cloudflare) | | | └ playbackUrl | String | 否 | - | 播放地址(Cloudflare HLS/WHEP) | | | └ status | String | 否 | - | 状态 | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": [ { "streamName": "string", "sourceType": "string", "sourcePath": "string", "rtspUrl": "string", "loop": true, "streamTaskId": "string", "playbackUrl": "string", "status": "string" } ] } ``` #### 错误码 无 ## 推流服务 Controller 推流管理 API 接口: - POST /stream/start 启动推流任务 - POST /stream/stop 停止推流任务 - GET /stream/task/{streamSn} 获取任务状态 - GET /stream/tasks 获取 LSS 推流任务列表 - GET /stream/tasks/active 获取所有活动任务 - GET /stream/channels 获取推流通道列表 - POST /stream/switch 切换推流源 ### 启动推流任务 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/stream/start - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/stream/start 描述:启动推流任务 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | name | String | 否 | - | 任务名称 | 投币机 1 号直播 | | lssId | String | 否 | - | LSS 节点 ID(可选,不传则自动选择) | lss_001 | | cameraId | String | 否 | - | 摄像头 ID(必填) | cam_001 | | sourceRtspUrl | String | 否 | - | 源 RTSP 地址(可选,如不传则从摄像头服务获取) | rtsp://admin:password@192.168.1.101:554/stream1 | | profile | String | 否 | - | 推流配置档位: low_latency / standard / file_loop | low_latency | | whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish | | playbackUrl | String | 否 | - | WebRTC 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/play | | remark | String | 否 | - | 备注 | | #### 请求示例 ``` { "name": "投币机1号直播", "lssId": "lss_001", "cameraId": "cam_001", "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1", "profile": "low_latency", "whipUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish", "playbackUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/play", "remark": "string" } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: StreamTaskDTO) | | | └ streamSn | String | 否 | - | 推流任务流水号 | stream_abc123def456 | | └ name | String | 否 | - | 任务名称 | 投币机 1 号直播 | | └ lssId | String | 否 | - | LSS 节点 ID | lss_001 | | └ cameraId | String | 否 | - | 摄像头 ID | cam_001 | | └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 | | └ profile | String | 否 | - | 推流配置档位: low_latency / standard / file_loop | low_latency | | └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish | | └ playbackUrl | String | 否 | - | WebRTC 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/play | | └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING | | └ statusDescription | String | 否 | - | 状态描述 | 推流中 | | └ errorMessage | String | 否 | - | 错误信息 | | | └ retryCount | int | 否 | - | 重试次数 | 0 | | └ remark | String | 否 | - | 备注 | | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 | | └ startedAt | LocalDateTime | 否 | - | 开始推流时间 | 2024-01-15T10:30:05 | | └ stoppedAt | LocalDateTime | 否 | - | 停止推流时间 | yyyy-MM-dd HH:mm:ss | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "streamSn": "stream_abc123def456", "name": "投币机1号直播", "lssId": "lss_001", "cameraId": "cam_001", "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1", "profile": "low_latency", "whipUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish", "playbackUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/play", "status": "STREAMING", "statusDescription": "推流中", "errorMessage": "string", "retryCount": 0, "remark": "string", "createdAt": "2024-01-15T10:30:00", "startedAt": "2024-01-15T10:30:05", "stoppedAt": "yyyy-MM-dd HH:mm:ss" } } ``` #### 错误码 无 ### 停止推流任务 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/stream/stop - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/stream/stop 描述:停止推流任务 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------ | ------ | ---- | -------- | ---------------------------------------------------- | ------------------- | | taskId | String | 否 | - | 推流任务流水号(与 lssId 二选一) | stream_abc123def456 | | lssId | String | 否 | - | LSS 节点 ID(与 taskId 二选一,停止该 LSS 所有推流) | lss_001 | #### 请求示例 ``` { "taskId": "stream_abc123def456", "lssId": "lss_001" } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无 ### 获取任务状态 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/stream/task/{streamSn} - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/task/{streamSn} 描述:获取任务状态 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### Path 参数 | 名称 | 必填 | 描述 | 示例值 | | -------- | ---- | -------------- | ------------------- | | streamSn | 是 | 推流任务流水号 | stream_abc123def456 | #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: StreamTaskDTO) | | | └ streamSn | String | 否 | - | 推流任务流水号 | stream_abc123def456 | | └ name | String | 否 | - | 任务名称 | 投币机 1 号直播 | | └ lssId | String | 否 | - | LSS 节点 ID | lss_001 | | └ cameraId | String | 否 | - | 摄像头 ID | cam_001 | | └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 | | └ profile | String | 否 | - | 推流配置档位: low_latency / standard / file_loop | low_latency | | └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish | | └ playbackUrl | String | 否 | - | WebRTC 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/play | | └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING | | └ statusDescription | String | 否 | - | 状态描述 | 推流中 | | └ errorMessage | String | 否 | - | 错误信息 | | | └ retryCount | int | 否 | - | 重试次数 | 0 | | └ remark | String | 否 | - | 备注 | | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 | | └ startedAt | LocalDateTime | 否 | - | 开始推流时间 | 2024-01-15T10:30:05 | | └ stoppedAt | LocalDateTime | 否 | - | 停止推流时间 | yyyy-MM-dd HH:mm:ss | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "streamSn": "stream_abc123def456", "name": "投币机1号直播", "lssId": "lss_001", "cameraId": "cam_001", "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1", "profile": "low_latency", "whipUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish", "playbackUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/play", "status": "STREAMING", "statusDescription": "推流中", "errorMessage": "string", "retryCount": 0, "remark": "string", "createdAt": "2024-01-15T10:30:00", "startedAt": "2024-01-15T10:30:05", "stoppedAt": "yyyy-MM-dd HH:mm:ss" } } ``` #### 错误码 无 ### 获取 LSS 推流任务列表 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/stream/tasks - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/tasks 描述:获取 LSS 推流任务列表 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ----- | ------ | ---- | -------- | ----------- | ------- | | lssId | string | 是 | - | LSS 节点 ID | lss_001 | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | array | 否 | | 响应数据 (ActualType: List) | | | └ streamSn | String | 否 | - | 推流任务流水号 | stream_abc123def456 | | └ name | String | 否 | - | 任务名称 | 投币机 1 号直播 | | └ lssId | String | 否 | - | LSS 节点 ID | lss_001 | | └ cameraId | String | 否 | - | 摄像头 ID | cam_001 | | └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 | | └ profile | String | 否 | - | 推流配置档位: low_latency / standard / file_loop | low_latency | | └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish | | └ playbackUrl | String | 否 | - | WebRTC 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/play | | └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING | | └ statusDescription | String | 否 | - | 状态描述 | 推流中 | | └ errorMessage | String | 否 | - | 错误信息 | | | └ retryCount | int | 否 | - | 重试次数 | 0 | | └ remark | String | 否 | - | 备注 | | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 | | └ startedAt | LocalDateTime | 否 | - | 开始推流时间 | 2024-01-15T10:30:05 | | └ stoppedAt | LocalDateTime | 否 | - | 停止推流时间 | yyyy-MM-dd HH:mm:ss | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": [ { "streamSn": "stream_abc123def456", "name": "投币机1号直播", "lssId": "lss_001", "cameraId": "cam_001", "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1", "profile": "low_latency", "whipUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish", "playbackUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/play", "status": "STREAMING", "statusDescription": "推流中", "errorMessage": "string", "retryCount": 0, "remark": "string", "createdAt": "2024-01-15T10:30:00", "startedAt": "2024-01-15T10:30:05", "stoppedAt": "yyyy-MM-dd HH:mm:ss" } ] } ``` #### 错误码 无 ### 获取所有活动任务 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/stream/tasks/active - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/tasks/active 描述:获取所有活动任务 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | array | 否 | | 响应数据 (ActualType: List) | | | └ streamSn | String | 否 | - | 推流任务流水号 | stream_abc123def456 | | └ name | String | 否 | - | 任务名称 | 投币机 1 号直播 | | └ lssId | String | 否 | - | LSS 节点 ID | lss_001 | | └ cameraId | String | 否 | - | 摄像头 ID | cam_001 | | └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 | | └ profile | String | 否 | - | 推流配置档位: low_latency / standard / file_loop | low_latency | | └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish | | └ playbackUrl | String | 否 | - | WebRTC 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/play | | └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING | | └ statusDescription | String | 否 | - | 状态描述 | 推流中 | | └ errorMessage | String | 否 | - | 错误信息 | | | └ retryCount | int | 否 | - | 重试次数 | 0 | | └ remark | String | 否 | - | 备注 | | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 | | └ startedAt | LocalDateTime | 否 | - | 开始推流时间 | 2024-01-15T10:30:05 | | └ stoppedAt | LocalDateTime | 否 | - | 停止推流时间 | yyyy-MM-dd HH:mm:ss | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": [ { "streamSn": "stream_abc123def456", "name": "投币机1号直播", "lssId": "lss_001", "cameraId": "cam_001", "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1", "profile": "low_latency", "whipUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish", "playbackUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/play", "status": "STREAMING", "statusDescription": "推流中", "errorMessage": "string", "retryCount": 0, "remark": "string", "createdAt": "2024-01-15T10:30:00", "startedAt": "2024-01-15T10:30:05", "stoppedAt": "yyyy-MM-dd HH:mm:ss" } ] } ``` #### 错误码 无 ### 获取推流通道列表 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/stream/channels - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/channels 描述:获取推流通道列表 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | array | 否 | | 响应数据 (ActualType: List) | | | └ channelId | String | 否 | - | 通道 ID | cf_channel_001 | | └ name | String | 否 | - | 通道名称 | 主推流通道 | | └ mode | String | 否 | - | 推流模式: WHIP, RTMPS | WHIP | | └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8 | | └ recordingEnabled | boolean | 否 | - | 是否启用录制 | false | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": [ { "channelId": "cf_channel_001", "name": "主推流通道", "mode": "WHIP", "hlsPlaybackUrl": "https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8", "recordingEnabled": false } ] } ``` #### 错误码 无 ### 切换推流源 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/stream/switch - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/stream/switch 描述:切换推流源 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ----------- | ------ | ---- | -------- | -------------- | ----------------------------------------------- | | streamSn | String | 是 | - | 推流任务流水号 | stream_abc123def456 | | newCameraId | String | 是 | - | 新的摄像头 ID | cam_001 | | newRtspUrl | String | 是 | - | 新的 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 | #### 请求示例 ``` { "streamSn": "stream_abc123def456", "newCameraId": "cam_001", "newRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1" } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: StreamTaskDTO) | | | └ streamSn | String | 否 | - | 推流任务流水号 | stream_abc123def456 | | └ name | String | 否 | - | 任务名称 | 投币机 1 号直播 | | └ lssId | String | 否 | - | LSS 节点 ID | lss_001 | | └ cameraId | String | 否 | - | 摄像头 ID | cam_001 | | └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 | | └ profile | String | 否 | - | 推流配置档位: low_latency / standard / file_loop | low_latency | | └ whipUrl | String | 否 | - | WHIP 推流地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish | | └ playbackUrl | String | 否 | - | WebRTC 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/webRTC/play | | └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING | | └ statusDescription | String | 否 | - | 状态描述 | 推流中 | | └ errorMessage | String | 否 | - | 错误信息 | | | └ retryCount | int | 否 | - | 重试次数 | 0 | | └ remark | String | 否 | - | 备注 | | | └ createdAt | LocalDateTime | 否 | - | 创建时间 | 2024-01-15T10:30:00 | | └ startedAt | LocalDateTime | 否 | - | 开始推流时间 | 2024-01-15T10:30:05 | | └ stoppedAt | LocalDateTime | 否 | - | 停止推流时间 | yyyy-MM-dd HH:mm:ss | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "streamSn": "stream_abc123def456", "name": "投币机1号直播", "lssId": "lss_001", "cameraId": "cam_001", "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1", "profile": "low_latency", "whipUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/publish", "playbackUrl": "https://customer-xxx.cloudflarestream.com/xxx/webRTC/play", "status": "STREAMING", "statusDescription": "推流中", "errorMessage": "string", "retryCount": 0, "remark": "string", "createdAt": "2024-01-15T10:30:00", "startedAt": "2024-01-15T10:30:05", "stoppedAt": "yyyy-MM-dd HH:mm:ss" } } ``` #### 错误码 无 ## 房间控制 Controller 房间播放 API 接口: - GET /room/{roomId}/play 获取播放信息(按需启动推流) - POST /room/{roomId}/stop 停止房间推流 ### 获取房间播放信息 按需启动推流: - 检查 FFmpeg 是否在跑 - 没跑则自动启动 - 返回 WHEP URL (WebRTC 播放) 维护人:TG Live #### URL - 本地开发环境: `GET` http://localhost:10050/api/room/{roomId}/play - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/room/{roomId}/play 描述:获取房间播放信息 按需启动推流: - 检查 FFmpeg 是否在跑 - 没跑则自动启动 - 返回 WHEP URL (WebRTC 播放) ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### Path 参数 | 名称 | 必填 | 描述 | 示例值 | | ------ | ---- | ------- | ------ | | roomId | 是 | 房间 ID | | #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | -------------- | ------- | ---- | -------- | --------------------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: RoomPlayResponse) | | | └ roomId | String | 否 | - | 房间 ID | | | └ taskId | String | 否 | - | 推流任务 ID | | | └ whepUrl | String | 否 | - | WHEP 播放地址 (WebRTC) | | | └ status | String | 否 | - | 推流状态 | | | └ newlyStarted | boolean | 否 | - | 是否为新启动的推流 | true | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "roomId": "string", "taskId": "string", "whepUrl": "string", "status": "string", "newlyStarted": true } } ``` #### 错误码 无 ### 停止房间推流 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/room/{roomId}/stop - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/room/{roomId}/stop 描述:停止房间推流 ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### Path 参数 | 名称 | 必填 | 描述 | 示例值 | | ------ | ---- | ------- | ------ | | roomId | 是 | 房间 ID | | #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无 ## Ably Token 接口 前端通过此接口获取 Ably Token,用于连接 Ably 实时通信 ### 获取 Ably Token 前端使用此 Token 连接 Ably,只授予订阅权限(不能发布) #### URL - 本地开发环境: `GET` http://localhost:10050/api/ably/token - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/ably/token 描述:获取 Ably Token 前端使用此 Token 连接 Ably,只授予订阅权限(不能发布) ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 ##### Query Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | -------- | ------ | ---- | -------- | --------------------------------- | ---------- | | clientId | string | 否 | - | 客户端标识(如用户 ID 或会话 ID) | web-client | #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------------ | ------- | ---- | -------- | -------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: Map) | | | └ mapKey | Object | 否 | | A map key. | | | └ any object | object | 否 | - | any object. | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "mapKey": { "any object": {} } } } ``` #### 错误码 无 ### 获取 Ably 连接信息 返回前端连接 Ably 所需的配置信息(不包含 API Key) #### URL - 本地开发环境: `GET` http://localhost:10050/api/ably/config - 开发环境: `GET` https://tg-live-game.pwtk.cc/api/ably/config 描述:获取 Ably 连接信息 返回前端连接 Ably 所需的配置信息(不包含 API Key) ContentType:`application/x-www-form-urlencoded;charset=UTF-8` #### 请求参数 #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ------------ | ------- | ---- | -------- | -------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | | 响应数据 (ActualType: Map) | | | └ mapKey | Object | 否 | | A map key. | | | └ any object | object | 否 | - | any object. | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": { "mapKey": { "any object": {} } } } ``` #### 错误码 无 ## LSS 回调接口 接收来自 LSS (Local Sender Service) 的回调请求: - 节点注册 - 心跳上报 - 任务状态回调 ### LSS 节点注册 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/lss/register - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/lss/register 描述:LSS 节点注册 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ----------------- | ---------- | ---- | -------- | ------------------ | ------ | | nodeId | String | 否 | - | No comments found. | | | nodeName | String | 否 | - | No comments found. | | | nodeIp | String | 否 | - | No comments found. | | | nodePort | Integer | 否 | - | No comments found. | 0 | | machineId | String | 否 | - | No comments found. | | | maxTasks | int | 否 | - | No comments found. | 0 | | ffmpegPath | String | 否 | - | No comments found. | | | systemInfo | SystemInfo | 否 | | No comments found. | | | └ os | String | 否 | - | No comments found. | | | └ cpuCores | int | 否 | - | No comments found. | 0 | | └ totalMemory | long | 否 | - | No comments found. | 0 | | └ availableMemory | long | 否 | - | No comments found. | 0 | | └ ffmpegVersion | String | 否 | - | No comments found. | | #### 请求示例 ``` { "nodeId": "string", "nodeName": "string", "nodeIp": "string", "nodePort": 0, "machineId": "string", "maxTasks": 0, "ffmpegPath": "string", "systemInfo": { "os": "string", "cpuCores": 0, "totalMemory": 0, "availableMemory": 0, "ffmpegVersion": "string" } } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无 ### LSS 心跳上报 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/lss/heartbeat - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/lss/heartbeat 描述:LSS 心跳上报 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --------------- | ------ | ---- | -------- | ------------------ | ------ | | nodeId | String | 否 | - | No comments found. | | | activeTaskCount | int | 否 | - | No comments found. | 0 | | cpuUsage | Double | 否 | - | No comments found. | 0.0 | | memoryUsage | Double | 否 | - | No comments found. | 0.0 | #### 请求示例 ``` { "nodeId": "string", "activeTaskCount": 0, "cpuUsage": 0, "memoryUsage": 0 } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无 ### LSS 任务状态回调 维护人:TG Live #### URL - 本地开发环境: `POST` http://localhost:10050/api/lss/task/callback - 开发环境: `POST` https://tg-live-game.pwtk.cc/api/lss/task/callback 描述:LSS 任务状态回调 ContentType:`application/json` #### 请求参数 ##### Body Parameter | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | taskId | String | 否 | - | No comments found. | | | nodeId | String | 否 | - | No comments found. | | | callbackType | enum | 否 | - | No comments found.
[Enum values:
STARTED()
STOPPED()
ERROR()
STATUS_UPDATE()
] | STARTED | | status | String | 否 | - | No comments found. | | | processId | Long | 否 | - | No comments found. | 0 | | hlsPlaybackUrl | String | 否 | - | No comments found. | | | errorMessage | String | 否 | - | No comments found. | | #### 请求示例 ``` { "taskId": "string", "nodeId": "string", "callbackType": "STARTED", "status": "string", "processId": 0, "hlsPlaybackUrl": "string", "errorMessage": "string" } ``` #### 响应参数 | 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 | | ---------- | ------- | ---- | -------- | --------------------------- | ------ | | success | Boolean | 否 | - | 请求是否成功 | true | | errCode | String | 否 | - | 错误码(失败时返回) | | | errMessage | String | 否 | - | 错误信息(失败时返回) | | | data | object | 否 | - | 响应数据 (ActualType: Void) | | #### 响应示例 ``` { "success": true, "errCode": "string", "errMessage": "string", "data": {} } ``` #### 错误码 无