# 文档
## 摄像头控制 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": {}
}
```
#### 错误码
无