同房间连麦
5.1.9 版本之前如需实现上下麦,需要让观众先退出房间,设置新的角色身份,再重新加入房间。
观众上麦
观众上麦本质上是切换身份变成当前房间的主播,然后以主播身份继续直播相关操作。App 处理步骤如下:
- App 调用 RCRTCLocalUser 的 switchToBroadcaster 接口,将当前登录用户(观众角色)切换为主播角色。角色切换后,
RCRTCRoom
对象中数据会自动刷新。角色切换后会保留之前注册的 RCRTCStatusReportDelegate、RCRTCEngineEventDelegate 和 RCRTCRoomEventDelegate 等 RTC SDK 全局类型的监听。
接口原型
- (void)switchToBroadcaster:(nullable NSArray<RCRTCOutputStream *> *)publishStreams
onSucceed:(nullable void (^)(RCRTCLiveInfo * _Nonnull liveInfo))onSucceed
onFailed:(nullable void (^)(RCRTCCode code))onFailed
onKicked:(nullable void (^)(void))onKicked;
参数说明
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
publishStreams | NSArray<RCRTCOutputStream *> | 否 | 切换成主播,需要发布的流数组(可以传空) |
onSucceed | void (^)(RCRTCLiveInfo *liveInfo) | 否 | 切换成功的回调,liveInfo 会携带发布资源后的 liveUrl |
onFailed | void (^)(RCRTCCode code) | 否 | 切换失败的回调,不会影响当前观众身份,用户可以继续音视频相关操作 |
onKicked | void (^)(void) | 否 | 切换失败,被 SDK 主动踢出的回调,需要用户重新加入房间才能继续音视频的相关操作 |
代码示例
NSArray *streams = @[[RCRTCEngine sharedInstance].defaultAudioStream, [RCRTCEngine sharedInstance]..defaultVideoStream];
[self.room.localUser switchToBroadcaster:streams
onSucceed:^(RCRTCLiveInfo * _Nonnull liveInfo) {
// 切换到主播成功,订阅房间内流资源
NSMutableArray *streams = [NSMutableArray array];
for (RCRTCRemoteUser *user in self.room.remoteUsers) {
if (user.remoteStreams.count) {
[streams addObjectsFromArray:user.remoteStreams];
}
}
if (streams.count) {
// 订阅资源
[self subscribeStreams:streams];
}
} onFailed:^(RCRTCCode code) {
NSLog(@"切换失败:%@", @(code));
} onKicked:^{
NSLog(@"被踢出房间");
}];
如果切换为主播时 publishStreams
参数为空(不发布资源),App 可以单独调用主播发布资源的方法。详见发布与订阅 · 主播端。
-
观众上麦后,SDK 内部会取消当前登录用户之前(作为观众)订阅的音视频流。因此,在成功切换为主播角色后,App 需要为当前用户调用 subscribeStreams 重新订阅。注意,主播角色一般仅订阅其他主播发布的流,不订阅合流。
-
观众上麦后,RTC 房间内的其他用户(主播、观众)会收到回调:
- 其他主播角色用户通过 RCRTCRoomEventDelegate 协议里面的
didSwitchRoleWithUser:roleType:
方法监听到远端用户切换身份为RCRTCLiveRoleTypeBroadcaster
。 - 观众角色用户通过 RCRTCRoomEventDelegate 协议里面的 didJoinUser 回调收到通知。
- 其他主播角色用户通过 RCRTCRoomEventDelegate 协议里面的
-
观众上麦后,RTC 房间内的其他用户(主播、观众)可通过 房间事件回调 中的
didPublishStreams
回调收到发 流通知。App 端需要自行处理资源订阅,具体参考发布与订阅 · 观众端 与 发布与订阅 · 主播端。
主播下麦
主播下麦本质上是切换身份变成当前房间的观众,然后以观众身份继续观看直播等相关操作。App 处理步骤如下:
- App 调用 RCRTCLocalUser 的 switchToAudienceOnSucceed 接口,将当前登录用户(主播角色)切换为观众角色。角色切换后,
RCRTCRoom
对象中数据会自动刷新。角色切换后会保留之前注册的 RCRTCStatusReportDelegate、RCRTCEngineEventDelegate 和 RCRTCRoomEventDelegate 等 RTC SDK 全局类型的监听。
接口原型
- (void)switchToAudienceOnSucceed:(nullable void (^)(void))onSucceed
onFailed:(nullable void (^)(RCRTCCode code))onFailed
onKicked:(nullable void (^)(void))onKicked;
参数说明
参 数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
onSucceed | void (^)(void) | 否 | 切换成功的回调 |
onFailed | void (^)(RCRTCCode code) | 否 | 切换失败的回调,不会影响当前主播身份,用户可以继续音视频相关操作 |
onKicked | void (^)(void) | 否 | 切换失败,被 SDK 主动踢出的回调,需要用户重新加入房间才能继续音视频的相关操作 |
代码示例
[self.room.localUser switchToAudienceOnSucceed:^{
// 观众获取合流后需要订阅合流
NSArray *streams = [self.room getLiveStreams];
} onFailed:^(RCRTCCode code) {
NSLog(@"切换失败:%@", @(code));
} onKicked:^{
NSLog(@"被踢出房间");
}];
- 主播下麦后,SDK 内部会取消当前登录用户之前(作为主播)发布、订阅的音视频流。因此,在成功切换为观众角色后,App 需要为当前用户调用 subscribeStreams 重新订阅。注意,观众角色一般仅订阅合流。
如果当前用户在跨房间连麦中加入了 RCRTCOtherRoom
,切换为观众时,SDK 内部会帮其退出所有 RCRTCOtherRoom
。不会结束本次连麦。如果需要结束连麦请在切换角色前调用 RCRTCEngine 的 leaveOtherRoom:notifyFinished:completion:
方法,notifyFinished
参数传 YES
即可。
-
主播下麦后,RTC 房间内的其他用户(主播、观众)会收到回调:
- 其他主播角色用户通过 RCRTCRoomEventDelegate 协议里面的
didSwitchRoleWithUser:roleType:
方法监听到远端用户切换身份为RCRTCLiveRoleTypeAudience
。 - 观众角色用户通过 RCRTCRoomEventDelegate 协议里面的 didLeaveUser 回调收到通知。
- 其他主播角色用户通过 RCRTCRoomEventDelegate 协议里面的
监听房间用户切换角色事件
当房间内的用户使用切换角色方式上下麦时,同房间内用户均会收到回调。其中主播用户会通过 RCRTCRoomEventDelegate 协议里面的 didSwitchRoleWithUser:roleType:
方法监听到远端用户切换身份。
如果主播用户订阅的其他主播下麦,SDK 内部会主动取消订阅不存在的音视频流,但 App 需要在此回调方法中移除当前视频流视图等操作。
接口原型
- (void)didSwitchRoleWithUser:(RCRTCRemoteUser *)user roleType:(RCRTCLiveRoleType)roleType;
参数说明
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
user | RCRTCRemoteUser | 是 | 切换身份的用户 |
roleType | RCRTCLiveRoleType | 是 | 切换成功的目标角色类型 |
代码示例
- (void)didSwitchRoleWithUser:(RCRTCRemoteUser *)user roleType:(RCRTCLiveRoleType)roleType {
if (roleType == RCRTCLiveRoleTypeAudience) {
// 用户下麦,移除视频视图等UI操作
} else if (roleType == RCRTCLiveRoleTypeBroadcaster) {
// 用户上麦,准备展示新主播
}
}