跳到主要内容

同房间连麦

提示

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

观众上麦

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

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

    // 示例代码使用480x640分辨率演示
    RCRTCVideoStreamConfig config = RCRTCVideoStreamConfig
    .Builder.create()
    .setVideoResolution(RCRTCVideoResolution.RESOLUTION_480_640)
    .build();
    RCRTCEngine.getInstance().getDefaultVideoStream().setVideoConfig(config);
    // 创建视图渲染视图
    RCRTCVideoView videoView = new RCRTCVideoView(this.getApplicationContext());
    RCRTCEngine.getInstance().getDefaultVideoStream().setVideoView(videoView);
    //TODO 示例代码使用获取本地默认视频流、音频流演示
    ArrayList<RCRTCOutputStream> streams = new ArrayList<>();
    streams.add(RCRTCEngine.getInstance().getDefaultVideoStream());
    streams.add(RCRTCEngine.getInstance().getDefaultAudioStream());
    // 开启摄像头
    RCRTCEngine.getInstance().getDefaultVideoStream().startCamera(null);
  2. App 调用 RCRTCLocalUserswitchToBroadcaster 接口,将当前登录用户(观众角色)切换为主播角色。角色切换后,RCRTCRoom 对象中数据会自动刷新。角色切换后会保留通过 RCRTCEngine#registerEventListenerRCRTCEngine#registerStatusReportListenerRCRTCRoom#registerRoomListener 等注册的 RTC SDK 全局类型的监听。其他监听需要切换角色成功后重新注册才能使用。

    // 开始切换为主播身份
    RCRTCEngine.getInstance().getRoom().getLocalUser().switchToBroadcaster(streams, new IRCRTCSwitchRoleDataCallback<RCRTCLiveInfo>() {
    /**
    * 当切换失败且SDK处于无法回退状态时回调,该角色已经无法使用当前角色继续进行音视频。
    * SDK内部会退出房间并清理所有资源,该用户只能重新加入房间才能继续音视频。
    */
    @Override
    public void onKicked() {

    }

    @Override
    public void onSuccess(RCRTCLiveInfo data) {
    //该用户切换为主播成功,可以以主播身份进行音视频
    }

    /**
    * 当切换失败且不影响当前角色继续音视频时回调
    * @param errorCode 失败错误码
    */
    @Override
    public void onFailed(RTCErrorCode errorCode) {

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

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

  5. 观众上麦后,RTC 房间内的其他用户(主播、观众)可通过 [房间事件回调] 中的 onRemoteUserPublishResource 回调收到发流通知。App 端需要自行处理资源订阅。

主播下麦

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

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

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

    // 开始切换为观众身份
    RCRTCEngine.getInstance().getRoom().getLocalUser().switchToAudience(new IRCRTCSwitchRoleCallback() {

    /**
    * 当切换失败且SDK处于无法回退状态时回调,该角色已经无法使用当前角色继续进行音视频。
    * SDK内部会退出房间并清理所有资源,该用户只能重新加入房间才能继续音视频。
    */
    @Override
    public void onKicked() {
    }

    @Override
    public void onSuccess() {
    // 该用户切换为观众成功,可以以观众身份进行音视频
    }

    /**
    * 当切换失败且不影响当前角色继续音视频时回调
    * @param errorCode 失败错误码
    */
    @Override
    public void onFailed(RTCErrorCode errorCode) {

    }
    });
    提示

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

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

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

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

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

RCRTCEngine.getInstance().getRoom().registerRoomListener(new IRCRTCRoomEventsListener() {

/**
* Add from 5.1.9 </br>
*
* 远端用户切换角色通知
*
* @param userId 用户 Id
* @param role 当前角色
*/
@Override
public void onSwitchRole(String userId, RCRTCLiveRole role) {
super.onSwitchRole(userId, role);
}
//todo 省略其他回调
});