
# 加入多频道（跨房）
#### 功能描述
跨房间连麦，指主播的媒体流可以同时转发进多个（目前最多支持四个）房间频道，实现主播跨频道与其他主播实时互动的场景。房间中的所有主播可以看见彼此，房间中的观众可以看到所有主播。
#### 注意事项
- 同一时间最多只能创建4个连接对象，每个连接对象对应的房间ID必须互不相同。
- 如果使用connection对象加入房间，则加入房间的房间ID不能和已创建连接对象对应的房间ID相同。
- 同一时间只能以一个JOINER角色加入某一个房间。如果本端在其他房间里的角色是HWRtcRoleJoiner，则需要调用该房间的setUserRole方法将本端在该房间的角色切换为HWRtcRolePlayer后才能以HWRtcRoleJoiner跨入其他房间。如果本端用户是以HWRtcRolePlayer角色加入此跨房房间，则需要调用跨房连接的setUserRole方法将本端的角色切换为HWRtcRoleJoiner后才能发送音频流和视频流。
 
 #### 接口调用流程
![](https://support.huaweicloud.com/bestpractice-rtc/zh-cn_image_0000001227603207.png)
#### 实现过程
1. **加入房间**
   参考[接口调用流程]中加入房间的时序图步骤加入主房间。
   
2. **创建跨房连接**
   当收到远端用户加入房间后会触发connection:onRemoteUserOnline跨房回调，在该回调内用对应远端用户的跨房连接调用startRemoteStreamView方法设置远端窗口并开启收流。
   示例代码如下：
   ```
   //创建跨房引擎，room id具有唯一性，不可重复，设置引擎代理
   HWRtcConnection *connection = [rtcEngine createConnection:@”room id”];
   connection.delegate = self;
   ```
   
3. **调用跨房连接的joinRoom加入跨房房间**
   调用跨房连接的joinRoom接口加入房间，其中HWRtcUserInfo的signature鉴权签名字符串需要填入正确的计算值，计算方法请参考[接入鉴权](https://support.huaweicloud.com/csdk-rtc/rtc_05_0348.html)。
   如果本端需要发送音频或者视频流给跨房房间里的远端用户，则用户的role参数需要设为HWRtcRoleJoiner，否则可以设为HWRtcRolePlayer，只收流不发流。
   **注意：** 不能同时以**JOINER**角色加入多个房间。
   加入跨房房间成功后会收到跨房回调指针的onJoinRoomSuccess通知，加入房间失败会收到跨房回调指针的onJoinRoomFailure通知。
   示例代码如下：
   ```
   //创建HWRtcJoinParam对象
   HWRtcJoinParam  *joinRoomParam = [[HWRtcJoinParam alloc] init];
   joinRoomParam.autoSubscribeAudio = YES;
   joinRoomParam.autoSubscribeVideo = YES;
   joinRoomParam.userId = "userId";
   joinRoomParam.userName = "userName";
   joinRoomParam.authorization = authorization; //authorization：鉴权信息，具体生成方法请参见接入鉴权。与加入房间的authorization相同
   joinRoomParam.ctime = time;//与加入房间的time相同
   joinRoomParam.roomId = "roomId";
   joinRoomParam.userRole = HWRtcRolePlayer;
   joinRoomParam.sfuType = 0;
   joinRoomParam.scenario = 0;
   //通过跨房引擎进入房间
   [connection joinRoom:joinRoomParam];
   ```
   
4. **收远端用户的视频流**
   收到远端用户加入房间后会收到跨房回调connection:onRemoteUserOnline，可以调用该远端用户对应的跨房连接的startRemoteStreamView设置远端窗口并开启收流。
   示例代码如下：
   ```
   //远端用户加入房间后会收到跨房回调
   - (void)connection:(HWRtcConnection *)connection
         onRemoteUserOnline:(NSString * _Nonnull)userId
             userName:(NSString * _Nonnull)userName
   {
       //创建视频画布对象
       HWRtcVideoCanvas *canvas = [[HWRtcVideoCanvas alloc] init];
       canvas.uid = @”remote userId”;
       canvas.view = [[HWRtcView alloc] initWitFrame:(0,0,100,100)];
       //设置远端窗口并开启收流
       [connection startRemoteStreamView:canvas streamType:HWRtcStreamTypeHD disableAdjustRes:YES];
   }
   ```
   
5. **退出跨房房间**
   跨房结束后，调用跨房连接的leaveRoom接口跨房房间。
   示例代码如下：
   ```
   //退出跨房房间
   [connection leaveRoom]；
   ```
   
 
#### API参考
[createConnection](https://support.huaweicloud.com/csdk-rtc/rtc_05_0055.html#section5)
[joinRoom](https://support.huaweicloud.com/csdk-rtc/rtc_05_0055.html#section0)
[connection:onJoinSuccess](https://support.huaweicloud.com/csdk-rtc/rtc_05_0074.html#section0)
[connection:onJoinRoomFailure](https://support.huaweicloud.com/csdk-rtc/rtc_05_0074.html#section1)
[connection:onRemoteUserOnline](https://support.huaweicloud.com/csdk-rtc/rtc_05_0074.html#section4)
[startRemoteStreamView](https://support.huaweicloud.com/csdk-rtc/rtc_05_0071.html#section0)
[leaveRoom](https://support.huaweicloud.com/csdk-rtc/rtc_05_0055.html#section3)
