Cocos Creator 快速开始与功能指南
Cocos Creator:前置条件、安装、Token、加入频道、发布订阅、事件、错误处理与排障;接口名与签名在构建时取自公开 SDK 接口定义。
Cocos Creator 端提供与声网 Cocos Creator 公开 API 对齐的 TypeScript 接口,覆盖频道加入、发布订阅、事件与错误处理。媒体与渲染能力通过注入的桥接入你的原生工程,SDK 本身不内置媒体栈。
前置条件
- Cocos Creator 3.8+(TypeScript)。
- 一个平台桥:
CocosBridgePort.invoke(method, params)。Web 构建目标用浏览器 RTC 桥;原生构建目标用
Cocos2d-x 绑定(同一个 ni-meet C++ 核心)。
- App ID 与 Token 服务(见 控制台开通服务与获取凭证)。
安装
pnpm --filter @nimeet/rtc-cocos build # 源码 sdk/cocos,产物 sdk/cocos/buildCocos Creator 3.x 支持 npm 依赖,把构建产物目录作为本地包引入;当前以源码方式提供。
获取 Token
Token 由你的后端 POST /v1/tokens 签发,客户端只拿 { appId, rtcToken, rtcUid }, 语义见 AccessToken2 语义。initialize 接收 App ID,joinChannel 接收 Token。
加入频道
import { AgoraRtc } from '@nimeet/rtc-cocos';
const client = AgoraRtc.createAgoraRtcClient({ bridge }); // bridge = 你的 CocosBridgePort
await client.initialize(appId);
await client.joinChannel(token, 'channel-a', 1234);
await client.setClientRole('broadcaster');initialize(string | AgoraRtcEngineConfig):App ID 为空 →protocol_error。- 需要引擎的成员在
initialize之前调用 →bridge_unavailable(提示call initialize() first),不会打到桥。 joinChannel(token, channelId, uid, options?):频道名为空或 uid 非整数 →protocol_error。
发布与订阅
绑定层与声网 Cocos 封装一致:不管理 track 对象,用工程开关表达发布/订阅意图。
- 音频:
enableAudio/enableLocalAudio/muteLocalAudioStream/muteRemoteAudioStream/muteAllRemoteAudioStreams/setAudioProfile; - 视频:
enableVideo/enableLocalVideo/muteLocal*/muteRemote*/startPreview/stopPreview/switchCamera; - 渲染:
setupLocalVideoView(canvas)/setupRemoteVideoView(uid, canvas)/update*/remove*,以及setRenderBackend('engine-texture'); - 混音与音效:
startAudioMixing/pauseAudioMixing/resumeAudioMixing/stopAudioMixing/getAudioMixingCurrentPosition/setAudioMixingPosition/adjustAudioMixing*,
preloadEffect / playEffect / pauseEffect / resumeEffect / stopEffect / setEffectsVolume。
每个成员都带"文档化的方法名"转发给桥;桥侧实现见 sdk/cocos2dx(原生)或浏览器 RTC 桥(Web)。
事件
on(event, listener) 返回取消订阅函数,off(event, listener) 精确移除。事件集合是兼容版本里的 23 个 AgoraEventMap 键:
uploadLogResult、joinChannelSuccess、leaveChannel、rejoinChannelSuccess、connectionInterrupted、 connectionStateChanged、localVideoTextureReady、remoteVideoTextureReady、localVideoTextureReleased、 remoteVideoTextureReleased、renderBackendState、userJoined、userOffline、remoteVideoStateChanged、 localVideoStateChanged、firstLocalAudioFramePublished、audioMixingFinished、audioMixingStateChanged、 remoteAudioStateChanged、volumeIndication、rtcStats、contentInspectResult、error。
错误处理
错误对象 AgoraSdkError,code 是文档化的字符串码,原生数字码(若有)在 nativeCode:
| code | 含义 | 触发点 |
|---|---|---|
bridge_unavailable | 没有桥 / 未 initialize / 已 destroy | 生命周期守卫 |
protocol_error | 参数或状态不符合文档 | 角色、频道场景、画布尺寸、编码尺寸、渲染后端、空 Token、空路径 |
native_failure | 桥侧调用失败 | 原生返回失败;nativeCode 保留文档错误码 |
timeout | 请求超时(默认 5000ms) | 桥未在超时内返回 |
本端所有公开成员都已实现;调用失败会返回上表中的错误码,不会返回假成功。
排障
| 现象 | 原因 | 处理 |
|---|---|---|
全部调用 bridge_unavailable | 构造时没传 bridge | createAgoraRtcClient({ bridge }) |
protocol_error:call initialize() first | 顺序错了 | 先 initialize,再 joinChannel / 媒体开关 |
只改了 setVideoEncoderConfiguration 但无画面 | 没有设置画布与预览 | startPreview → setupLocalVideoView → setupRemoteVideoView |
| 事件收不到 | 桥没有实现 onEvent | 桥实现 onEvent(listener) 并把原生事件转进来 |
已知限制
- 兼容目标:Cocos Creator 端与声网 Cocos Creator 的公开 API 对齐;声网未提供该端官方 API 文档,接口以公开声明为准。
- 事件:事件按名称对齐,载荷类型以本页事件表为准。
- 行为由桥决定:生命周期、参数校验、事件分发、超时与错误映射由 SDK 处理;媒体、渲染与混音转发给注入的桥,实际表现取决于宿主工程的原生实现。
- 部分导出仅供桥内部使用:纹理槽缓存、纹理视图管理等不属于公开 API。
下一步
平台信息
| 项 | 值 |
|---|---|
| 平台 | Cocos Creator |
| 语言 | TypeScript |
| SDK 包 | nimeet-rtc-cocos |
| 接口版本 | 4.5.3 |
| 兼容参考 | 声网 cocos 端 API |
本端公开接口与声网 cocos 端 API 对齐;安装与运行要求见上面前置条件。
可用性
该端 SDK:正式可用。本页代码片段使用公开 API;运行时的能力边界以实际发布的 SDK 包为准。
加入频道链路
下列方法名、参数类型与返回值与同端 API 参考一致。一个平台若有多个重载,这里展示最常用的那一个;完整重载见同端 API 参考页。
| 步骤 | 接口 | 方法 | 重载数 |
|---|---|---|---|
| 开启视频与本地预览 | AgoraRtcClient | enableVideo | 1 |
| 创建实例 / 初始化 | AgoraRtcClient | initialize | 1 |
| 加入频道 | AgoraRtcClient | joinChannel | 1 |
| 离开频道 | AgoraRtcClient | leaveChannel | 1 |
| 订阅远端媒体 | AgoraRtcClient | muteRemoteAudioStream | 1 |
| 续期 Token | AgoraRtcClient | renewToken | 1 |
| 频道场景 | AgoraRtcClient | setChannelProfile | 1 |
| 切换角色 | AgoraRtcClient | setClientRole | 1 |
enableVideo(enabled: boolean): Promise<void>
initialize(config: string|AgoraRtcEngineConfig): Promise<void>
joinChannel(token: string, channelId: string, uid: number, options?: AgoraChannelMediaOptions): Promise<void>
leaveChannel(options?: AgoraLeaveChannelOptions): Promise<void>
muteRemoteAudioStream(uid: number, muted: boolean): Promise<void>
renewToken(token: string): Promise<void>
setChannelProfile(profile: 'communication'|'liveBroadcasting'): Promise<void>
setClientRole(role: 'broadcaster'|'audience', options?: AgoraClientRoleOptions): Promise<void>事件与回调
| 接口 | 事件名 | 监听器参数 |
|---|---|---|
AgoraRtcClient | uploadLogResult | {requestId:string;success:boolean;reason:number;} |
AgoraRtcClient | joinChannelSuccess | {channelId:string;uid:number;elapsed:number;} |
AgoraRtcClient | leaveChannel | AgoraRtcStatsPayload |
AgoraRtcClient | rejoinChannelSuccess | {channelId:string;uid:number;elapsed:number;} |
AgoraRtcClient | connectionInterrupted | Record<string,never> |
AgoraRtcClient | connectionStateChanged | {state:number;reason:number;} |
AgoraRtcClient | localVideoTextureReady | {slotId:number;width:number;height:number;} |
AgoraRtcClient | remoteVideoTextureReady | {uid:number;slotId:number;width:number;height:number;} |
AgoraRtcClient | localVideoTextureReleased | {slotId:number;} |
AgoraRtcClient | remoteVideoTextureReleased | {uid:number;slotId:number;} |
AgoraRtcClient | renderBackendState | {backend:string;phase:string;result:number;uid:number;fallbackBackend?:string;platform?:string;} |
AgoraRtcClient | userJoined | {uid:number;elapsed:number;} |
AgoraRtcClient | userOffline | {uid:number;reason?:number;} |
AgoraRtcClient | remoteVideoStateChanged | {uid:number;state:number;reason:number;elapsed:number;} |
AgoraRtcClient | localVideoStateChanged | {sourceType:number;state:number;error:number;} |
AgoraRtcClient | firstLocalAudioFramePublished | {elapsed:number;} |
AgoraRtcClient | audioMixingFinished | Record<string,never> |
AgoraRtcClient | audioMixingStateChanged | {state:number;reason:number;} |
AgoraRtcClient | remoteAudioStateChanged | {uid:number;state:number;reason:number;elapsed:number;} |
AgoraRtcClient | volumeIndication | {speakers:Array<{uid:number;volume:number;vad:number;voicePitch:number;}>;totalVolume:number;} |
AgoraRtcClient | rtcStats | AgoraRtcStatsPayload |
AgoraRtcClient | contentInspectResult | {result:number;} |
AgoraRtcClient | error | {code?:number|string;message:string;} |
错误码
| 常量 | 值 |
|---|---|
BridgeUnavailable | null |
NativeFailure | null |
ProtocolError | null |
Timeout | null |
平台 REST 层用 REST 错误码;SDK 层把连接/鉴权失败映射成声网错误号,映射表见 各端 SDK 错误标识。