tencent cloud

实时音视频

动态与公告
产品动态
产品近期公告
关于 TRTC Live 正式上线的公告
关于TRTC Conference 正式版上线的公告
Conference 商业化版本即将推出
关于多人音视频 Conference 开启内测公告
关于音视频通话 Call 正式版上线的公告
关于腾讯云音视频终端 SDK 播放升级及新增授权校验的公告
关于 TRTC 应用订阅套餐服务上线的相关说明
产品简介
产品概述
基本概念
产品功能
产品优势
应用场景
性能数据
购买指南
计费概述
免费时长说明
月订阅
现收现付
TRTC 逾期与暂停政策
常见问题解答
退款说明
新手指引
Demo 体验
视频通话 SDK
组件介绍
开通服务
跑通 Demo
快速接入
离线唤醒
会话聊天
云端录制
AI 降噪
界面定制
Chat 集成通话能力
更多特性
无 UI 集成
服务端 API
客户端 API
解决方案
错误码表
发布日志
常见问题
视频会议 SDK
组件介绍(TUIRoomKit)
开通服务(TUIRoomKit)
跑通 Demo(TUIRoomKit)
快速接入(TUIRoomKit)
屏幕共享(TUIRoomKit)
预定会议(TUIRoomKit)
会中呼叫(TUIRoomKit)
界面定制(TUIRoomKit)
虚拟背景(TUIRoomKit)
会议控制(TUIRoomKit)
云端录制(TUIRoomKit)
AI 降噪(TUIRoomKit)
会中聊天(TUIRoomKit)
机器人推流(TUIRoomKit)
更多特性(TUIRoomKit)
客户端 API(TUIRoomKit)
服务端 API(TUIRoomKit)
常见问题(TUIRoomKit)
错误码 (TUIRoomKit)
SDK更新日志(TUIRoomKit)
直播与语聊 SDK
Live 视频直播计费说明
组件介绍
开通服务(TUILiveKit)
跑通 Demo
无 UI 集成
UI 自定义
直播监播
视频直播
语聊房
高级功能
客户端 API
服务端 API
错误码
发布日志
常见问题
RTC Engine
开通服务
SDK 下载
API-Example
接入指引
API-参考手册
高级功能
AI 集成
概述
MCP 配置
Skills 配置
集成指南
常见问题
RTC RESTFUL API
History
Introduction
API Category
Room Management APIs
Stream mixing and relay APIs
On-cloud recording APIs
Data Monitoring APIs
Pull stream Relay Related interface
Web Record APIs
AI Service APIs
Cloud Slicing APIs
Cloud Moderation APIs
Making API Requests
Call Quality Monitoring APIs
Usage Statistics APIs
Data Types
Appendix
Error Codes
控制台指南
应用管理
套餐包管理
用量统计
监控仪表盘
开发辅助
解决方案
实时合唱
常见问题
迁移指南
计费相关
功能相关
UserSig 相关
应对防火墙限制相关
缩减安装包体积相关
Andriod 与 iOS 相关
Web 端相关
Flutter 相关
Electron 相关
TRTCCalling Web 相关
音视频质量相关
其他问题
旧版文档
RTC RoomEngine SDK(旧)
集成 TUIRoom (Web)
集成 TUIRoom (Android)
集成 TUIRoom (iOS)
集成 TUIRoom (Flutter)
集成 TUIRoom (Electron)
TUIRoom API 查询
实现云端录制与回放(旧)
监控仪表盘计费(旧)
协议与策略
安全合规认证
安全白皮书
信息安全说明
服务等级协议
苹果隐私策略:PrivacyInfo.xcprivacy
TRTC 政策
隐私协议
数据处理和安全协议
词汇表

观众连麦

PDF
聚焦模式
字号
最后更新时间: 2025-10-27 16:27:06
本文档主要介绍如何使用 RTC RoomEngine SDK 实现 观众连麦功能。
RTC RoomEngine SDK 支持如下麦位管理能力:

前提条件

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

使用指引

说明:
使用麦位管理时,您需要确保您已经开播或进入到了直播间。
以更新上麦响应配置为申请上麦模式为例:
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, message 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 RoomEngine 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, message 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(targetIndex,
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 RoomEngine 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号麦位上的主播禁画时,可调用 lockSeatByAdmin 接口,传入两个参数:将要锁定的麦位索引和锁定模式。
锁定模式(TUISeatLockParams)的结构如下:
属性名称
字段含义
补充说明
数据类型
填写示例
lockSeat
锁定麦位
锁定对应麦位则该麦位不允许申请上麦。
布尔值
当锁定麦位时为 true
lockVideo
锁定麦位摄像头
锁定对应麦位摄像头则该麦位不再发布视频流。
布尔值
当锁定麦位摄像头时为 true
lockAudio
锁定麦位麦克风
锁定对应麦位麦克风则该麦位不再发布音频流。
布尔值
当锁定麦位麦克风时为 true
当您是房主,且想将5号空麦位锁定不让其他人上麦,或想将6号麦位上的主播静音且将7号麦位上的主播禁画时,可调用 lockSeatByAdmin 接口,传入两个参数:将要锁定的麦位索引和锁定模式。
锁定模式(SeatLockParams)的结构如下:
属性名称
字段含义
补充说明
数据类型
填写示例
lockSeat
锁定麦位
锁定对应麦位则该麦位不允许申请上麦。
布尔值
当锁定麦位时为 true
lockVideo
锁定麦位摄像头
锁定对应麦位摄像头则该麦位不再发布视频流。
布尔值
当锁定麦位摄像头时为 true
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()
lockSeatVideoParam.lockVideo = true
TUIRoomEngine.sharedInstance().lockSeatByAdmin(lockSeatVideoIndex,
lockMode: lockSeatVideoParam) {
// 锁定麦位摄像头成功
} 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();
lockSeatVideoParam.lockVideo = true;
TUIRoomEngine.sharedInstance().lockSeatByAdmin(lockSeatVideoIndex, lockSeatVideoParam, new TUIRoomDefine.ActionCallback() {
@Override
public void onSuccess() {
// 锁定麦位摄像头成功
}
@Override
public void onError(TUICommonDefine.Error error, String message) {
// 锁定麦位摄像头失败
}
});

监听回调

iOS
Android
您可通过调用 addObserver 成为 RTC RoomEngineSDK的观察者,监听麦位相关的回调。
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 RoomEngineSDK的观察者,监听麦位相关的回调。
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;
}
}
}


帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈