# 文档

## 摄像头控制 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 | 否 | - | 摄像头名称 | 主摄像头 |
| └ machineId | String | 否 | - | 所属机器 ID | machine_001 |
| └ status | String | 否 | - | 摄像头状态: ONLINE, OFFLINE | ONLINE |
| └ capability | String | 否 | - | 摄像头能力: switch_only, ptz_enabled | ptz_enabled |
| └ ptzSupported | Boolean | 否 | - | 是否支持 PTZ | true |
| └ channels | List<ChannelDTO> | 否 |  | 通道列表 (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": [
        {
            "cameraId": "cam_001",
            "name": "主摄像头",
            "machineId": "machine_001",
            "status": "ONLINE",
            "capability": "ptz_enabled",
            "ptzSupported": true,
            "channels": [
                {
                    "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/{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 | 否 | - | 摄像头名称 | 主摄像头 |
| └ machineId | String | 否 | - | 所属机器 ID | machine_001 |
| └ status | String | 否 | - | 摄像头状态: ONLINE, OFFLINE | ONLINE |
| └ capability | String | 否 | - | 摄像头能力: switch_only, ptz_enabled | ptz_enabled |
| └ ptzSupported | Boolean | 否 | - | 是否支持 PTZ | true |
| └ channels | List<ChannelDTO> | 否 |  | 通道列表 (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": {
        "cameraId": "cam_001",
        "name": "主摄像头",
        "machineId": "machine_001",
        "status": "ONLINE",
        "capability": "ptz_enabled",
        "ptzSupported": true,
        "channels": [
            {
                "channelId": "ch_001",
                "name": "主通道",
                "rtspUrl": "rtsp://192.168.1.100:554/stream1",
                "defaultView": true,
                "status": "ONLINE",
                "cameraId": "cam_001"
            }
        ]
    }
}
```

#### 错误码

无

### 切换摄像头通道（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      | 水平移动速度<br>负值向左，正值向右<br>范围: -100 ~ 100 | 0      |
| tilt    | Integer | 否   | 100      | 垂直移动速度<br>负值向下，正值向上<br>范围: -100 ~ 100 | 0      |
| zoom    | Integer | 否   | 100      | 缩放速度<br>负值缩小，正值放大<br>范围: -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        |
| machineId | String  | 否   | -        | 机器 ID 过滤                                    | machine_001 |
| status    | String  | 否   | -        | 在线状态过滤 (ONLINE/OFFLINE)                   | ONLINE      |

#### 请求示例

```
{
    "page": 1,
    "size": 10,
    "keyword": "摄像头",
    "enabled": true,
    "sortBy": "createdAt",
    "sortDir": "DESC",
    "machineId": "machine_001",
    "status": "ONLINE"
}
```

#### 响应参数

| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
| --- | --- | --- | --- | --- | --- |
| success | Boolean | 否 | - | 请求是否成功 | true |
| errCode | String | 否 | - | 错误码（失败时返回） |  |
| errMessage | String | 否 | - | 错误信息（失败时返回） |  |
| data | object | 否 |  | 响应数据 (ActualType: PageResponse) |  |
| └ list | List<T> | 否 |  | 数据列表 (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 |
| └ machineId | String | 否 | - | 所属机器 ID | machine_001 |
| └ machineName | String | 否 | - | 所属机器名称 | 1 号机 |
| └ enabled | Boolean | 否 | - | 是否启用 | true |
| └ channels | List<ChannelInfoDTO> | 否 |  | 通道列表 (ActualType: ChannelInfoDTO) |  |
| └ id | Long | 否 | - | 主键 ID | 1 |
| └ 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 |
| └ 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",
                "machineId": "machine_001",
                "machineName": "1号机",
                "enabled": true,
                "channels": [
                    {
                        "id": 1,
                        "channelId": "ch_001",
                        "name": "主通道",
                        "rtspUrl": "rtsp://192.168.1.100:554/stream1",
                        "defaultView": true,
                        "status": "ONLINE"
                    }
                ],
                "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 |
| └ machineId | String | 否 | - | 所属机器 ID | machine_001 |
| └ machineName | String | 否 | - | 所属机器名称 | 1 号机 |
| └ enabled | Boolean | 否 | - | 是否启用 | true |
| └ channels | List<ChannelInfoDTO> | 否 |  | 通道列表 (ActualType: ChannelInfoDTO) |  |
| └ id | Long | 否 | - | 主键 ID | 1 |
| └ 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 |
| └ 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",
            "machineId": "machine_001",
            "machineName": "1号机",
            "enabled": true,
            "channels": [
                {
                    "id": 1,
                    "channelId": "ch_001",
                    "name": "主通道",
                    "rtspUrl": "rtsp://192.168.1.100:554/stream1",
                    "defaultView": true,
                    "status": "ONLINE"
                }
            ],
            "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 |
| └ machineId | String | 否 | - | 所属机器 ID | machine_001 |
| └ machineName | String | 否 | - | 所属机器名称 | 1 号机 |
| └ enabled | Boolean | 否 | - | 是否启用 | true |
| └ channels | List<ChannelInfoDTO> | 否 |  | 通道列表 (ActualType: ChannelInfoDTO) |  |
| └ id | Long | 否 | - | 主键 ID | 1 |
| └ 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 |
| └ 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",
        "machineId": "machine_001",
        "machineName": "1号机",
        "enabled": true,
        "channels": [
            {
                "id": 1,
                "channelId": "ch_001",
                "name": "主通道",
                "rtspUrl": "rtsp://192.168.1.100:554/stream1",
                "defaultView": true,
                "status": "ONLINE"
            }
        ],
        "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（唯一标识）<br>Validate[max: 50; ] | cam_001 |
| name | String | 是 | 100 | 名称<br>Validate[max: 100; ] | 主摄像头 |
| ip | String | 是 | - | IP 地址<br>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 | 用户名<br>Validate[max: 50; ] | admin |
| password | String | 否 | 100 | 密码<br>Validate[max: 100; ] | password123 |
| brand | String | 否 | 30 | 品牌<br>Validate[max: 30; ] | hikvision |
| capability | String | 否 | - | 能力: switch_only, ptz_enabled<br>Validate[regexp: ^(switch_only | ptz_enabled)$; ] | ptz_enabled |
| machineId | String | 否 | - | 所属机器 ID | machine_001 |
| channels | List<CameraAddRequest$ChannelAddRequest> | 否 |  | 通道列表 (ActualType: ChannelAddRequest) |  |
| └ channelId | String | 是 | - | 通道 ID | ch_001 |
| └ name | String | 是 | - | 通道名称 | 主通道 |
| └ rtspUrl | String | 否 | - | RTSP 地址 | rtsp://192.168.1.100:554/stream1 |
| └ defaultView | Boolean | 否 | - | 是否默认视角 | true |

#### 请求示例

```
{
    "cameraId": "cam_001",
    "name": "主摄像头",
    "ip": "192.168.1.100",
    "port": 80,
    "username": "admin",
    "password": "password123",
    "brand": "hikvision",
    "capability": "ptz_enabled",
    "machineId": "machine_001",
    "channels": [
        {
            "channelId": "ch_001",
            "name": "主通道",
            "rtspUrl": "rtsp://192.168.1.100:554/stream1",
            "defaultView": 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 |
| └ machineId | String | 否 | - | 所属机器 ID | machine_001 |
| └ machineName | String | 否 | - | 所属机器名称 | 1 号机 |
| └ enabled | Boolean | 否 | - | 是否启用 | true |
| └ channels | List<ChannelInfoDTO> | 否 |  | 通道列表 (ActualType: ChannelInfoDTO) |  |
| └ id | Long | 否 | - | 主键 ID | 1 |
| └ 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 |
| └ 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",
        "machineId": "machine_001",
        "machineName": "1号机",
        "enabled": true,
        "channels": [
            {
                "id": 1,
                "channelId": "ch_001",
                "name": "主通道",
                "rtspUrl": "rtsp://192.168.1.100:554/stream1",
                "defaultView": true,
                "status": "ONLINE"
            }
        ],
        "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 |
| machineId | String | 否 | - | 所属机器 ID | machine_001 |
| enabled | Boolean | 否 | - | 启用状态 | true |
| channels | List<CameraUpdateRequest$ChannelUpdateRequest> | 否 |  | 通道列表 (ActualType: ChannelUpdateRequest) |  |
| └ id | Long | 否 | - | 通道数据库 ID | 1 |
| └ channelId | String | 否 | - | 通道 ID | ch_001 |
| └ name | String | 否 | - | 通道名称 | 主通道 |
| └ rtspUrl | String | 否 | - | RTSP 地址 | rtsp://192.168.1.100:554/stream1 |
| └ defaultView | Boolean | 否 | - | 是否默认视角 | true |

#### 请求示例

```
{
    "id": 1,
    "name": "主摄像头",
    "ip": "192.168.1.100",
    "port": 80,
    "username": "admin",
    "password": "password123",
    "brand": "hikvision",
    "capability": "ptz_enabled",
    "machineId": "machine_001",
    "enabled": true,
    "channels": [
        {
            "id": 1,
            "channelId": "ch_001",
            "name": "主通道",
            "rtspUrl": "rtsp://192.168.1.100:554/stream1",
            "defaultView": 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 |
| └ machineId | String | 否 | - | 所属机器 ID | machine_001 |
| └ machineName | String | 否 | - | 所属机器名称 | 1 号机 |
| └ enabled | Boolean | 否 | - | 是否启用 | true |
| └ channels | List<ChannelInfoDTO> | 否 |  | 通道列表 (ActualType: ChannelInfoDTO) |  |
| └ id | Long | 否 | - | 主键 ID | 1 |
| └ 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 |
| └ 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",
        "machineId": "machine_001",
        "machineName": "1号机",
        "enabled": true,
        "channels": [
            {
                "id": 1,
                "channelId": "ch_001",
                "name": "主通道",
                "rtspUrl": "rtsp://192.168.1.100:554/stream1",
                "defaultView": true,
                "status": "ONLINE"
            }
        ],
        "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<T>       | 否   |          | 数据列表 (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（唯一标识）<br>Validate[max: 50; ] | machine_001 |
| name        | String | 是   | 100      | 名称<br>Validate[max: 100; ]               | 1 号机      |
| location    | String | 否   | 200      | 位置<br>Validate[max: 200; ]               | A 区 1 楼   |
| description | String | 否   | 500      | 描述<br>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<T> | 否 |  | 数据列表 (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       | 用户名<br>Validate[max: 50; ] | admin  |
| password | String | 是   | 100      | 密码<br>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 字符）<br>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
    }
}
```

#### 错误码

无

## 本地视频推流 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/{taskId} 获取任务状态
- GET /stream/tasks 获取机器推流任务列表
- GET /stream/tasks/active 获取所有活动任务
- GET /stream/channels 获取推流通道列表
- POST /stream/task/{taskId}/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

| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
| --- | --- | --- | --- | --- | --- |
| machineId | String | 否 | - | 机器 ID（必填） | machine_001 |
| cameraId | String | 否 | - | 摄像头 ID（必填） | hikvision_ptz |
| cameraChannelId | String | 否 | - | 摄像头通道 ID（必填） | hik_main |
| sourceRtspUrl | String | 否 | - | 源 RTSP 地址（可选，如不传则从摄像头服务获取） | rtsp://admin:password@192.168.1.101:554/stream1 |
| targetChannelId | String | 否 | - | 目标推流通道 ID（可选，如不传则使用默认通道） | cf_channel_001 |

#### 请求示例

```
{
    "machineId": "machine_001",
    "cameraId": "hikvision_ptz",
    "cameraChannelId": "hik_main",
    "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
    "targetChannelId": "cf_channel_001"
}
```

#### 响应参数

| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
| --- | --- | --- | --- | --- | --- |
| success | Boolean | 否 | - | 请求是否成功 | true |
| errCode | String | 否 | - | 错误码（失败时返回） |  |
| errMessage | String | 否 | - | 错误信息（失败时返回） |  |
| data | object | 否 |  | 响应数据 (ActualType: StreamTaskDTO) |  |
| └ taskId | String | 否 | - | 任务 ID | task_abc123def456 |
| └ machineId | String | 否 | - | 机器 ID | machine_001 |
| └ cameraId | String | 否 | - | 摄像头 ID | hikvision_ptz |
| └ cameraChannelId | String | 否 | - | 摄像头通道 ID | hik_main |
| └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
| └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING |
| └ statusDescription | String | 否 | - | 状态描述 | 推流中 |
| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8 |
| └ errorMessage | String | 否 | - | 错误信息 |  |
| └ retryCount | int | 否 | - | 重试次数 | 0 |
| └ 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": {
        "taskId": "task_abc123def456",
        "machineId": "machine_001",
        "cameraId": "hikvision_ptz",
        "cameraChannelId": "hik_main",
        "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
        "status": "STREAMING",
        "statusDescription": "推流中",
        "hlsPlaybackUrl": "https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8",
        "errorMessage": "string",
        "retryCount": 0,
        "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 | 否   | -        | 任务 ID（与 machineId 二选一）                  | task_abc123def456 |
| machineId | String | 否   | -        | 机器 ID（与 taskId 二选一，停止该机器所有推流） | machine_001       |

#### 请求示例

```
{
    "taskId": "task_abc123def456",
    "machineId": "machine_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/{taskId}
- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/task/{taskId}

描述：获取任务状态

ContentType：`application/x-www-form-urlencoded;charset=UTF-8`

#### Path 参数

| 名称   | 必填 | 描述    | 示例值            |
| ------ | ---- | ------- | ----------------- |
| taskId | 是   | 任务 ID | task_abc123def456 |

#### 请求参数

#### 响应参数

| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
| --- | --- | --- | --- | --- | --- |
| success | Boolean | 否 | - | 请求是否成功 | true |
| errCode | String | 否 | - | 错误码（失败时返回） |  |
| errMessage | String | 否 | - | 错误信息（失败时返回） |  |
| data | object | 否 |  | 响应数据 (ActualType: StreamTaskDTO) |  |
| └ taskId | String | 否 | - | 任务 ID | task_abc123def456 |
| └ machineId | String | 否 | - | 机器 ID | machine_001 |
| └ cameraId | String | 否 | - | 摄像头 ID | hikvision_ptz |
| └ cameraChannelId | String | 否 | - | 摄像头通道 ID | hik_main |
| └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
| └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING |
| └ statusDescription | String | 否 | - | 状态描述 | 推流中 |
| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8 |
| └ errorMessage | String | 否 | - | 错误信息 |  |
| └ retryCount | int | 否 | - | 重试次数 | 0 |
| └ 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": {
        "taskId": "task_abc123def456",
        "machineId": "machine_001",
        "cameraId": "hikvision_ptz",
        "cameraChannelId": "hik_main",
        "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
        "status": "STREAMING",
        "statusDescription": "推流中",
        "hlsPlaybackUrl": "https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8",
        "errorMessage": "string",
        "retryCount": 0,
        "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
- 开发环境: `GET` https://tg-live-game.pwtk.cc/api/stream/tasks

描述：获取机器推流任务列表

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) |  |
| └ taskId | String | 否 | - | 任务 ID | task_abc123def456 |
| └ machineId | String | 否 | - | 机器 ID | machine_001 |
| └ cameraId | String | 否 | - | 摄像头 ID | hikvision_ptz |
| └ cameraChannelId | String | 否 | - | 摄像头通道 ID | hik_main |
| └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
| └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING |
| └ statusDescription | String | 否 | - | 状态描述 | 推流中 |
| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8 |
| └ errorMessage | String | 否 | - | 错误信息 |  |
| └ retryCount | int | 否 | - | 重试次数 | 0 |
| └ 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": [
        {
            "taskId": "task_abc123def456",
            "machineId": "machine_001",
            "cameraId": "hikvision_ptz",
            "cameraChannelId": "hik_main",
            "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
            "status": "STREAMING",
            "statusDescription": "推流中",
            "hlsPlaybackUrl": "https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8",
            "errorMessage": "string",
            "retryCount": 0,
            "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) |  |
| └ taskId | String | 否 | - | 任务 ID | task_abc123def456 |
| └ machineId | String | 否 | - | 机器 ID | machine_001 |
| └ cameraId | String | 否 | - | 摄像头 ID | hikvision_ptz |
| └ cameraChannelId | String | 否 | - | 摄像头通道 ID | hik_main |
| └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
| └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING |
| └ statusDescription | String | 否 | - | 状态描述 | 推流中 |
| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8 |
| └ errorMessage | String | 否 | - | 错误信息 |  |
| └ retryCount | int | 否 | - | 重试次数 | 0 |
| └ 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": [
        {
            "taskId": "task_abc123def456",
            "machineId": "machine_001",
            "cameraId": "hikvision_ptz",
            "cameraChannelId": "hik_main",
            "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
            "status": "STREAMING",
            "statusDescription": "推流中",
            "hlsPlaybackUrl": "https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8",
            "errorMessage": "string",
            "retryCount": 0,
            "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

| 名称         | 类型   | 必填 | 最大长度 | 描述              | 示例值                                          |
| ------------ | ------ | ---- | -------- | ----------------- | ----------------------------------------------- |
| taskId       | String | 是   | -        | 任务 ID           | task_abc123def456                               |
| newChannelId | String | 是   | -        | 新的摄像头通道 ID | hik_main                                        |
| newRtspUrl   | String | 是   | -        | 新的 RTSP 地址    | rtsp://admin:password@192.168.1.101:554/stream1 |

#### 请求示例

```
{
    "taskId": "task_abc123def456",
    "newChannelId": "hik_main",
    "newRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1"
}
```

#### 响应参数

| 名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
| --- | --- | --- | --- | --- | --- |
| success | Boolean | 否 | - | 请求是否成功 | true |
| errCode | String | 否 | - | 错误码（失败时返回） |  |
| errMessage | String | 否 | - | 错误信息（失败时返回） |  |
| data | object | 否 |  | 响应数据 (ActualType: StreamTaskDTO) |  |
| └ taskId | String | 否 | - | 任务 ID | task_abc123def456 |
| └ machineId | String | 否 | - | 机器 ID | machine_001 |
| └ cameraId | String | 否 | - | 摄像头 ID | hikvision_ptz |
| └ cameraChannelId | String | 否 | - | 摄像头通道 ID | hik_main |
| └ sourceRtspUrl | String | 否 | - | 源 RTSP 地址 | rtsp://admin:password@192.168.1.101:554/stream1 |
| └ status | String | 否 | - | 推流状态: IDLE, STARTING, STREAMING, STOPPED, ERROR | STREAMING |
| └ statusDescription | String | 否 | - | 状态描述 | 推流中 |
| └ hlsPlaybackUrl | String | 否 | - | HLS 播放地址 | https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8 |
| └ errorMessage | String | 否 | - | 错误信息 |  |
| └ retryCount | int | 否 | - | 重试次数 | 0 |
| └ 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": {
        "taskId": "task_abc123def456",
        "machineId": "machine_001",
        "cameraId": "hikvision_ptz",
        "cameraChannelId": "hik_main",
        "sourceRtspUrl": "rtsp://admin:password@192.168.1.101:554/stream1",
        "status": "STREAMING",
        "statusDescription": "推流中",
        "hlsPlaybackUrl": "https://customer-xxx.cloudflarestream.com/xxx/manifest/video.m3u8",
        "errorMessage": "string",
        "retryCount": 0,
        "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": {}
}
```

#### 错误码

无
