AKStream.Next · 文档中心

第三方 API:RTC 接入

第三方 API:RTC 接入

RTC 有两种凭据,不能混用:业务后端用 ak_pat_ 管房间和签发一次性入会票据;参会设备用 RTC Token 加入、发布、订阅和播放。浏览器不需要 AKStream.Next 账号密码。

sequenceDiagram
    participant Backend as 第三方业务后端
    participant API as AKStream.Next
    participant Client as RTC 浏览器或 App
    participant Media as MediaServer
    Backend->>API: API Token 创建房间
    Backend->>API: 为业务 subject 签发一次性 access ticket
    API-->>Backend: accessTicket
    Backend-->>Client: 只发送 accessTicket
    Client->>API: v2 票据入会接口 消费一次性票据
    API-->>Client: RTC Token + 设备会话 + 能力
    Client->>API: X-AK-RTC-Token + WHIP/WHEP
    API->>Media: 代理 SDP 和媒体会话

后端签发一次性入会票据

业务后端先创建或选择房间,然后按自己的用户 ID 签发票据:

POST /api/v2/rtc/rooms/{roomId}/access-tickets
Authorization: Bearer ak_pat_<TOKEN>
Content-Type: application/json

{
  "subjectIssuer": "dispatch-system",
  "subjectId": "user-1001",
  "displayName": "调度员一号",
  "role": "speaker",
  "capabilities": ["camera.publish", "microphone.publish", "publications.subscribe", "chat.send"],
  "expiresInMinutes": 10,
  "bypassWaitingRoom": false
}

subjectIssuer + subjectId 是第三方业务主体的稳定身份。完整 accessTicket 只返回一次、只能消费一次,并且不能调用平台管理 API。不要把 API Token 发送给参会端。

参会端加入并续签

客户端使用一次性票据加入:

POST /api/v2/rtc/session/rooms/{roomId}/join
Content-Type: application/json

{
  "accessTicket": "<一次性票据>",
  "displayName": "调度员一号",
  "platform": "pc-web",
  "clientVersion": "2.4.0",
  "micEnabled": true,
  "cameraEnabled": true
}

响应返回 participantToken、expiresAt、成员、设备会话、最终能力和等候室状态。后续请求使用:

X-AK-RTC-Token: <participantToken>

在过期前调用 POST /api/v2/rtc/session/rooms/{roomId}/token/refresh。续签会轮换 tokenVersion,旧 RTC Token 立即失效。设备定期发送 heartbeat;离会调用 /leave,不能只关闭浏览器标签页。

发布、订阅和活动播放

RTC 是 SFU:每个 Publication 独立发布,每个 Subscription 独立订阅,不是服务端自动混成一个画面。

任务 接口 关键点
创建发布 POST /api/v2/rtc/session/rooms/{roomId}/publications 服务端按角色和房间策略过滤媒体能力
WHIP 发布 POST /api/v2/rtc/session/rooms/{roomId}/publications/{publicationId}/whip 请求/响应是 SDP,不是 JSON
查询发布 GET /api/v2/rtc/session/rooms/{roomId}/publications 只订阅 Active 且允许的发布
创建订阅 POST /api/v2/rtc/session/rooms/{roomId}/subscriptions 绑定当前观看设备和目标 Publication
WHEP 播放 POST /api/v2/rtc/session/rooms/{roomId}/subscriptions/{subscriptionId}/whep 保存返回的媒体会话和释放地址
HTTP-FLV 播放 POST /api/v2/rtc/session/rooms/{roomId}/playback-ticket 返回绑定房间、设备和活动 Publication 的短时地址

RTC Token 只能用于绑定房间和设备。活动播放票据只能看同一房间的活动 Publication,不能替代 RTC Token、发布票据或平台 API Token。

会议录制和归档

1.0.0.157 以逐发布的旧录像控制为主;1.0.0.158 已新增整场持续录制。旧接口仍可用,但它的 recording/targets、recording/start、recording/stop 不能代替持续任务的 recordingId。

会议结束后查询:

GET /api/v2/rtc/session/rooms/{roomId}/playback/manifest
X-AK-RTC-Token: <participantToken>

1.0.0.158 按 roomId + recordingId 管理持续录制档案。业务后端先用 POST /api/v2/rtc/rooms/{roomId}/recordings/access 按 view/play/download 签短时票据,再用 GET /api/v2/rtc/recordings?roomId=... 找任务、读取该任务的 manifest 与受控媒体资源。任务可包含成员/屏幕兼容副本、聊天、白板、发言与主持事件;还可按需生成整场 MP4。会中入会 Token 不等于会后档案票据,旧任务缺失的媒体或事件不能补造。精确入参、出参和错误见RTC 档案 API,客户端接入见RTC SDK 录制与回放。

失败处理

现象 先检查什么
join 返回票据无效 access ticket 是否过期、已消费、被撤销或 roomId 不匹配
返回 Waiting 等候室是否启用,主持人是否已准入
RTC Token 401 令牌是否过期、设备会话是否撤销、tokenVersion 是否已轮换
WHIP/WHEP 成功但无媒体 ICE candidate、TURN、UDP/TCP、防火墙、浏览器权限和 codec
HTTP-FLV 被拒绝 是否使用当前 RTC Token 重新签发 playback-ticket,Publication 是否仍 Active
录制列表为空 房间是否允许录制、Publication 是否可录、是否等待分片封口和索引

RTC 生产验收必须使用真实 Chrome/Edge/Safari/Firefox、摄像头和麦克风,验证弱网、断线重连、TURN、屏幕共享和长时间运行。自动 SDP 测试不能代替真人音视频验收。