小程序(微信) 快速开始与功能指南
小程序(微信):前置条件、安装、Token、加入频道、发布订阅、事件、错误处理与排障;接口名与签名在构建时取自公开 SDK 接口定义。
小程序端(微信)提供 TypeScript SDK,公开接口与声网小程序 API 对齐:4 个接口、32 个方法、45 个重载、14 个事件、4 个枚举与 43 条错误码。媒体采集与推拉流由小程序原生组件通过注入的端口提供,SDK 不内置媒体栈。
前置条件
- 微信开发者工具 + 小程序基础库(
live-pusher/live-player组件可用)。SDK 自身只是 TypeScript,无原生依赖。 - 一个 App ID 与 Token 服务(见 控制台开通服务与获取凭证)。
- 平台能力由注入提供:
MiniProgramSessionService(频道/Token)、MiniProgramMediaPort(推拉流组件桥)、
可选的 MiniProgramEventSource(组件/长连接事件)与日志上传端点。SDK 不内置媒体栈,也不假装能采集。
安装
将 SDK 的构建产物作为本地依赖引入小程序工程(miniprogram_npm 或直接拷贝到 utils/)。当前以源码方式提供。
获取 Token
Token 由你的后端 POST /v1/tokens 签发,客户端只拿 { appId, rtcToken, rtcUid }。 小程序端的 Client.join(channelKey, channel, uid, isAudioOnly, …) 的第一个参数就是 Token 字符串, 与其它端一致:接口定义层语义见 AccessToken2 语义。
加入频道
import { Client } from '@nimeet/rtc-miniprogram';
// 平台桥由宿主注入:微信组件、你的后端、以及一个可选的日志上传端点。
const client = new Client({ runtime: { session, media, events } });
await client.init(appId);
await client.join(token, 'channel-a', 1234, /* isAudioOnly */ false);
const pushUrl = await client.publish(); // live-pusher 推流地址
await client.setRole('audience'); // 切观众会作废推流地址(文档语义)
await client.leave();init(appId, onSuccess?, onFailure?):App ID 为空 → 抛-101(无效 App ID)。join(...):未init→-7;频道名为空 →-102;uid 非法 →-121;重复加入 →-17。- 通道/Token 请求全部走注入的
session,SDK 不直连任何网络。
发布与订阅
await client.publish(); // Promise<string>:推流地址,同时把角色设为主播
await client.subscribe(5678, { video: true }); // Promise<{ url, rotation }>:拉流地址与旋转角
await client.unsubscribe(5678);
await client.muteLocal('all'); // 'audio' | 'video' | 'all'
await client.mute(5678, 'audio');setRemoteVideoStreamType(uid, 0 | 1) 选择大小流;setAudioCodec(AudioCodec.PCMU | PCMA | G722) 设置 IoT 编码。 未加入频道调用以上方法统一返回 -3(SDK 尚未就绪)。
事件
on(event, callback?) / off(event):14 个事件与兼容版本逐名一致,未知事件名抛 -2。
| 事件 | 触发来源 | 载荷 |
|---|---|---|
stream-added / stream-removed | 组件/长连接事件源 | { uid } |
update-url | 同上 | { uid, url } |
video-rotation | 同上 | { uid, rotation } |
mute-audio / mute-video / unmute-audio / unmute-video | 同上 | { uid } |
client-banned | 服务端踢人 | 事件载荷;同时把客户端状态退回 initialized(并作废推流地址) |
token-privilege-will-expire / token-privilege-did-expire | Token 状态 | 无载荷(按文档调用 renewToken) |
channel-media-relay-event / channel-media-relay-state | 跨频道转发(本端显式不支持,见下) | { code } / { code, state } |
error | 任何异步失败 | { code, reason } |
on 返回的监听器集合由 off(event) 整体清空;单个监听器抛错不会影响其它监听器。
错误处理
错误对象是 MiniProgramError,code 是负数(与声网文档一致,正数错误码取负):
| code | 含义 | 触发点 |
|---|---|---|
-1 | 一般错误 | 平台/后端失败(onFailure 同时收到) |
-2 | 参数无效 | 目标不是 audio/video/all、未知事件名、码率/位置等 |
-3 | 尚未就绪 | 未加入频道就 publish/subscribe/mute |
-4 | 当前状态/构建不支持 | 三个跨频道转发方法、Log.uploadLogs(当前版本不支持) |
-5 | 请求被拒绝 | 文档语义下的拒绝 |
-7 | 未初始化 | 未 init 就 join 等 |
-8 | 状态无效 | destroy() 之后调用任何方法 |
-17 / -18 | 加入被拒 / 离开被拒 | 重复 join / 未 join 时 leave |
-101 / -102 / -121 | App ID / 频道名 / uid 非法 | 参数校验 |
-109 / -110 / -123 | Token 过期 / Token 无效 / 被服务端封禁 | 平台返回 |
显式不支持(已在 公开 SDK 接口定义 的 不支持列表 登记,错误码 -4): Client.startChannelMediaRelay、Client.updateChannelMediaRelay、Client.stopChannelMediaRelay(需要 SD-RTN 转发服务,需工单开通)、 Log.uploadLogs(本端没有日志上传端点)。四个方法名都是真实成员,调用会抛 -4,不会静默成功。
排障
| 现象 | 原因 | 处理 |
|---|---|---|
-7 | 没有先 init | 先 await client.init(appId) |
publish() 返回的地址打不开 | 宿主没有注入可用的 live-pusher 桥 | 检查 MiniProgramMediaPort.publish 实现 |
-4 出现在跨频道转发 | 该能力需要 SD-RTN 转发服务 | 需要转发时联系服务端开通;客户端保持显式拒绝 |
| 事件没有回调 | 没有注入 MiniProgramEventSource,或事件名不在 14 个文档事件内 | 注入事件源;未知事件名会抛 -2 |
| 枚举没有显式数值 | StreamType / UidType 只列键 | 实现按声明顺序赋值,业务代码不要依赖具体数值 |
| 类型为何只比名字 | 对齐基准把回调写成 function、选项写成 object | 见本页顶部说明;compare.types = name-only |
下一步
平台信息
| 项 | 值 |
|---|---|
| 平台 | 小程序(微信) |
| 语言 | TypeScript |
| SDK 包 | @nimeet/rtc-miniprogram |
| 接口版本 | 2.6.5 |
| 兼容参考 | 声网 mini-program 端 API |
本端公开接口与声网 mini-program 端 API 对齐;安装与运行要求见上面前置条件。
可用性
该端 SDK:正式可用。本页代码片段使用公开 API;运行时的能力边界以实际发布的 SDK 包为准。
加入频道链路
下列方法名、参数类型与返回值与同端 API 参考一致。一个平台若有多个重载,这里展示最常用的那一个;完整重载见同端 API 参考页。
| 步骤 | 接口 | 方法 | 重载数 |
|---|---|---|---|
| 加入频道 | Client | join | 1 |
| 离开频道 | Client | leave | 1 |
| 发布本地轨道 | Client | publish | 1 |
| 续期 Token | Client | renewToken | 1 |
| 订阅远端媒体 | Client | subscribe | 1 |
join(channelKey: string, channel: string, uid: number|string, isAudioOnly: boolean, UidType?: UidType, onSuccess?: function, onFailure?: function): Promise<void>
leave(onSuccess?: function, onFailure?: function): Promise<void>
publish(onSuccess?: function, onFailure?: function): Promise<string>
renewToken(token: string, onSuccess?: function, onFailure?: function): Promise<void>
subscribe(uid: number, options?: object, onSuccess?: function, onFailure?: function): Promise<object>事件与回调
| 接口 | 事件名 | 监听器参数 |
|---|---|---|
Client | channel-media-relay-event | Function |
Client | channel-media-relay-state | Function |
Client | client-banned | Function |
Client | error | Function |
Client | mute-audio | Function |
Client | mute-video | Function |
Client | stream-added | Function |
Client | stream-removed | Function |
Client | token-privilege-did-expire | Function |
Client | token-privilege-will-expire | Function |
Client | unmute-audio | Function |
Client | unmute-video | Function |
Client | update-url | Function |
Client | video-rotation | Function |
错误码
该端 SDK 未提供错误码常量。平台侧错误见 错误码全表,跨端 SDK 错误标识见 各端 SDK 错误标识。