2025/06/27 16:17:14
加入多频道
声网 SDK 支持用户同时加入多个频道,同一时间可以在多个频道中接收和发布音视频流。
技术原理
SDK 提供 RtcConnection 对象 和 IRtcEngineEx 类实现多频道功能。IRtcEngineEx 提供适用于指定 RtcConnection 对象的方法。
RtcConnection 对象包含用于识别连接的如下信息:
- 频道名称
- 本地用户的用户 ID
你可以创建多个 RtcConnection 对象,并为每个对象设置不同的频道名称和用户 ID。
如果要加入多个频道,多次调用 IRtcEngineEx 类中的 joinChannelEx 并设置不同的 RtcConnection 对象。加入多频道时请注意:
- 每个
RtcConnection对象的用户 ID 是唯一的,且不为0。 - 可以为
joinChannelEx中的RtcConnection对象配置发布和订阅选项。 - 每个
RtcConnection可以独立发布多路音频流和一路视频流。 - 不同频道的事件通过你在调用
joinChannelEx方法时,向eventHandler所传入的不同IRtcEngineEventHandler对象来回调。
前提条件
在进行操作之前,请确保你已经在项目中实现了基本的实时音视频功能。详见实现音视频互动。
实现方法
为实现多频道功能,你需要对每个频道进行如下设置:
-
定义连接并使用随机的用户 ID 加入频道。
C++agora::rtc::ChannelMediaOptions options2;
options2.autoSubscribeAudio = false;
options2.autoSubscribeVideo = false;
options2.publishAudioTrack = false;
options2.publishCameraTrack = false;
options2.publishSecondaryCameraTrack = true;
options2.clientRoleType = CLIENT_ROLE_BROADCASTER;
// 定义连接
connection.localUid = generateUid();
connection.channelId = szChannelId.data();
// 加入频道
int ret = m_rtcEngine->joinChannelEx(APP_TOKEN, connection, options2, &m_camera2EventHandler); -
监听
onUserJoined回调并设置远端视频。C++// 监听 onUserJoined 回调
void CAGEngineEventHandler::onUserJoined(uid_t uid, int elapsed) {
LPAGE_USER_JOINED lpData = new AGE_USER_JOINED;
lpData->uid = uid;
lpData->elapsed = elapsed;
if (m_hMainWnd != NULL)
::PostMessage(m_hMainWnd, WM_MSGID(EID_USER_JOINED), (WPARAM)lpData, 0);
}C++VideoCanvas canvas;
canvas.renderMode = RENDER_MODE_FIT;
canvas.uid = 123;
canvas.view = videoWnd.GetSafeHwnd();
connection.localUid =123;
connection.channelId = "channel123";
// 设置远端视频
rtcEngine->setupRemoteVideoEx(canvas, connection);
参考信息
API 参考
示例项目
声网提供了开源的示例项目供你参考,你可以前往下载或查看其中的源代码。