Files
kra-new/docs/LIVE.md
T

116 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Go WebRTC Live
直播功能使用 Pion WebRTC,在现有 GVA WebSocket 和 JWT 用户体系上实现单主播、多观众的 SFU 转发。
## WebSocket
连接现有 WebSocket 地址(默认 `/ws`),握手必须携带 GVA JWT:
```text
wss://host/ws?token=<x-token>
```
连接后发送:
```json
{"type":"Join","payload":{"role":"publisher","streamId":"room-1"}}
```
角色支持 `publisher`、`subscriber`、`observer`。主播和观众完成 Join 后,浏览器发送 SDP offer:
```json
{"type":"Offer","payload":{"type":"offer","sdp":"v=0..."}}
```
服务端返回 `Answer`。主播使用发送方向的 transceiver,观众使用接收方向的 transceiver。媒体轨道由 Pion 在服务端复制给同一房间的所有观众。
其他消息:
- `Heartbeat` / `HeartbeatAck`
- `PublisherStatus`
- `NewProducer`
- `ProducerClosed`
- `NewSubscriber`
- `SubscriberLeft`
- `StreamListUpdate`
- `Kicked`
- `ChatHistory`:加入房间后返回最近 100 条聊天和礼物消息
- `ChatMessage`:普通聊天广播
- `GiftMessage`:送礼成功后的礼物广播
发送聊天消息:
```json
{"type":"ChatSend","payload":{"content":"大家好"}}
```
聊天只允许已经以主播或观众身份加入该房间的登录用户发送,内容最多 50 个字符。
主播和观众 45 秒没有心跳会被清理,直播房间最多 20 个;同一用户在同一房间重复观看时,旧连接会收到 `Kicked`。
## HTTP
公开列表接口:
```text
GET /live/streams
GET /live/streams/:streamId
GET /api/streams # 旧客户端兼容别名
GET /live/categories
GET /live/rooms?page=1&pageSize=20&categoryId=1&status=live
GET /live/rooms/:id
GET /live/rooms/:id/messages?limit=100
GET /live/gifts
```
PC 客户端账号接口:
```text
POST /live/client/auth/register
POST /live/client/auth/login
GET /live/client/me
PUT /live/client/me
PUT /live/client/me/password
```
客户端账号使用系统的 `sys_users` 表,注册时创建普通直播角色并初始化 100 钻石。注册和修改密码都会返回新的 JWT 登录态。
登录后可调用:
```text
POST /live/rooms/:id/gifts
GET /live/recharge/plans
POST /live/recharge/orders
```
创建充值订单直接接入 KRA 通用支付订单,请求使用支付模块的渠道标识:
```json
{
"planId": 1,
"provider": "wechat-v3",
"notifyUrl": "https://example.com/api/payment/callback/wechat-v3",
"returnUrl": "https://example.com/recharge/result"
}
```
充值档位、用户和钻石数量保存在直播业务订单中;渠道交易号、支付状态、回调、退款状态和事件流水统一保存在 KRA 的 `pay_orders` / `pay_events`。支付确认后由通用支付发货流程幂等增加钻石余额。
礼物数量必须使用礼物接口返回的 `tiers`,扣款、礼物流水和钱包余额在同一事务内完成;成功后通过 `GiftMessage` 广播给房间内在线用户。
全站设置继续保存在 `live_settings`。字典用于稳定的枚举和下拉选项,不适合承载站点名称、公告、功能开关、兑换比例等需要类型校验和运行时读取的配置。
直播状态和在线连接是进程内状态,行为与旧项目一致;服务重启后房间自动清空。
## 网络配置
默认使用 Pion 主机候选。生产环境可以配置:
```text
KRA_LIVE_STUN_URL=stun:stun.example.com:3478
KRA_LIVE_UDP_MIN_PORT=40000
KRA_LIVE_UDP_MAX_PORT=49999
```
配置 UDP 端口范围后,需要在防火墙或容器网络中放行对应端口。