跳到主要内容

同房间连麦

提示

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

观众上麦

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

  1. (可选)App 可提前获取当前用户需要发布的流。如果在切换为主播时传入流数组,SDK 会在角色切换成功后自动发布。

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

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

     NSArray *streams = @[self.engine.defaultAudioStream,self.engine.defaultVideoStream];

    [self.room.localUser switchToBroadcaster:streams onSucceed:^(RCRTCLiveInfo * _Nonnull liveInfo) {
    //TODO:切换到主播成功,订阅房间内流资源
    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(@"OnFailed:%@",@(code));
    } onKicked:^{
    NSLog(@"OnKicked");
    }];

    如果切换为主播时 publishStreams 为空(不发布资源),App 可以单独调用主播发布资源的方法。详见发布与订阅 · 主播端

    参数类型说明
    publishStreamsNSArray<RCRTCOutputStream *>切换成主播,需要发布的流数组(可以传空)。
    onSucceedvoid (^)(RCRTCLiveInfo *liveInfo)切换成功的回调,liveInfo 会携带发布资源后的 liveUrl
    onFailedvoid (^)(RCRTCCode code)切换失败的回调,不会影响当前观众身份,用户可以继续音视频相关操作
    onKickedvoid (^)(void)切换失败,被 SDK 主动踢出的回调,需要用户重新加入房间才能继续音视频的相关操作
  4. 观众上麦后,RTC 房间内的其他用户(主播、观众)同房间内的其他用户会通过 RCRTCRoomEventDelegate 协议里面的 didSwitchRoleWithUser:roleType: 方法监听到远端用户切换身份为 RCRTCLiveRoleTypeBroadcaster

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

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

主播下麦

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

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

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

    [self.room.localUser switchToAudienceOnSucceed:^{
    //TODO:观众订阅
    NSArrry *streams = [self.room getLiveStreams];
    //[self subscribeStreams:streams];
    } onFailed:^(RCRTCCode code) {
    NSLog(@"OnFailed:%@",@(code));
    } onKicked:^{
    NSLog(@"OnKicked");
    }];
    参数类型说明
    onSucceedvoid (^)(void)切换成功的回调
    onFailedvoid (^)(RCRTCCode code)切换失败的回调,不会影响当前主播身份,用户可以继续音视频相关操作
    onKickedvoid (^)(void)切换失败,被 SDK 主动踢出的回调,需要用户重新加入房间才能继续音视频的相关操作
    提示

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

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

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

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

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

/*!
远端用户切换身份通知

@param user 切换身份的用户
@param roleType 该用户当前的身份

@discussion
有切换身份时的回调,当有用户切换身份的时候,当前房间内其他主播会收到该消息。
如果订阅了当前 user 的流,SDK 会主动取消订阅,不需要手动取消订阅。
added from 5.1.9

@remarks 代理
*/
- (void)didSwitchRoleWithUser:(RCRTCRemoteUser *)user roleType:(RCRTCLiveRoleType)roleType;
参数类型说明
userRCRTCRemoteUser切换身份的用户
roleTypeRCRTCLiveRoleType切换成功的目标角色类型