本篇文档旨在指导开发者在标准会议无 UI 集成方案中实现云端录制能力。您可以通过
RoomStore 提供的 startRecording() / stopRecording() 控制录制的发起与停止,并通过 currentRoom.recordingInfo 与 RoomListener 实时监听录制状态变化。版本说明:
云端录制接口(
startRecording / stopRecording)自 rtc_room_engine 和 atomicx-core 的 4.2.3.74 版本起支持,请确认您使用的版本满足要求。前提条件
用户已通过
LoginStore 完成登录鉴权,请参考 接入概览。用户已通过
RoomStore 进入标准会议房间,请参考 房间管理。已完成云端录制套餐开通及存储配置:
购买含云录制能力的视频会议 SDK 套餐。
提交工单,选择实时音视频产品,申请为您的 SDKAppID 配置云端录制存储信息。
录制效果
视频会议 SDK 默认采用合流录制模式,将房间内发布的音视频流混合为一份完整的录制文件。录制布局会随会中状态自动切换,切换过程中不重启录制任务:
会中状态 | 混流布局 | 画面数量上限 |
无屏幕分享 / 白板 | 九宫格布局 | 最多 25 路视频画面 |
有屏幕分享 / 白板 | 屏幕分享布局(共享为主画面) | 最多 1 路屏幕分享 + 16 路视频画面 |
仅音频 | - | - |
接口说明
视频会议 SDK 无 UI 集成通过
RoomStore 提供录制控制与状态订阅能力,录制任务由服务端全程托管,客户端仅负责发起与停止。类型 | 名称 | 说明 |
方法 | startRecording() | 发起云端录制。仅房主或管理员可调用,须在进房成功后调用。 |
方法 | stopRecording() | 停止云端录制。仅房主或管理员可调用。 |
状态 | currentRoom.recordingInfo | 当前房间的录制信息,含 status 字段( RecordingStatus.RECORDING 表示录制中)。 |
事件 | RoomListener.onRecordingStarted | 录制任务启动成功时触发,回调参数为 (roomInfo, operator)。 |
事件 | RoomListener.onRecordingStopped | 录制任务停止时触发,回调参数为 (roomInfo, operator, reason) 可区分主动停止与异常中断。 |
步骤1:发起云端录制
权限要求
仅房主或管理员可调用
startRecording(),其他角色调用将抛出权限错误。同一房间内同时只能存在一个录制任务,重复调用也会返回错误。示例代码
import android.util.Logimport io.trtc.tuikit.atomicxcore.api.CompletionHandlerimport io.trtc.tuikit.atomicxcore.api.room.RoomStoreprivate fun startRecording() {RoomStore.shared().startRecording(completion = object : CompletionHandler {override fun onSuccess() {Log.i("TAG", "录制成功")}override fun onFailure(code: Int, desc: String) {Log.i("TAG","录制失败:code=$code,desc=$desc")}})}
错误处理
startRecording() 调用失败时会抛出错误,常见错误情况如下:错误码 | 含义 | 处理建议 |
100001 | 后端系统错误。 | 稍后重试;若持续出现,请提交工单排查。 |
100004 | 房间不存在。 | 确认已通过 createAndJoinRoom() 或 joinRoom() 进房成功后再调用录制接口。 |
100006 | 没有权限,必须是房主或管理员。 | 检查当前用户角色,仅房主或管理员可发起录制。 |
101072 | 录制配置不存在或未启用。 |
import android.util.Logimport io.trtc.tuikit.atomicxcore.api.CompletionHandlerimport io.trtc.tuikit.atomicxcore.api.room.RoomStoreprivate fun startRecording() {RoomStore.shared().startRecording(completion = object : CompletionHandler {override fun onSuccess() {Log.i("TAG", "录制成功")}override fun onFailure(code: Int, desc: String) {when (code) {100001 -> Log.e("TAG", "后端系统错误,请稍后重试。")100004 -> Log.e("TAG", "房间不存在,请确认已进房后再发起录制。")100006 -> Log.e("TAG", "权限不足,仅房主或管理员可发起录制")101072 -> Log.e("TAG", "录制配置不存在或未启用,请检查控制台开通配置。")else -> Log.e("TAG", "发起录制失败:")}}})}
步骤2:停止云端录制
前置条件
当前房间内有进行中的录制任务(
RecordingStatus.RECORDING)。权限要求
仅房主或管理员可调用
stopRecording()。示例代码
import android.util.Logimport io.trtc.tuikit.atomicxcore.api.CompletionHandlerimport io.trtc.tuikit.atomicxcore.api.room.RoomStoreprivate fun stopRecording() {RoomStore.shared().stopRecording(object : CompletionHandler {override fun onSuccess() {Log.i("TAG", "停止录制成功")}override fun onFailure(code: Int, desc: String) {Log.i("TAG", "停止录制失败:code=$code,desc=$desc")}})}
步骤3:监听录制状态变化
前置条件
已进房成功。
建议在进房前先订阅事件,避免遗漏由其他端(例如移动端房主)发起的录制通知。
示例代码
import android.util.Logimport io.trtc.tuikit.atomicxcore.api.room.RecordingStatusimport io.trtc.tuikit.atomicxcore.api.room.RecordingStopReasonimport io.trtc.tuikit.atomicxcore.api.room.RoomInfoimport io.trtc.tuikit.atomicxcore.api.room.RoomListenerimport io.trtc.tuikit.atomicxcore.api.room.RoomStoreimport io.trtc.tuikit.atomicxcore.api.room.RoomUserprivate fun observeRecordingState() {val roomStore = RoomStore.shared()// 主动查询当前录制状态val currentRoom = roomStore.state.currentRoom.valueval isRecording = currentRoom?.recordingInfo?.status == RecordingStatus.RECORDING// 监听录制事件roomStore.addRoomListener(object : RoomListener() {override fun onRecordingStarted(roomInfo: RoomInfo, operator: RoomUser) {Log.i("TAG", "录制已开始,操作人:${operator.userID}")}override fun onRecordingStopped(roomInfo: RoomInfo,operator: RoomUser,reason: RecordingStopReason) {when (reason) {RecordingStopReason.STOPPED_BY_USER -> {Log.i("TAG", "录制已停止,操作人:${operator.userID}")}RecordingStopReason.RECORDER_LEFT_ROOM -> {Log.w("TAG", "录制异常中断,录制机器人已退出房间,请视需要重新发起录制。")}}}})}
错误情况
onRecordingStopped 事件的 reason 字段标识录制停止原因:枚举值 | 说明 |
STOPPED_BY_USER | 房主或管理员主动调用 stopRecording() 正常停止。 |
RECORDER_LEFT_ROOM | 录制机器人异常退出房间,录制中断。建议提示用户并视业务需要决定是否重新发起录制。 |