直播能力接入文档
提供低延迟实时音视频房间, 业务方通过签发 Token + iframe 嵌入即可让自家系统拥有完整直播功能。
概述
开放平台直播能力面向业务方提供完整的实时音视频直播间, 业务方只需:
- 用应用 Key 调一次接口签发直播 Token
- 把 Token 通过 URL 参数传给官方直播间页
- 在自家页面通过
iframe嵌入即可
无需关心音视频协议 / 信令服务器 / 边缘节点等基础设施。三种官方直播间形态:
| 形态 | 路径 | 适用场景 |
|---|---|---|
| 主播开播台 | /host.html | 深色专业 UI, 自带美颜 / 弹幕 / 在线数 / 商品推送 |
| 观众观看页 | /watch.html | 移动端竖屏 + 抖音式互动 (点赞飘心 / 弹幕 / 商品咨询) |
| 会议室 | /room | 多人音视频会议 (1v1 答疑 / 多对多研讨) |
接入流程
- 控制台注册账号 → 创建应用 → 拿到
sk-live-*Key - 在应用详情页订阅直播能力
- 业务方后端用 sk-live Key 调签发 Token 接口
- 把 Token 通过 URL 参数传给 iframe, 嵌入自家页面
- (可选) 监听 iframe postMessage 处理报名 / 咨询等业务事件
鉴权
所有 /api/v1/live/* 接口走 sk-live Bearer Key 鉴权, 在请求头加:
Authorization: Bearer sk-live-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Key 只能由业务方后端持有, 不能暴露到浏览器。浏览器侧只接受签好的直播 Token 或入场凭证 (entry_token)。
签发直播 Token
POST /api/v1/live/tokens
请求示例
curl -X POST https://open.zcode.team/api/v1/live/tokens \\
-H "Authorization: Bearer sk-live-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \\
-H "Content-Type: application/json" \\
-d '{
"room": "class-2026-001",
"identity": "viewer-789",
"name": "张同学",
"role": "subscriber",
"ttl_seconds": 7200
}'请求字段
| 字段 | 类型 | 说明 |
|---|---|---|
room | string | 房间名 (业务方自定义, [a-zA-Z0-9_-] 1-64 字符) |
identity | string | 业务方的用户 ID, 房间内唯一 |
name | string | 显示名 (弹幕 / 主播名展示用) |
role | string | publisher (主播) / subscriber (观众, 默认) |
metadata | string | 透传给前端的业务字段 JSON (会出现在所有参会人侧) |
ttl_seconds | int | 有效期, 5 分钟 ~ 7 天, 默认 2 小时 |
require_entry | bool | true: 不直接发 Token, 要求观众填手机号过短信验证才能进 (见进场短信验证) |
响应 (默认)
{
"code": 0,
"msg": "ok",
"data": {
"token": "eyJhbGciOiJI...",
"expires_at": 1781600863,
"websocket_url": "wss://zhibo.yunshee.com"
}
}响应 (require_entry=true)
返回的是入场凭证, 浏览器拿它走短信验证, 验证通过后换真直播 Token:
{
"code": 0,
"msg": "ok",
"data": {
"entry_token": "eyJhbGciOiJI...",
"require_entry": true,
"room": "app_xxxxxxxx_class-2026-001",
"expires_at": 1781594263,
"websocket_url": "wss://zhibo.yunshee.com"
}
}iframe 嵌入
把上一步拿到的 Token 通过 URL 参数传给 iframe:
主播开播台
<iframe src="https://live.yunshee.com/host.html?token=PUBLISHER_TOKEN&title=高考志愿填报专场" allow="camera; microphone; autoplay" style="width:100%;height:100vh;border:0"> </iframe>
观众观看页
<iframe src="https://live.yunshee.com/watch.html?token=SUBSCRIBER_TOKEN&nickname=张同学&anchor_name=王老师" allow="autoplay" style="width:100%;height:100vh;border:0"> </iframe>
会议室
<iframe src="https://live.yunshee.com/room?token=YOUR_TOKEN" allow="camera; microphone; display-capture; autoplay" style="width:100%;height:600px;border:0"> </iframe>
URL 参数
| 参数 | 页面 | 说明 |
|---|---|---|
token | 全部 | 必填, 上一步签发的直播 Token |
title | host | 直播标题 (显示在主播开播台顶部) |
auto_start | host | =1 自动开播 |
nickname | watch | 观众弹幕显示名 |
anchor_name | watch | 主播显示名 |
products_url | host / watch | 业务方商品列表 API (见商品 / 报名扩展) |
theme | room | dark / light |
view | room | conference / viewer |
房间管理
通常直接签 Token 就够用 (访问房间时自动创建), 需要预创建 / 主动关闭时用以下接口:
# 创建房间 (可选, 直接签 Token 也会自动创建)
curl -X POST https://open.zcode.team/api/v1/live/rooms \\
-H "Authorization: Bearer sk-live-xxx" \\
-H "Content-Type: application/json" \\
-d '{"name":"class-2026-001","max_participants":50}'
# 查询房间
curl "https://open.zcode.team/api/v1/live/rooms/class-2026-001" \\
-H "Authorization: Bearer sk-live-xxx"
# 关闭房间 (踢出所有人)
curl -X DELETE "https://open.zcode.team/api/v1/live/rooms/class-2026-001" \\
-H "Authorization: Bearer sk-live-xxx"进场短信验证
当业务方需要在观众进直播间前收集实名手机号时, 签 Token 时传 require_entry: true, 拿到的就是入场凭证 (而不是直播 Token):
- 浏览器把入场凭证传给
watch.html - 观众看到进场表单 (昵称 + 手机号 + 验证码)
- 开放平台自动发送短信验证码 (业务方无需对接短信通道)
- 验证通过后, 浏览器自动换得真直播 Token 并连接
- 同时下发
pass_token写入 localStorage, 7 天内同设备同手机号免重复验证
整个流程对业务方透明 — 只需在签 Token 时多传一个标志, 不需要写一行 SMS 代码。
商品 / 报名扩展
当业务方传入 products_url 参数后, 直播间会自动开启商品扩展:
- 主播端顶部出现 🛒 推商品 按钮, 可向所有观众弹商品促销卡
- 观众端右侧出现 商品 入口, 可打开商品列表 / 咨询 / 报名
- 观众的操作通过
postMessage发回父页面, 业务方自行处理 (写销售线索 / 跳转报名页 等)
products_url 接口规范
业务方需自己提供一个返回如下格式的 GET 接口:
{
"items": [
{ "id": 1, "name": "VIP 月卡", "price_range": "¥99", "desc": "30 天无限观看", "thumb": "https://..." },
{ "id": 2, "name": "VIP 年卡", "price_range": "¥888" }
]
}postMessage 协议 (iframe → 父页面)
| type | 触发 | payload |
|---|---|---|
signup | 观众点商品促销卡的"立即报名" | { product, nickname, phone, identity } |
product_click | 观众点商品列表的"咨询" | { productId, productName, identity, nickname } |
leave | 观众离开 | { identity } |
父页面监听示例
window.addEventListener('message', e => {
if (e.data?.source !== 'live-room/watch') return;
switch (e.data.type) {
case 'signup':
// 观众点商品促销卡的"立即报名" — 把信息落到自家销售线索表
fetch('/api/your-system/leads', { method: 'POST', body: JSON.stringify(e.data) });
break;
case 'product_click':
// 观众点商品列表的"咨询" — 用作埋点
break;
case 'leave':
// 观众离开直播间
break;
}
});错误码
| code | 含义 |
|---|---|
1401 | sk-live key 无效或已禁用 |
1403 | 应用未订阅直播能力, 请在控制台先开通 |
1400 | 参数错误 (room 格式 / identity 缺失 / ttl 超出范围) |
1404 | 房间不存在 |
1429 | 触发限流 (短信发送频次过高) |