Files
kra-new/docs/LIVE.md
T
2026-09-23 17:42:55 +08:00

4.9 KiB
Raw Blame History

Go WebRTC Live

直播功能使用 Pion WebRTC,在现有 GVA WebSocket 和 JWT 用户体系上实现单主播、多观众的 SFU 转发。

WebSocket

连接现有 WebSocket 地址(默认 /ws)。观看直播允许匿名握手;登录用户可携带 GVA JWT,以使用聊天和开播能力:

wss://host/ws?token=<x-token>

连接后发送:

{"type":"Join","payload":{"role":"publisher","streamId":"room-1"}}

角色支持 publisher、subscriber、observer。subscriber 可匿名加入,publisher 必须登录且只能发布自己拥有的启用直播间。主播和观众完成 Join 后,浏览器发送 SDP offer:

{"type":"Offer","payload":{"type":"offer","sdp":"v=0..."}}

服务端返回 Answer。主播使用发送方向的 transceiver,观众使用接收方向的 transceiver。媒体轨道由 Pion 在服务端复制给同一房间的所有观众。

其他消息:

  • Heartbeat / HeartbeatAck
  • PublisherStatus
  • NewProducer
  • ProducerClosed
  • NewSubscriber
  • SubscriberLeft
  • StreamListUpdate
  • Kicked
  • ChatMessage:普通聊天广播
  • GiftMessage:送礼成功后的礼物广播

发送聊天消息:

{"type":"ChatSend","payload":{"content":"大家好"}}

聊天只允许已经以主播或观众身份加入该房间的登录用户发送,内容最多 50 个字符。消息只保存在当前服务进程内,每个房间最多 100 条;加入房间不会回放进入前的消息,开播、关播或服务重启都会清空该房间聊天。

主播和观众 45 秒没有心跳会被清理,直播房间最多 20 个;同一用户在同一房间重复观看时,旧连接会收到 Kicked。

HTTP

公开列表接口:

GET /live/streams
GET /live/streams/:streamId
GET /live/categories
GET /live/rooms?page=1&pageSize=20&categoryId=1&status=live&orderBy=viewer_count_desc
GET /live/rooms/:id
POST /live/rooms/:id/like
GET /live/rooms/:id/messages?limit=100
GET /live/gifts
GET /live/recharge/providers
GET /live/recharge/plans

/live/rooms 默认只返回当前直播中的启用房间,并按在线人数倒序排列;支持 categoryId、page、pageSize 和 orderBy 筛选/排序。房间响应同时返回 viewerCountText(如 5.1k、1.0w)以及直播中的 startedAt。

聊天历史 HTTP 接口保留用于客户端契约兼容,但验证房间后始终返回空列表,不会向新进入用户泄露此前聊天。

PC 客户端账号接口:

POST /live/client/auth/register
POST /live/client/auth/login
POST /live/client/auth/logout
GET  /live/client/me
GET  /live/client/balance
PUT  /live/client/me
PUT  /live/client/me/password

客户端账号使用系统的 sys_users 表。注册昵称可选,未填写时使用用户名,填写时限制为 2–16 个字符;新账号创建普通直播角色并初始化 100 钻石,历史账号缺少钱包时也补建 100 钻石。注册和修改密码都会返回新的 JWT 登录态。

登录后可调用:

GET  /live/rooms/:id/follow
POST /live/rooms/:id/follow
DELETE /live/rooms/:id/follow
POST /live/rooms/:id/gifts
POST /live/recharge/orders
GET  /live/recharge/orders/:orderNo
GET  /live/recharge/orders/:orderNo/status

点赞不要求登录,点赞数只在当前进程的直播运行态中累加;关注关系按直播用户和房间保存,登录后可查询、关注或取消关注。

创建充值订单直接接入 KRA 通用支付订单,请求使用支付模块的渠道标识:

{
  "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。支付确认后由通用支付发货流程幂等增加钻石余额。

礼物数量允许 1..9999,礼物接口返回的 tiers 仅作为快捷数量。服务端会拒绝向未开播房间送礼;扣款、礼物流水和钱包余额在同一事务内完成,余额不会小于 0。余额不足时返回 required、balance 和 missing,供客户端打开充值流程;成功后通过 GiftMessage 广播给房间内在线用户。

全站设置继续保存在 live_settings。字典用于稳定的枚举和下拉选项,不适合承载站点名称、公告、功能开关、兑换比例等需要类型校验和运行时读取的配置。

直播状态和在线连接是进程内状态,行为与旧项目一致;服务重启后房间自动清空。

网络配置

默认使用 Pion 主机候选。生产环境可以配置:

KRA_LIVE_STUN_URL=stun:stun.example.com:3478
KRA_LIVE_UDP_MIN_PORT=40000
KRA_LIVE_UDP_MAX_PORT=49999

配置 UDP 端口范围后,需要在防火墙或容器网络中放行对应端口。