功能描述
同一用户可以同时加入多个频道,且频道数量无限制。用户加入频道后,只能在一个频道中发布音、视频流,但可以在所有频道中拉流,并且可以正常接收每个频道的信令和回调。该功能目前可用于跨房间连麦、在线教育的超级小班场景。
多房间的优点为用户可以不离开当前频道的基础上,加入另外的频道,接收另外频道的信令及回调,并播放音视频流。 该功能可以隔离多个频道的信令及回调,实现更灵活的连麦业务。
实现方法
Native SDK 通过一个 IChannel
类和 IChannelEventHandler
类实现多频道控制。你可以从如下任一种方法实现该功能:
方法一:仅使用 IChannel 类实现
参考如下步骤在项目中实现多频道功能:
- 将
IRtcEngine
类强转为IRtcEngine2
类。 - 调用
IRtcEngine2
类的createChannel
方法,通过channelId
创建一个IChannel
对象。 - 调用
IChannel
对象中的joinChannel
方法加入频道。 - 调用
IChannel
类的setChannelEventHandler
方法,接收该频道的回调通知。 - 重复步骤 2、3,创建多个
IChannel
对象,然后分别调用这些IChannel
对象中的joinChannel
方法,同时加入多个频道。
加入多个频道时,请确保每个频道的频道名不同。
在 IChannel
类的频道中发布本地流:调用 IChannel
类的 setClientRole
方法将用户角色设置为主播,然后调用 publish
方法在该频道内发布流。这种方式适用于需要切换发流的频道的场景。
加入多个频道后,你可以调用各 IChannel
对象中的 publish
方法在对应的频道中发布音视频流。但需要注意,一次只能在一个 IChannel
对象的频道里发布。
调用频道一内的 publish
方法发布流后,必须先调用频道一的 unpublish
方法结束发布,才能调用频道二的 publish
方法。
该方法适用于需求频繁切换发布音、视频流频道的场景。
API 调用时序
参考如下步骤,在你的项目中使用 IChannel
类实现多频道功能。
示例代码
你还可以参考如下示例代码。
bool JoinChannelWithIChannel(const char *channelId, const char *token, const char *info, uid_t uid)
{
if (NULL == channelId) return false;
// 1. Create arRtcEngine
ar::rtc::IRtcEngine *engine = createARRtcEngine();
// 2. Create IChannel
ar::rtc::IChannel *channel = static_cast<ar::rtc::IRtcEngine2 *>(engine)->createChannel(channelId);
if (NULL == channel) return false;
// 3. Set channelEventHandler
// Replace with your own IChannelEventHandler implementation
ar::rtc::IChannelEventHandler *channelEH = new ar::rtc::IChannelEventHandler();
channel->setChannelEventHandler(channelEH);
// 4. Configurate mediaOptions
ar::rtc::ChannelMediaOptions options;
options.autoSubscribeAudio = true;
options.autoSubscribeVideo = true;
// 5. Join channel
int ret = channel->joinChannel(token, info, uid, options);
return (ret == 0);
}
方法二:混用 IChannel 和 IRtcEngine 类
参考如下步骤在项目中实现多频道功能:
- 调用
IRtcEngine
类下的joinChannel
方法加入第一个频道。 - 将
IRtcEngine
类强转为IRtcEngine2
类。 - 调用
IRtcEngine2
类的createChannel
方法,通过channelId
创建一个IChannel
对象。 - 调用
IChannel
对象中的joinChannel
方法加入第二个频道。 - 调用
IChannel
类的setChannelEventHandler
方法,接收该频道的回调通知。 - 重复步骤 2、3,创建多个
IChannel
对象,然后分别调用这些IChannel
对象中的joinChannel
方法,加入更多频道。
该方法适用于只需要将音、视频流固定发布到 RtcEngine 频道的场景。对于已经使用 anyRTC SDK 实现实时音视频功能的开发者,该方法不涉及原有代码逻辑变动。
API 调用时序
参考如下步骤,在你的项目中使用 IRtcEngine
和 IChannel
类实现多频道功能。
API 参考
开发注意事项
精细订阅限制
在调用 RtcChannel
对象中的 joinChannel
方法加入频道时将 autoSubscribeAudio
或 autoSubscribeVideo
设为 false
,选择不自动订阅音频流或视频流,那么加入频道后,你不能再调用 muteRemoteAudioStream
(false) 或 muteRemoteVideoStream
(false) 接收指定用户的音频流或视频流。如想实现上述操作,我们建议在加入频道前调用 setDefaultMuteAllRemoteAudioStreams
(true) 或 setDefaultMuteAllRemoteVideoStreams
(true) 设置默认不接收所有音频流或所有视频流。
设置远端视图
通过 ArRtcChannel
加入频道的,在设置远端视图时,需要在 VideoCanvas 中指定该远端用户所在频道的 channel ID,否则会无法渲染出远端视频画面。
多频道发流限制
SDK 支持进入多个频道,只能在一个频道中发布音、视频流。
由于通过 IRtcEngine
类和 IChannel
类下的 joinChannel
方法加入频道后,SDK 的默认行为有以下差异:
IRtcEngine
类下,SDK 默认发布本地音视频流到本频道IChannel
类下,SDK 默认不发布本地音视频流到本频道
因此,以下操作会导致 SDK 返回 ERR_REFUSED(5)
错误码:
- 通过
IChannel
类加入多频道:- 调用频道一的
publish
方法后,未调用频道一的unpublish
方法结束发布,就调用频道二的publish
方法;
- 调用频道一的
- 通过混用
IRtcEngine
类和IChannel
类加入多频道:- 通信场景下,通过
IRtcEngine
类加入频道一,然后通过IChannel
类加入频道二后,试图调用IChannel
类的publish
方法; - 直播场景下,通过
IRtcEngine
类加入频道一,然后通过IChannel
类加入频道二后,试图调用IChannel
类的publish
方法; - 直播场景下,加入多个频道后,试图以观众身份调用
IChannel
类的publish
方法; - 调用
IChannel
类的publish
方法后,未调用对应IChannel
类的unpublish
方法,就试图通过IRtcEngine
类的joinChannel
方法加入频道。
- 通信场景下,通过