功能描述
同一用户可以同时加入多个频道,且频道数量无限制。用户加入频道后,只能在一个频道中发布音、视频流,但可以在所有频道中拉流,并且可以正常接收每个频道的信令和回调。该功能目前可用于跨房间连麦、在线教育的超级小班场景。
多房间的优点为用户可以不离开当前频道的基础上,加入另外的频道,接收另外频道的信令及回调,并播放音视频流。 该功能可以隔离多个频道的信令及回调,实现更灵活的连麦业务。
实现方法
Native SDK 通过一个 ARtcChannel
类和 ARtcChannelDelegate
类实现多频道控制。你可以从如下任一种方法实现该功能:
方法一:仅使用 ARtcChannel 类实现
参考如下步骤在项目中实现多频道功能:
- 调用
ARtcEngineKit
类的createRtcChannel
方法,通过channelId
创建一个ARtcChannel
对象。 - 调用
ARtcChannel
对象中的joinChannelByToken
方法加入频道。 - 重复步骤 2、3,创建多个
ARtcChannel
对象,然后分别调用这些ARtcChannel
对象中的joinChannelByToken
方法,同时加入多个频道。
加入多个频道时,请确保每个频道的频道名不同。
加入多个频道后,你可以调用各 ARtcChannel
对象中的 publish
方法在对应的频道中发布音视频流。但需要注意,一次只能在一个 ARtcChannel
对象的频道里发布。
调用频道一内的 publish
方法发布流后,必须先调用频道一的 unpublish
方法结束发布,才能调用频道二的 publish
方法。
该方法适用于需求频繁切换发布音、视频流频道的场景。
API 调用时序
参考如下步骤,在你的项目中使用 ARtcChannel
类实现多频道功能。
示例代码
你还可以参考如下示例代码。
//Objective-C
- (BOOL)joinChannelWithARtcChannel:(NSString *)channelId token:(NSString *)token uid:(NSString * _Nullable)uid {
if (channelId.length <= 0) return NO;
// 1. Create ARtcEngineKit
ARtcEngineKit *rtcKit = [ARtcEngineKit sharedEngineWithAppId:@"AppId" delegate:self];
// 2. Create ARtcChannel
ARtcChannel *rtcChannel = [rtcKit createRtcChannel:channelId];
if (rtcChannel == nil) return NO;
// 3. Set rtcChannelDelegate
[rtcChannel setRtcChannelDelegate:self];
// 4. Configurate mediaOptions
ARtcChannelMediaOptions *mediaOptions = [ARtcChannelMediaOptions new];
mediaOptions.autoSubscribeAudio = YES;
mediaOptions.autoSubscribeVideo = YES;
// 5. Join channel
[rtcChannel joinChannelByToken:token uid:uid options:mediaOptions];
return YES;
}
方法二:混用 ARtcChannel 和 ARtcEngineKit 类
参考如下步骤在项目中实现多频道功能:
- 调用
ARtcEngineKit
类下的joinChannelByToken
方法加入第一个频道。 - 调用
ARtcEngineKit
类的createRtcChannel
方法,通过channelId
创建一个ARtcChannel
对象。 - 调用
ARtcChannel
对象中的joinChannelByToken
方法加入第二个频道。 - 重复步骤 2、3,创建多个
ARtcChannel
对象,然后分别调用这些ARtcChannel
对象中的joinChannelByToken
方法,加入更多频道。
该方法适用于只需要将音、视频流固定发布到 ARtcEngine
频道的场景。对于已经使用 anyRTC SDK 实现实时音视频功能的开发者,该方法不涉及原有代码逻辑变动。
API 调用时序
参考如下步骤,在你的项目中使用 ARtcEngineKit
和 ARtcChannel
类实现多频道功能。
API 参考
开发注意事项
精细订阅限制
如果你在调用 ARtcChannel
对象中的 joinChannelByToken
方法加入频道时将 autoSubscribeAudio
或 autoSubscribeVideo
设为 false
,选择不自动订阅音频流或视频流,那么加入频道后,你不能再调用 muteRemoteAudioStream(false)
或 muteRemoteVideoStream(false)
接收指定用户的音频流或视频流。如想实现上述操作,我们建议在加入频道前调用 setDefaultMuteAllRemoteAudioStreams(true)
或 setDefaultMuteAllRemoteVideoStreams(true)
设置默认不接收所有音频流或所有视频流。
设置远端视图
在视频场景中,如果远端用户是通过 ARtcChannel 加入频道的,那么在设置远端视图时,还需要在ARtcVideoCanvas 中指定该远端用户所在频道的 channel ID,否则会无法渲染出远端视频画面。
多频道发流限制
SDK 仅支持用户同一时间在一个频道内发布音、视频流。因此只要你在一个频道内正在发布音、视频流,就无法在另一个频道发布。
由于通过 ARtcEngineKit
类和 ARtcChannel
类下的 joinChannelByToken
方法加入频道后,SDK 的默认行为有以下差异:
ARtcEngineKit
类下,SDK 默认发布本地音视频流到本频道ARtcChannel
类下,SDK 默认不发布本地音视频流到本频道
因此,以下操作会导致 SDK 返回 ARErrorCodeRefused(5) 错误码:
-
通过
ARtcChannel
类加入多频道:- 调用频道一的
publish
方法后,未调用频道一的unpublish
方法结束发布,就调用频道二的publish
方法;
- 调用频道一的
-
通过混用
ARtcEngineKit
类和ARtcChannel
类加入多频道:- 通信场景下,通过
ARtcEngineKit
类加入频道一,然后通过ARtcChannel
类加入频道二后,试图调用ARtcChannel
类的publish
方法;
- 通信场景下,通过
-
直播场景下,通过
ARtcEngineKit
类加入频道一,然后通过ARtcChannel
类加入频道二后,试图调用ARtcChannel
类的publish
方法;- 直播场景下,加入多个频道后,试图以观众身份调用
ARtcChannel
类的publish
方法; - 调用
ARtcChannel
类的publish
方法后,未调用对应ARtcChannel
类的unpublish
方法,就试图通过ARtcEngineKit
类的joinChannelByToken
方法加入频道。
- 直播场景下,加入多个频道后,试图以观众身份调用