从需求到可运行代码的对接配方
只使用本目录的公开契约、任务指南和客户获得的 WebUI/SDK/Demo;不需要也不应读取服务端源码。每个任务先输出“调用者、凭据、方法与路径、请求模型、结果判断”,然后在第三方项目实现。接口名称和参数不得凭常见产品经验推测。
配方一:后端查询通道,前端播放实时视频
需要 channels.view、streams.view、streams.play;启动普通离线通道另需 channels.manage。完整流程:
- 业务后端
GET /api/v2/third-party/capabilities,核对实际权限。 GET /api/v2/third-party/channels?page=1&pageSize=50,根据自己的业务资源映射选 channelId。- 离线普通通道
POST /api/v2/third-party/channels/{channelId}/start,保存返回命令;查询 streams 和命令实际状态。国标源使用guides/development/third-party-live.md的协议流程。 - 在线后
POST /api/v2/third-party/channels/{channelId}/playback-lease,JSON 为{"protocols":["hls","http-flv","http-fmp4"],"leaseSeconds":120,"absoluteLifetimeSeconds":43200}。 - 业务后端只把获准的
sources[].url给播放器,到 renewAfter 续租;达到 absoluteExpiresAt 则重新授权和申请。撤销单个租约不等于停止整条通道。
查询 openapi.json 中这几个方法的请求与响应结构,读取 guides/development/third-party-start.md、third-party-live.md;协议播放器选择以目标终端真实解码能力为准。成功需实际收到视频,不能仅凭创建租约返回 200。
配方二:查询录像,播放、下载和裁剪
查询用 recordings.view;播放另需 recordings.play,下载另需 recordings.download,裁剪管理用 recordings.manage,删除另需 recordings.delete。
先 GET /api/v2/third-party/recordings,使用 channelId、startTime/endTime、page/pageSize。时间带时区,查询是时间交集;fileId 才是后续稳定引用。列表给出的链接端点是下一步请求地址,并非已签发的媒体 URL。
- 长播放:
POST /api/v2/third-party/recordings/{fileId}/playback-lease,JSON{"leaseSeconds":120,"absoluteLifetimeSeconds":43200};按 renewAfter 续租。 - 下载:
POST /api/v2/third-party/recordings/{fileId}/download-link,JSON{"lifetimeSeconds":120};业务后端检查当前用户有下载权后才转交 URL。 - 裁剪:
POST /api/v2/third-party/cut-merge/tasks,先查 OpenAPI 的 CutMergeRequest;提交后保存 taskId,查询任务至成功,再获取 playback-link/download-link。提交受理不等于已经有成品。 - 删除:按需求选择 soft-delete、restore 或 hard-delete,使用 fileIds 数组并检查 succeeded/failed 每项,硬删除先明确目标。
读取 guides/development/third-party-recording.md 和 api-third-party-contract.md。验收需核对文件实际可读、Range 行为、下载权限隔离、过期链接和失败任务。
配方三:正式业务用户通过 Web SDK 进入会议
业务后端管理权限为 rtc.manage;浏览器不能持有这个平台 Token。先读 guides/sdk/identity.md、web.md、web-api.md。
已有房间时,业务后端调用 POST /api/v2/rtc/rooms/{roomId}/access-tickets:
{"subjectIssuer":"business-app","subjectId":"已验证业务用户的ID","displayName":"张三","role":"viewer","capabilities":["publications.subscribe"],"expiresInMinutes":5,"bypassWaitingRoom":false}
subjectId、角色、能力由业务后端决定;网页不能自报主持身份。返回给指定设备 serverUrl、roomId、accessTicket。新建房间使用 POST /api/v2/rtc/rooms,参数按 CreateRtcRoomRequest,不随意编造媒体节点 ID;同设置失败重试沿用 idempotencyKey。
宿主示例,meeting 由自己的业务后端返回,showState/renderRemote 是应用实现的展示函数:
import { AkRtcWebClient } from '@akstream/rtc-web-sdk'
const client = new AkRtcWebClient(meeting.serverUrl, {
onState: (state, detail) => showState(state, detail),
onRemoteTrack: ({ subscriptionId, track }) => {
const element = renderRemote(subscriptionId, track.kind)
void client.attachRemoteMedia(subscriptionId, element)
}
})
const result = await client.join(meeting.roomId, meeting.accessTicket, { platform: 'pc-web' })
if (result.admissionStatus === 'Waiting') showState('Waiting', '等待主持准入')
// 开麦/开摄像头放在用户点击中,检查最终能力后调用。
// await client.startCameraAndMicrophone({audio:true,video:true})
// 路由退出和页面销毁:await client.leave(),同时移除宿主创建的视图。
完整移除回调和预览示例在 web.md。只看成功后再实现本地采集、共享和主持操作;不在页面另写 WHIP/WHEP、PeerConnection、Token 续签或重连。一次性票据失败后先检查消费状态,不能反复重放。需要主持 payload 时读取 room-actions.md;录制与会后档案读 recording.md 和 archive-api.md。
配方四:Android、iOS 或 UniApp 会议端
先选宿主,再读同平台指南与函数参考:
| 平台 | 必读 | 开始方式 | 关键验收 |
|---|---|---|---|
| Android | guides/sdk/android.md、android-api.md | 同批 AkNativeRtcClient,joinWithAccessTicket;Listener 更新 UI | 系统权限、音频路由、前后台、MediaProjection、第二设备实收 |
| iOS | guides/sdk/ios.md、ios-api.md | 同批 AkNativeRtcClient 和 delegate,joinWithAccessTicket | 可信 HTTPS、系统采集权限、音频会话、ReplayKit 配置 |
| UniApp | guides/sdk/uniapp.md、uniapp-api.md | AkRtcUniClient 与对应 Web/UTS 原生适配 | 自定义基座包含正确桥接;类型检查不替代原生运行 |
不要把 Web 方法签名直接翻成 Java/Swift。SDK 提供媒体、状态和操作,Demo 展示宿主布局。缺配置、缺权限、平台不支持、未实现、未实测分别报告。
配方五:其他完整 WebUI 功能
设备发现接入、PTZ/预置位、语音对讲、录像计划、截图、智能检索、显示墙、系统配置、节点、日志、任务、升级、安全管理和 RTC 观察等,按 api.md 的功能路线检索 api-operations.md,再在 OpenAPI 读取准确请求模型。只用 third-party 便捷接口无法完成全部管理功能。需要自己的业务端界面时可借鉴公开 WebUI 的调用与状态处理,仍执行相同权限和结果判断。
首次配置接口用 X-AK-Setup-Token 和 installation-only 契约,不能误用业务 Token,也不能在普通集成中重置已安装实例。
AI 交付前自查
输出实际用到的接口表、请求模型、所需权限和 SDK 方法名,并逐项说明从哪些参考文件得到。缺少字段或目标版本不支持时明确缺项,不虚构响应。执行记录区分静态检查、编译、测试环境运行和真机验收;日志脱敏,保留可用于排障的 HTTP 状态、结构化错误和 traceId。