跳到主要内容

同房间连麦

提示

5.1.9 版本之前如需实现上下麦,需要让观众先退出房间,设置新的角色身份,再重新加入房间。

观众上麦

观众上麦本质上是切换身份变成当前房间的主播,然后以主播身份继续直播相关操作。App 处理步骤如下:

  1. App 调用 RCRTCLocalUserswitchToBroadcaster 接口,将当前登录用户(观众角色)切换为主播角色。角色切换后,RCRTCRoom 对象中数据会自动刷新。角色切换后会保留之前注册的 RCRTCStatusReportDelegateRCRTCEngineEventDelegateRCRTCRoomEventDelegate 等 RTC SDK 全局类型的监听。

接口原型

Objective C
- (void)switchToBroadcaster:(nullable NSArray<RCRTCOutputStream *> *)publishStreams
onSucceed:(nullable void (^)(RCRTCLiveInfo * _Nonnull liveInfo))onSucceed
onFailed:(nullable void (^)(RCRTCCode code))onFailed
onKicked:(nullable void (^)(void))onKicked;

参数说明

参数类型是否必填说明
publishStreamsNSArray<RCRTCOutputStream *>切换成主播,需要发布的流数组(可以传空)
onSucceedvoid (^)(RCRTCLiveInfo *liveInfo)切换成功的回调,liveInfo 会携带发布资源后的 liveUrl
onFailedvoid (^)(RCRTCCode code)切换失败的回调,不会影响当前观众身份,用户可以继续音视频相关操作
onKickedvoid (^)(void)切换失败,被 SDK 主动踢出的回调,需要用户重新加入房间才能继续音视频的相关操作

代码示例

Objective C
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 可以单独调用主播发布资源的方法。详见发布与订阅 · 主播端

  1. 观众上麦后,SDK 内部会取消当前登录用户之前(作为观众)订阅的音视频流。因此,在成功切换为主播角色后,App 需要为当前用户调用 subscribeStreams 重新订阅。注意,主播角色一般仅订阅其他主播发布的流,不订阅合流。

  2. 观众上麦后,RTC 房间内的其他用户(主播、观众)会收到回调:

    • 其他主播角色用户通过 RCRTCRoomEventDelegate 协议里面的 didSwitchRoleWithUser:roleType: 方法监听到远端用户切换身份为 RCRTCLiveRoleTypeBroadcaster
    • 观众角色用户通过 RCRTCRoomEventDelegate 协议里面的 didJoinUser 回调收到通知。
  3. 观众上麦后,RTC 房间内的其他用户(主播、观众)可通过 房间事件回调 中的 didPublishStreams 回调收到发流通知。App 端需要自行处理资源订阅,具体参考发布与订阅 · 观众端发布与订阅 · 主播端

主播下麦

主播下麦本质上是切换身份变成当前房间的观众,然后以观众身份继续观看直播等相关操作。App 处理步骤如下:

  1. App 调用 RCRTCLocalUserswitchToAudienceOnSucceed 接口,将当前登录用户(主播角色)切换为观众角色。角色切换后,RCRTCRoom 对象中数据会自动刷新。角色切换后会保留之前注册的 RCRTCStatusReportDelegateRCRTCEngineEventDelegateRCRTCRoomEventDelegate 等 RTC SDK 全局类型的监听。

接口原型

Objective C
- (void)switchToAudienceOnSucceed:(nullable void (^)(void))onSucceed
onFailed:(nullable void (^)(RCRTCCode code))onFailed
onKicked:(nullable void (^)(void))onKicked;

参数说明

参数类型是否必填说明
onSucceedvoid (^)(void)切换成功的回调
onFailedvoid (^)(RCRTCCode code)切换失败的回调,不会影响当前主播身份,用户可以继续音视频相关操作
onKickedvoid (^)(void)切换失败,被 SDK 主动踢出的回调,需要用户重新加入房间才能继续音视频的相关操作

代码示例

Objective C
[self.room.localUser switchToAudienceOnSucceed:^{
// 观众获取合流后需要订阅合流
NSArray *streams = [self.room getLiveStreams];
} onFailed:^(RCRTCCode code) {
NSLog(@"切换失败:%@", @(code));
} onKicked:^{
NSLog(@"被踢出房间");
}];
  1. 主播下麦后,SDK 内部会取消当前登录用户之前(作为主播)发布、订阅的音视频流。因此,在成功切换为观众角色后,App 需要为当前用户调用 subscribeStreams 重新订阅。注意,观众角色一般仅订阅合流。
提示

如果当前用户在跨房间连麦中加入了 RCRTCOtherRoom,切换为观众时,SDK 内部会帮其退出所有 RCRTCOtherRoom。不会结束本次连麦。如果需要结束连麦请在切换角色前调用 RCRTCEngineleaveOtherRoom:notifyFinished:completion: 方法,notifyFinished 参数传 YES 即可。

  1. 主播下麦后,RTC 房间内的其他用户(主播、观众)会收到回调:

监听房间用户切换角色事件

当房间内的用户使用切换角色方式上下麦时,同房间内用户均会收到回调。其中主播用户会通过 RCRTCRoomEventDelegate 协议里面的 didSwitchRoleWithUser:roleType: 方法监听到远端用户切换身份。

如果主播用户订阅的其他主播下麦,SDK 内部会主动取消订阅不存在的音视频流,但 App 需要在此回调方法中移除当前视频流视图等操作。

接口原型

Objective C
- (void)didSwitchRoleWithUser:(RCRTCRemoteUser *)user roleType:(RCRTCLiveRoleType)roleType;

参数说明

参数类型是否必填说明
userRCRTCRemoteUser切换身份的用户
roleTypeRCRTCLiveRoleType切换成功的目标角色类型

代码示例

Objective C
- (void)didSwitchRoleWithUser:(RCRTCRemoteUser *)user roleType:(RCRTCLiveRoleType)roleType {
if (roleType == RCRTCLiveRoleTypeAudience) {
// 用户下麦,移除视频视图等UI操作
} else if (roleType == RCRTCLiveRoleTypeBroadcaster) {
// 用户上麦,准备展示新主播
}
}