tencent cloud

文档反馈

观众连麦

最后更新时间:2025-01-09 15:46:28
    本文档主要介绍如何使用 RTC Room Engine SDK 实现 观众连麦功能。
    RTC Room Engine 支持如下麦位管理能力:

    前提条件

    在使用 RTC RoomEngine SDK 前,您需要先调用 登录 SDK,以便后续功能正常使用。

    使用指引

    说明:
    使用麦位管理时,您需要确保您已经开播或进入到了直播间。

    上麦响应配置

    iOS
    Android
    当您时房主时,您可以调用 updateRoomSeatModeByAdmin 接口实现,传入参数麦位模式 seatMode 即可。
    seatMode 是一个 TUISeatMode 类型的枚举。
    枚举值类型
    含义
    freeToTake
    申请上麦无需等待房主同意,可直接上麦
    applyToTake
    申请上麦需要等待房主同意才可上麦
    当您时房主时,您可以调用 updateRoomSeatModeByAdmin 接口实现,传入参数麦位模式 seatMode 即可。
    seatMode 是一个 SeatMode 类型的枚举。
    枚举值类型
    含义
    FREE_TO_TAKE
    申请上麦无需等待房主同意,可直接上麦
    APPLY_TO_TAKE
    申请上麦需要等待房主同意才可上麦
    以更新上麦相应配置为申请上麦模式为例:
    iOS
    Android
    import RTCRoomEngine
    
    let seatMode: TUISeatMode = .applyToTake // 这里选择申请上麦模式,若您需要选择自由上麦模式,可更改为.freeToTake
    TUIRoomEngine.sharedInstance().updateRoomSeatModeByAdmin(seatMode) {
    // 设置上麦响应配置成功
    } onError: { code, message in
    // 设置上麦响应配置失败
    }
    TUIRoomDefine.SeatMode seatMode = TUIRoomDefine.SeatMode.APPLY_TO_TAKE; // 这里选择申请上麦模式,若您需要选择自由上麦模式,可更改为.freeToTake
    TUIRoomEngine.sharedInstance().updateRoomSeatModeByAdmin(seatMode, new TUIRoomDefine.ActionCallback() {
    @Override
    public void onSuccess() {
    // 设置上麦响应配置成功
    }
    @Override
    public void onError(TUICommonDefine.Error error, String message) {
    // 设置上麦响应配置失败
    }
    });

    获取麦位列表

    您可以调用 getSeatList 接口获取当前的麦位列表信息。
    iOS
    Android
    import RTCRoomEngine
    
    TUIRoomEngine.sharedInstance().getSeatList { seatList in
    // 获取麦位列表成功
    } onError: { code, messagea in
    // 获取麦位列表失败
    }
    TUIRoomEngine.sharedInstance().getSeatList(new TUIRoomDefine.GetSeatListCallback() {
    @Override
    public void onSuccess(List<TUIRoomDefine.SeatInfo> list) {
    // 获取麦位列表成功
    }
    @Override
    public void onError(TUICommonDefine.Error error, String message) {
    // 获取麦位列表失败
    }
    });

    获取上麦请求列表

    您可以调用 getSeatApplicationList 接口获取当前的上麦请求列表信息。
    iOS
    Android
    import RTCRoomEngine
    
    TUIRoomEngine.sharedInstance().getSeatApplicationList { applications in
    // 获取上麦请求列表成功
    } onError: { code, message in
    // 获取上麦请求列表失败
    }
    TUIRoomEngine.sharedInstance().getSeatApplicationList(new TUIRoomDefine.RequestListCallback() {
    @Override
    public void onSuccess(List<TUIRoomDefine.Request> list) {
    // 获取上麦请求列表成功
    }
    @Override
    public void onError(TUICommonDefine.Error error, String message) {
    // 获取上麦请求列表失败
    }
    });

    申请上麦

    当您未上麦时,您可通过调用 takeSeat 接口实现申请上麦,传入两个参数:想要申请的麦位索引和超时时长。
    以申请上1号麦为例:
    iOS
    Android
    import RTCRoomEngine
    
    let index = 1 // 请将这里替换成您想要申请的麦位号
    let timeout = 30 // 请将这里替换成您申请上麦的超时时间,单位秒,如果设置为 0,SDK 不会做超时检测,也不会触发超时回调
    TUIRoomEngine.sharedInstance().takeSeat(index, timeout: TimeInterval(timeout)) { requestId, userId in
    // 上麦申请被接受
    } onRejected: { requestId, userId, message in
    // 上麦申请被拒绝
    } onCancelled: { requestId, userId in
    // 上麦申请被取消
    } onTimeout: { requestId, userId in
    // 上麦申请已超时
    } onError: { requestId, userId, code, message in
    // 上麦异常
    }
    int index = 1; // 请将这里替换成您想要申请的麦位号
    int timeout = 30; // 请将这里替换成您申请上麦的超时时间,单位秒,如果设置为 0,SDK 不会做超时检测,也不会触发超时回调
    TUIRoomEngine.sharedInstance().takeSeat(index, timeout, new TUIRoomDefine.RequestCallback() {
    @Override
    public void onAccepted(String requestId, String userId) {
    // 上麦申请被接受
    }
    @Override
    public void onRejected(String requestId, String userId, String message) {
    // 上麦申请被拒绝
    }
    @Override
    public void onCancelled(String requestId, String userId) {
    // 上麦申请被取消
    }
    @Override
    public void onTimeout(String requestId, String userId) {
    // 上麦申请已超时
    }
    
    @Override
    public void onError(String requestId, String userId, TUICommonDefine.Error error, String message) {
    // 上麦异常
    }
    });
    当您是房主时,若您通过 addObserver 接口成为了 RTC Room Engine SDK的观察者,则当有人申请上麦时,您会收到 onRequestReceived 回调,您可通过 responseRemoteRequest 接收或拒绝该请求。
    iOS
    Android
    func onRequestReceived(request: TUIRequest) {
    if request.requestAction == .takeSeat {
    let agreeToTakeSeat = true // 若您想拒绝该上麦请求,此处可置为false
    TUIRoomEngine.sharedInstance().responseRemoteRequest(request.requestId, agree: agreeToTakeSeat) {
    // 处理上麦请求成功
    } onError: { code, message in
    // 处理上麦请求失败
    }
    }
    }
    public void onRequestReceived(TUIRoomDefine.Request request) {
    if (TUIRoomDefine.RequestAction.REQUEST_TO_TAKE_SEAT == request.requestAction) {
    boolean agreeToTakeSeat = true; // 若您想拒绝该上麦请求,此处可置为false
    TUIRoomEngine.sharedInstance().responseRemoteRequest(request.requestId, agreeToTakeSeat, new TUIRoomDefine.ActionCallback() {
    @Override
    public void onSuccess() {
    // 处理上麦请求成功
    }
    @Override
    public void onError(TUICommonDefine.Error error, String message) {
    // 处理上麦请求失败
    }
    });
    }
    }

    主动下麦

    当您已经在麦上时,您可通过调用 leaveSeat 接口实现主动下麦。
    iOS
    Android
    import RTCRoomEngine
    
    TUIRoomEngine.sharedInstance().leaveSeat {
    // 主动下麦成功
    } onError: { code, message in
    // 主动下麦失败
    }
    TUIRoomEngine.sharedInstance().leaveSeat(new TUIRoomDefine.ActionCallback() {
    @Override
    public void onSuccess() {
    // 主动下麦成功
    }
    @Override
    public void onError(TUICommonDefine.Error error, String message) {
    // 主动下麦失败
    }
    });

    移动麦位

    当您已经在麦上时,您可通过调用 moveToSeat 接口实现移动麦位功能,传入参数:想要移动到的麦位索引。
    以移动到2号麦位为例:
    iOS
    Android
    import RTCRoomEngine
    
    let targetIndex = 2
    TUIRoomEngine.sharedInstance().moveToSeat(targetSeatIndex: targetIndex) {
    // 移动麦位成功
    } onError: { code, message in
    // 移动麦位失败
    }
    int targetIndex = 2;
    TUIRoomEngine.sharedInstance().moveToSeat(targetIndex, new TUIRoomDefine.ActionCallback() {
    @Override
    public void onSuccess() {
    // 移动麦位成功
    }
    @Override
    public void onError(TUICommonDefine.Error error, String message) {
    // 移动麦位失败
    }
    });

    踢人下麦

    当您是房主时,您可通过调用 kickUserOffSeatByAdmin 接口实现该功能,传入参数:想要踢下麦的用户的用户Id。
    以将麦位用户 Id 为100001的用户踢下麦为例:
    iOS
    Android
    import RTCRoomEngine
    
    let targetIndex = -1 // 请将改值设为-1,其他值无任何意义
    let userId = "100001" // 请将其替换成您需要踢下麦的用户
    TUIRoomEngine.sharedInstance().kickUserOffSeatByAdmin(targetIndex, userId: userId) {
    // 踢人下麦成功
    } onError: { code, messagae in
    // 踢人下麦失败
    }
    int targetIndex = -1; // 请将改值设为-1,其他值无任何意义
    String userId = "100001"; // 请将其替换成您需要踢下麦的用户
    TUIRoomEngine.sharedInstance().kickUserOffSeatByAdmin(targetIndex, userId, new TUIRoomDefine.ActionCallback() {
    @Override
    public void onSuccess() {
    // 踢人下麦成功
    }
    @Override
    public void onError(TUICommonDefine.Error error, String message) {
    // 踢人下麦失败
    }
    });

    邀请上麦

    当您是房主时,您可通过调用 takeUserOnSeatByAdmin 接口,传入三个参数:想要操作的麦位索引、想要邀请的用户的用户Id和超时时长。
    以邀请用户 Id 为 100002 的用户上4号麦为例:
    iOS
    Android
    import RTCRoomEngine
    
    let targetIndex = 4
    let timeout = 30 // 请将这里替换成您申请上麦的超时时间,单位秒,如果设置为 0,SDK 不会做超时检测,也不会触发超时回调
    let targetUserId = "100002" // 请替换成您想要踢下麦的主播的用户Id
    TUIRoomEngine.sharedInstance().takeUserOnSeatByAdmin(tartgetIndex,
    userId: targetUserId,
    timeout: TimeInterval(timeout)) { requestId, userId in
    // 上麦邀请被接受
    } onRejected: { requestId, userId, message in
    // 上麦邀请被拒绝
    } onCancelled: { requestId, userId in
    // 上麦邀请超时
    } onTimeout: { requestId, userId in
    // 上麦邀请被取消
    } onError: { requestId, userId, code, message in
    // 上麦邀请异常
    }
    int targetIndex = 4;
    int timeout = 30; // 请将这里替换成您申请上麦的超时时间,单位秒,如果设置为 0,SDK 不会做超时检测,也不会触发超时回调
    String targetUserId = "100002"; // 请替换成您想要踢下麦的主播的用户Id
    TUIRoomEngine.sharedInstance().takeUserOnSeatByAdmin(targetIndex, targetUserId, timeout, new TUIRoomDefine.RequestCallback() {
    @Override
    public void onAccepted(String requestId, String userId) {
    // 上麦邀请被接受
    }
    @Override
    public void onRejected(String requestId, String userId, String message) {
    // 上麦邀请被拒绝
    }
    @Override
    public void onCancelled(String requestId, String userId) {
    // 上麦邀请超时
    }
    @Override
    public void onTimeout(String requestId, String userId) {
    // 上麦邀请被取消
    }
    @Override
    public void onError(String requestId, String userId, TUICommonDefine.Error error, String message) {
    // 上麦邀请异常
    }
    });
    若您通过 addObserver 接口成为了 RTC Room Engine SDK的观察者,则当有人邀请您上麦时, 您会收到 onRequestReceived 回调, 您可通过调用 responseRemoteRequest 同意/拒绝对方的上麦邀请。
    iOS
    Android
    func onRequestReceived(request: TUIRequest) {
    if request.requestAction == .remoteUserOnSeat {
    let agreeToTakeSeat = true // 若您想拒绝该上麦邀请,此处可置为false
    TUIRoomEngine.sharedInstance().responseRemoteRequest(request.requestId,
    agree: agreeToTakeSeat) {
    // 处理上麦邀请成功
    } onError: { code, message in
    // 处理上麦邀请失败
    }
    }
    }
    public void onRequestReceived(TUIRoomDefine.Request request) {
    if (TUIRoomDefine.RequestAction.REQUEST_REMOTE_USER_ON_SEAT == request.requestAction) {
    boolean agreeToTakeSeat = true; // 若您想拒绝该上麦邀请,此处可置为false
    TUIRoomEngine.sharedInstance().responseRemoteRequest(request.requestId, agreeToTakeSeat, new TUIRoomDefine.ActionCallback() {
    @Override
    public void onSuccess() {
    // 处理上麦邀请成功
    }
    @Override
    public void onError(TUICommonDefine.Error error, String message) {
    // 处理上麦邀请失败
    }
    });
    }
    }

    锁定麦位

    iOS
    Android
    当您是房主,且想将5号空麦位锁定不让其他人上麦,或想将6号麦位上的主播静音且将7号麦位上的主播禁画时,可调用 lockSeat 接口,传入两个参数:将要锁定的麦位索引和锁定模式。
    锁定模式(TUISeatLockParams)的结构如下:
    属性名称
    字段含义
    补充说明
    数据类型
    填写示例
    lockSeat
    锁定麦位
    锁定对应麦位则该麦位不允许申请上麦。
    布尔值
    当锁定麦位时为 true
    lockVideo
    锁定麦位摄像头
    锁定对应麦位摄像头则该麦位不再发布视频流。
    布尔值
    false
    lockAudio
    锁定麦位麦克风
    锁定对应麦位摄像头则该麦位不再发布音频流。
    布尔值
    当锁定麦位麦克风时为 true
    当您是房主,且想将5号空麦位锁定不让其他人上麦,或想将6号麦位上的主播静音且将7号麦位上的主播禁画时,可调用 lockSeat 接口,传入两个参数:将要锁定的麦位索引和锁定模式。
    锁定模式(SeatLockParams)的结构如下:
    属性名称
    字段含义
    补充说明
    数据类型
    填写示例
    lockSeat
    锁定麦位
    锁定对应麦位则该麦位不允许申请上麦。
    布尔值
    当锁定麦位时为 true
    lockVideo
    锁定麦位摄像头
    锁定对应麦位摄像头则该麦位不再发布视频流。
    布尔值
    false
    lockAudio
    锁定麦位麦克风
    锁定对应麦位摄像头则该麦位不再发布音频流。
    布尔值
    当锁定麦位麦克风时为 true
    您可通过调用 lockSeatByAdmin 接口实现上述功能:
    iOS
    Android
    import RTCRoomEngine
    
    // 锁定麦位
    let lockSeatIndex = 5
    let lockSeatParam = TUISeatLockParams()
    lockSeatParam.lockSeat = true
    TUIRoomEngine.sharedInstance().lockSeatByAdmin(lockSeatIndex,
    lockMode: lockSeatParam) {
    // 锁定麦位成功
    } onError: { code, message in
    // 锁定麦位失败
    }
    
    // 锁定麦位麦克风
    let lockSeatAudioIndex = 6
    let lockSeatAudioParam = TUISeatLockParams()
    lockSeatAudioParam.lockAudio = true
    TUIRoomEngine.sharedInstance().lockSeatByAdmin(lockSeatAudioIndex,
    lockMode: lockSeatAudioParam) {
    // 锁定麦位麦克风成功
    } onError: { code, message in
    // 锁定麦位麦克风失败
    }
    
    // 锁定麦位摄像头
    let lockSeatVideoIndex = 7
    let lockSeatVideoParam = TUISeatLockParams()
    lockSeatAudioParam.lockVideo = true
    TUIRoomEngine.sharedInstance().lockSeatByAdmin(lockSeatVideoIndex,
    lockMode: lockSeatAudioParam) {
    // 锁定麦位摄像头成功
    } onError: { code, message in
    // 锁定麦位摄像头失败
    }
    // 锁定麦位
    int lockSeatIndex = 5;
    TUIRoomDefine.SeatLockParams lockSeatParam = new TUIRoomDefine.SeatLockParams();
    lockSeatParam.lockSeat = true;
    TUIRoomEngine.sharedInstance().lockSeatByAdmin(lockSeatIndex, lockSeatParam, new TUIRoomDefine.ActionCallback() {
    @Override
    public void onSuccess() {
    // 锁定麦位成功
    }
    @Override
    public void onError(TUICommonDefine.Error error, String message) {
    // 锁定麦位失败
    }
    });
    
    // 锁定麦位麦克风
    int lockSeatAudioIndex = 6;
    TUIRoomDefine.SeatLockParams lockSeatAudioParam = new TUIRoomDefine.SeatLockParams();
    lockSeatAudioParam.lockAudio = true;
    TUIRoomEngine.sharedInstance().lockSeatByAdmin(lockSeatAudioIndex, lockSeatAudioParam, new TUIRoomDefine.ActionCallback() {
    @Override
    public void onSuccess() {
    // 锁定麦位麦克风成功
    }
    @Override
    public void onError(TUICommonDefine.Error error, String message) {
    // 锁定麦位麦克风失败
    }
    });
    
    // 锁定麦位摄像头
    int lockSeatVideoIndex = 7;
    TUIRoomDefine.SeatLockParams lockSeatVideoParam = new TUIRoomDefine.SeatLockParams();
    lockSeatAudioParam.lockVideo = true;
    TUIRoomEngine.sharedInstance().lockSeatByAdmin(lockSeatVideoIndex, lockSeatAudioParam, new TUIRoomDefine.ActionCallback() {
    @Override
    public void onSuccess() {
    // 锁定麦位摄像头成功
    }
    @Override
    public void onError(TUICommonDefine.Error error, String message) {
    // 锁定麦位摄像头失败
    }
    });

    监听回调

    iOS
    Android
    您可通过调用 addObserver 成为 RTC Room Engine SDK的观察者,监听麦位相关的回调。
    CoGuestController 成为观察者为例:
    import RTCRoomEngine
    
    class CoGuestController: NSObject, TUIRoomObserver { // 请将其替换为您的业务类,这里只做示例
    override init() {
    super.init()
    TUIRoomEngine.sharedInstance().addObserver(self)
    }
    deinit {
    TUIRoomEngine.sharedInstance().removeObserver(self)
    }
    // 房间上麦模式发生变化时触发
    func onRoomSeatModeChanged(roomId: String, seatMode: TUISeatMode) {
    // 房间麦位模式改变了,当前模式:seatMode
    }
    // 当麦位列表改变时触发
    func onSeatListChanged(seatList: [TUISeatInfo], seated seatedList: [TUISeatInfo], left leftList: [TUISeatInfo]) {
    // 麦位列表改变了, 麦上最新的用户列表:seatList, 新上麦的用户列表:seatedList, 新下麦的用户列表:leftList
    }
    // 当收到其他用户的请求时触发
    func onRequestReceived(request: TUIRequest) {
    switch request.requestAction {
    case .takeSeat:
    // 收到来自request.userName的上麦请求
    case .remoteUserOnSeat:
    // 收到来自request.userName的上麦邀请
    default:
    break
    }
    }
    // 当其他用户取消请求时触发
    func onRequestCancelled(request: TUIRequest, operateUser: TUIUserInfo) {
    switch request.requestAction {
    case .takeSeat:
    // 来自request.userName的上麦请求被取消了
    case .remoteUserOnSeat:
    // 来自request.userName的上麦邀请被取消了
    default:
    break
    }
    }
    
    // 收到请求被其他 管理员/房主 处理时触发
    func onRequestProcessed(request: TUIRequest, operateUser: TUIUserInfo) {
    switch request.requestAction {
    case .takeSeat:
    // 来自request.userName的上麦请求被operateUser.userName处理了
    case .remoteUserOnSeat:
    // 来自request.userName的上麦邀请被operateUser.userName处理了
    default:
    break
    }
    }
    }
    您可通过调用 addObserver 成为 RTC Room Engine SDK的观察者,监听麦位相关的回调。
    CoGuestObserver 成为观察者为例:
    class CoGuestObserver extends TUIRoomObserver { // 请将其替换为您的业务类,这里只做示例
    
    CoGuestObserver() {
    TUIRoomEngine.sharedInstance().addObserver(this);
    }
    
    // 房间上麦模式发生变化时触发
    @Override
    public void onRoomSeatModeChanged(String roomId, TUIRoomDefine.SeatMode seatMode) {
    // 房间麦位模式改变了,当前模式:seatMode
    }
    // 当麦位列表改变时触发
    @Override
    public void onSeatListChanged(List<TUIRoomDefine.SeatInfo> seatList, List<TUIRoomDefine.SeatInfo> seatedList,
    List<TUIRoomDefine.SeatInfo> leftList) {
    // 麦位列表改变了, 麦上最新的用户列表:seatList, 新上麦的用户列表:seatedList, 新下麦的用户列表:leftList
    }
    // 当收到其他用户的请求时触发
    @Override
    public void onRequestReceived(TUIRoomDefine.Request request) {
    switch (request.requestAction) {
    case REQUEST_TO_TAKE_SEAT:
    // 收到来自request.userName的上麦请求
    case REQUEST_REMOTE_USER_ON_SEAT:
    // 收到来自request.userName的上麦邀请
    default:
    break;
    }
    }
    // 当其他用户取消请求时触发
    @Override
    public void onRequestCancelled(TUIRoomDefine.Request request, TUIRoomDefine.UserInfo operateUser) {
    switch (request.requestAction) {
    case REQUEST_TO_TAKE_SEAT:
    // 来自request.userName的上麦请求被取消了
    case REQUEST_REMOTE_USER_ON_SEAT:
    // 来自request.userName的上麦邀请被取消了
    default:
    break;
    }
    }
    
    // 收到请求被其他 管理员/房主 处理时触发
    @Override
    public void onRequestProcessed(TUIRoomDefine.Request request, TUIRoomDefine.UserInfo operateUser) {
    switch (request.requestAction) {
    case REQUEST_TO_TAKE_SEAT:
    // 来自request.userName的上麦请求被operateUser.userName处理了
    case REQUEST_REMOTE_USER_ON_SEAT:
    // 来自request.userName的上麦邀请被operateUser.userName处理了
    default:
    break;
    }
    }
    }
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持