Cocos2d-x(C++ 绑定) 快速开始与功能指南
Cocos2d-x(C++ 绑定):前置条件、安装、Token、加入频道、发布订阅、事件、错误处理与排障;接口名与签名在构建时取自公开 SDK 接口定义。
Cocos2d-x 端以 C++ 绑定库的形式提供:公开头文件定义与声网 C++ API 对齐的成员名与签名,实现层通过 IRtcEngineCore 接缝转发到 ni-meet C++ 核心,媒体能力由宿主工程注入。
#include <nimeet/cocos2dx/rtc_engine.h> // 公开 C++ 接口
#include <nimeet/cocos2dx/core_seam.h> // 核心适配接缝(宿主实现)前置条件
- Cocos2d-x 3.17+(C++17);Android NDK / Xcode 由宿主工程提供。
- 宿主应用里已集成 ni-meet C++ 核心,并实现
nimeet::cocos2dx::IRtcEngineCore接缝(1:1 转发,不含媒体逻辑)。 - App ID 与 Token 服务(见 控制台开通服务与获取凭证)。
安装
把 SDK 的头文件目录加入头文件搜索路径,并把源文件加入构建列表即可。当前以源码方式提供,不发布独立包。
target_include_directories(your_game PRIVATE path/to/nimeet/cocos2dx/include)
target_sources(your_game PRIVATE path/to/nimeet/cocos2dx/src/rtc_engine_adapter.cpp)获取 Token
与其他端一致:Token 由你的后端 POST /v1/tokens 签发。绑定层的 joinChannel(token, channelId, uid) 直接接收 Token 字符串, 语义见 AccessToken2 语义。
加入频道
#include "nimeet/cocos2dx/rtc_engine.h"
#include "nimeet/cocos2dx/core_seam.h"
class AppHandler : public nimeet::cocos2dx::IRtcEngineEventHandler
{
public:
void onJoinChannelSuccess(const char* channel, nimeet::cocos2dx::uid_t uid, int elapsed) override { /* update UI */ }
void onUserJoined(nimeet::cocos2dx::uid_t uid, int elapsed) override { /* attach remote view */ }
void onError(int err, const char* msg) override { /* err 是文档错误码 */ }
};
nimeet::cocos2dx::RtcEngineAdapter engine(core); // core 实现 nimeet::cocos2dx::IRtcEngineCore
AppHandler handler;
nimeet::cocos2dx::RtcEngineContext context;
context.appId = appId;
context.eventHandler = &handler;
engine.initialize(context);
engine.joinChannel(token, "channel-a", "info", 1234);initialize 之后才能 joinChannel / leaveChannel:否则返回文档错误码 -7(ERR_NOT_INITIALIZED)。 initialize 缺 App ID 返回 -2(ERR_INVALID_ARGUMENT)。
发布与订阅
绑定层只暴露文档化的开关语义,不管理 track:
- 音频:
enableAudio/disableAudio/enableLocalAudio/muteLocalAudioStream/muteRemoteAudioStream/muteAllRemoteAudioStreams; - 视频:
enableVideo/disableVideo/enableLocalVideo/muteLocalVideoStream/muteRemoteVideoStream/muteAllRemoteVideoStreams; - 预览与渲染:
startPreview()/startPreview(VIDEO_SOURCE_TYPE)/stopPreview(…)/switchCamera/
setupLocalVideo(VideoCanvas) / setupRemoteVideo(VideoCanvas)(setupRemoteVideo 的 uid == 0 返回 -2);
- 编码:
setVideoEncoderConfiguration(宽高非正数返回-2)。
事件
回调由 IRtcEngineEventHandler 承载,14 个成员与固定的 C++ 对齐基准逐签名一致:
onJoinChannelSuccess、onRejoinChannelSuccess、onLeaveChannel、onUserJoined、onUserOffline、 onConnectionStateChanged、onError、onAudioVolumeIndication、onLocalAudioStateChanged、onRemoteAudioStateChanged、 onLocalVideoStateChanged、onRemoteVideoStateChanged、onRtcStats、onRequestToken。
initialize 把 eventHandler 交给核心(IRtcEngineCore::SetEventHandler),核心推事件、绑定层不解释事件内容。
错误处理
成员返回文档化的 Agora C++ 错误码(0 成功;负数失败),绑定层从不把失败改写成成功:
| code | 含义 | 触发点 |
|---|---|---|
0 | 成功 | —— |
-1 | 一般错误 | 核心返回 |
-2 | 参数无效 | 缺 App ID、空频道名、空 Token、uid == 0 的远端视图、非正编码尺寸、音量越界 |
-3 | 尚未就绪 | —— |
-4 | 不支持 | 核心接缝返回,绑定层原样透传(本端没有成员级 暂不支持的接口,不支持列表 为空) |
-7 | 未初始化 | initialize 之前调用需要引擎的成员 |
-8 | 状态无效 | 核心返回 |
错误码枚举与错误号见 错误码全表。
排障
| 现象 | 原因 | 处理 |
|---|---|---|
链接报 undefined reference | 只加了头文件、没编译 sdk/cocos2dx/src/rtc_engine_adapter.cpp | 把 src/*.cpp 加入构建 |
所有调用返回 -7 | 没有成功 initialize | 先 initialize(context) 并检查核心接缝返回值 |
| 画面不出现 | 只做了 setVideoEncoderConfiguration,没做 setupLocalVideo / startPreview | 按文档顺序:预览 → 绑定画布 |
下一步
平台信息
| 项 | 值 |
|---|---|
| 平台 | Cocos2d-x(C++ 绑定) |
| 语言 | C++ |
| SDK 包 | nimeet_rtc_cocos2dx |
| 接口版本 | 4.7.0 |
| 兼容参考 | 声网 cocos2dx 端 API |
本端公开接口与声网 cocos2dx 端 API 对齐;安装与运行要求见上面前置条件。
可用性
该端 SDK:正式可用。本页代码片段使用公开 API;运行时的能力边界以实际发布的 SDK 包为准。
加入频道链路
下列方法名、参数类型与返回值与同端 API 参考一致。一个平台若有多个重载,这里展示最常用的那一个;完整重载见同端 API 参考页。
| 步骤 | 接口 | 方法 | 重载数 |
|---|---|---|---|
| 开启视频与本地预览 | NimeetCocos2dxRtcEngine | enableVideo | 1 |
| 创建实例 / 初始化 | NimeetCocos2dxRtcEngine | initialize | 1 |
| 加入频道 | NimeetCocos2dxRtcEngine | joinChannel | 2 |
| 离开频道 | NimeetCocos2dxRtcEngine | leaveChannel | 2 |
| 订阅远端媒体 | NimeetCocos2dxRtcEngine | muteRemoteAudioStream | 1 |
| 续期 Token | NimeetCocos2dxRtcEngine | renewToken | 1 |
| 频道场景 | NimeetCocos2dxRtcEngine | setChannelProfile | 1 |
| 切换角色 | NimeetCocos2dxRtcEngine | setClientRole | 2 |
| 绑定本地画面 | NimeetCocos2dxRtcEngine | setupLocalVideo | 1 |
enableVideo(): int
initialize(context: const RtcEngineContext&): int
joinChannel(token: const char*, channelId: const char*, info: const char*, uid: uid_t): int
leaveChannel(): int
muteRemoteAudioStream(uid: uid_t, mute: bool): int
renewToken(token: const char*): int
setChannelProfile(profile: CHANNEL_PROFILE_TYPE): int
setClientRole(role: CLIENT_ROLE_TYPE): int
setupLocalVideo(canvas: const VideoCanvas&): int事件与回调
回调注册在 IRtcEngineEventHandler 上;不同端的命名可能不同,完整清单见同端 API 参考页。
| 回调 | 签名 | 用途 |
|---|---|---|
onConnectionStateChanged | onConnectionStateChanged(state: CONNECTION_STATE_TYPE, reason: CONNECTION_CHANGED_REASON_TYPE): void | 入会结果 / 连接状态变化:据此更新 UI 并决定是否重连。 |
onUserJoined | onUserJoined(uid: uid_t, elapsed: int): void | 远端用户加入:分配画面容器。 |
onRemoteVideoStateChanged | onRemoteVideoStateChanged(uid: uid_t, state: REMOTE_VIDEO_STATE, reason: REMOTE_VIDEO_STATE_REASON, elapsed: int): void | 远端视频状态:首帧解码后即可渲染。 |
onUserOffline | onUserOffline(uid: uid_t, reason: USER_OFFLINE_REASON_TYPE): void | 远端用户离开:释放容器与订阅。 |
onRequestToken | onRequestToken(): void | Token 即将过期:调用服务端续期后 `renewToken`。 |
onError | onError(err: int, msg: const char*): void | 运行时错误:`err` 为声网错误号,按错误码表分流。 |
错误码
该端 SDK 未提供错误码常量。平台侧错误见 错误码全表,跨端 SDK 错误标识见 各端 SDK 错误标识。