概述
本文档面向希望构建定制化在线互动课堂产品的前端开发者,介绍腾讯云实时互动-教育版 无 UI SDK 的接入方式。
SDK 封装了音视频通信、课堂管理、成员管理、课件白板等底层能力,并以响应式状态驱动数据与时间、灵活简便的方法调用提供能力。您只需关注 UI 层的实现,即可快速完成在线互动课堂的集成开发。
AI 辅助开发:
为简化并加速接入,我们还提供 AI Skill 辅助,您可以使用主流 AI 编码工具(Cursor / Claude / Copilot 等),通过 Vibe Coding 方式最快速度完成项目开发。AI 辅助开发文档
npx skills add InteractiveClassroom/skills --skill tcic-sdk-helper
前提条件
已完成 接入准备,了解如何获取
schoolId、classId、userId、token。Node.js >= 16。
支持 ES Module 的现代浏览器(Chrome 85+ / Edge 86+ / Safari 15+ / Firefox 80+)。
目前暂仅支持 Web 浏览器项目, Electron 及 移动端 Mobile Native 接入将于后期提供扩展。
安装
npm install @tencent-classroom/sdk# 或pnpm add @tencent-classroom/sdk
课堂生命周期
SDK 的核心调用流程如下:

基本使用流程
步骤1:创建实例
import { TencentClassroom, TEvent, StreamType } from '@tencent-classroom/sdk';const classroom = new TencentClassroom({language: 'zh-CN',board: {domId: 'board-container', // 白板挂载容器(不需要白板可去掉)},});
步骤2:初始化
const initResult = await classroom.init();if (!initResult.ok) {console.error('初始化失败:', initResult.message);return;}
步骤3:注册事件监听
说明:
classroom.on(TEvent.KICK_OUT, ({ message }) => {alert(message); // 被踢出课堂});classroom.on(TEvent.CLASS_END, () => {// 课堂结束});
步骤4:加入课堂
// classId / userId / token 通过接入准备文档获取const joinResult = await classroom.joinClass({classId: 123456789,userId: 'user_001',token: 'your-token',});if (!joinResult.ok) {console.error('进房失败:', joinResult.message);return;}
步骤5:音视频推流
// 开启摄像头(传入本地预览 DOM)await classroom.startCamera(document.getElementById('local-video')!);// 开启麦克风await classroom.startMicrophone();
注意:
学生角色必须上台后(
stageStatus$ = 'active')才能推流。步骤6:远端流渲染
const bindings = new Map();classroom.state.stageList$.subscribe((stageMembers) => {const currentIds = new Set(stageMembers.map(m => m.userId));// 解绑已下台成员for (const [userId, binding] of bindings) {if (!currentIds.has(userId)) {classroom.unbindRemoteView(binding);bindings.delete(userId);}}// 绑定新上台成员for (const member of stageMembers) {if (member.userId === myUserId) continue; // 跳过自己if (bindings.has(member.userId)) continue;const dom = document.getElementById(`video-${member.userId}`);const binding = classroom.bindRemoteView(member.userId, dom, StreamType.Camera);bindings.set(member.userId, binding);}});
步骤7:离开课堂
// 解绑所有远端流for (const [, binding] of bindings) {classroom.unbindRemoteView(binding);}// 离房 + 销毁(两者都必须调用)await classroom.leaveClass();await classroom.destroy();
各角色接入要点
老师(Teacher)
步骤 | 操作 |
加入课堂 | joinClass({ role: 'teacher' }) |
开启音视频 | startCamera() + startMicrophone()(自动上台) |
开始上课 | startClass() |
课中管理 | muteAudioAll() / setSilenceMode() / memberAction() |
结束上课 | endClass() |
退出 | leaveClass() → destroy() |
学生(Student)
步骤 | 操作 |
加入课堂 | joinClass({ role: 'student' }) |
等待开课 | |
观看远端流 | bindRemoteView(teacherId, DOM, StreamType.Camera) |
举手连麦 | handUp() → 等待老师同意 |
上台推流 | |
退出 | leaveClass() → destroy() |
助教(Assistant)
与老师相同管理权限,默认在台上。
可直接开启音视频,可执行成员管理操作。
巡课(Supervisor)
只读模式:可观看音视频、查看白板、浏览花名册。
不可发消息、不可操作成员、不出现在成员列表中。
互动消息聊天
// 发送文本消息await classroom.sendTextMessage('Hello');// 订阅消息列表classroom.state.messageList$.subscribe((messages) => {renderChatList(messages);});
互动白板及课件
在构造实例时配置白板容器,进房后自动初始化:
const classroom = new TencentClassroom({board: {domId: 'board-container',ratio: '16:9',},});
国际化
SDK 内置 9 种语言支持:
const classroom = new TencentClassroom({language: 'en', // zh-CN | zh-TW | en | ja | ko | vi | ar | id | es});
完整示例
import { TencentClassroom, TEvent, StreamType } from '@tencent-classroom/sdk';async function main() {const classroom = new TencentClassroom({language: 'zh-CN',board: { domId: 'board-container' },});const initResult = await classroom.init();if (!initResult.ok) return console.error(initResult.message);// 注册事件(进房前)classroom.on(TEvent.KICK_OUT, ({ message }) => alert(message));// 进房(参数通过接入准备文档获取)const joinResult = await classroom.joinClass({classId: 123456789,userId: 'user_001',token: 'your-token',});if (!joinResult.ok) return console.error(joinResult.message);// 开启音视频await classroom.startCamera(document.getElementById('local-video')!);await classroom.startMicrophone();// 渲染远端流const binding = classroom.bindRemoteView('teacher_001',document.getElementById('remote-video')!,StreamType.Camera,);// 页面卸载时清理window.addEventListener('beforeunload', async () => {classroom.unbindRemoteView(binding);await classroom.leaveClass();await classroom.destroy();});}main();
打包部署
开发完成后,您可以将项目编译打包并部署到自己的 Web 服务器上运行。