视频会议直播中实现Web实时互动白板功能|Demo分享
超级白板功能概述
即构超级白板(ZegoSuperBoard),基于即构亿级海量用户的实时信令网络,提供完整的多人实时在线白板互动协同服务,包括:白板涂鸦、实时轨迹同步、文档共享、文件转码、白板录制与回放、白板与实时音视频同步等多种能力,具备灵活易用、扩展性强、抽象程度高的特点,适用于在线教育、协作办公、游戏娱乐、金融面签等场景。

即构超级白板 SDK 提供以下核心功能:
| 核心功能 | 描述 |
|---|---|
| 互动白板 | 提供丰富的在线白板工具,支持房间多人实时互动。 |
| 文件静态转码 | 支持将 ppt、pptx、doc、pdf、xlsx 等格式文件转换为图片,转换后无动画效果。文件制作规范请参考 文件规范。 |
| 文件动态转码 | 支持将 ppt、pptx 格式文件转换为 HTML5 页面,保留源文件中的动画效果。文件制作规范请参考 文件规范。 |
| 文件共享 | 支持在白板上多端实时同步共享文档内容。 |
超级白板直播SDK概念解释
- ZegoExpress-Video SDK:ZEGO 音视频互动 SDK,能够提供超级白板所需的实时信令传输的能力。超级白板 SDK 必须搭配 实时音视频SDK 使用。
- 超级白板 SDK、ZegoSuperBoard SDK:均指提供 ZEGO 超级白板服务(ZegoSuperBoard) 的 SDK。
- ZegoSuperBoardView:在代码实现过程中,开发者用于展示的白板视图。
- ZegoSuperBoardSubView:ZegoSuperBoardView 的子集,开发者实际创建的 View。ZegoSuperBoardView 会自动呈现最新创建或通过
switchSuperBoardSubView指定的 ZegoSuperBoardSubView。 - 纯白板:指定宽、高和页数创建的白板,用户在指定的白板画布上进行实时绘制。
- 文件白板:基于文件创建的白板,白板宽高和页数由文件决定,实现在文件上绘制图元的业务需求。

实现直播白板互动功能的前提条件
ZegoSuperBoard SDK 需要与 ZegoExpress-Video SDK 搭配使用,请同时集成 ZegoExpress-Video SDK。超级白板 SDK 的压缩包中已经包含 ZegoExpress-Video SDK,无需单独下载。
若之前已集成过 ZegoExpress-Video SDK,请升级到最新版本,避免 SDK 版本不匹配造成初始化失败。
已在 ZEGO 控制台 创建项目,并申请有效的 AppID,详情请参考 控制台 - 项目管理 中的“项目信息”。
已生成 Token,详情请参考 使用 Token 鉴权。也可以参考 控制台 - 项目管理 中的 “项目信息”,在 ZEGO 控制台获取临时 Token(有效期为 24 小时)。
白板的文件共享功能不是默认开启的,使用前请在 ZEGO 控制台 自助开通(开通步骤请参考 项目管理 - 服务配置 中的“文件共享”),或联系 ZEGO 技术支持开通。
集成互动白板SDK的准备环境
在开始集成 ZegoSuperBoard SDK 前,请确保开发环境满足以下要求:
- 准备一台可以连接到互联网的 Windows 或 macOS 计算机。
- 获取摄像头麦克风等行为需运行在 HTTPS 环境下,集成 SDK 之前,请确保最终项目能够运行在 HTTPS 环境下。开发环境下则可先通过本地运行规避,例如 localhost 或 127.0.0.1。
- 使用在线直播互动白板 SDK 支持的浏览器,目前 超级白板SDK 支持的浏览器版本如下:
| 平台 | 浏览器/Webview | 备注 |
|---|---|---|
| Windows | Chrome | 支持 win7 或以上 |
| macOS | Chrome | 支持 macOS 10.10 或以上 |
| iOS | Safari | 支持 iOS 10.0 或以上 |
| iOS | 微信内嵌浏览器 | 支持 iOS 10.0 或以上 |
| Android | Chrome | 支持 Android 8.0 或以上 |
| Android | 微信内嵌浏览器 | 支持 Android 8.0 或以上 |
集成 超级白板SDK
1 下载 在线白板SDK
从即构官网下载 互动白板SDK
请参考 下载 SDK 包,下载最新版本的 SDK,下载完成后进行解压。
npm 下载 直播白板互动 SDK
需要分别下载 ZegoSuperBoard SDK 和 ZegoExpress-Video SDK。
npm i zego-superboard-web
npm i zego-express-engine-webrtc
- 超级白板 2.2.0 及之前版本的 SDK 仅适配 ZegoExpress-Video 2.14.0 及之前的 SDK。
- npm 下载包支持 typescript 语言(推荐)。
- 如果在 macOS 或 Linux 系统中执行 npm 命令失败,提示 “permission denied”,请在 npm 命令前加上 sudo 重新执行即可。
2 导入互动白板SDK
从官网下载的 SDK 可使用 script 直接引入,需要分别导入 ZegoSuperBoard SDK 和 ZegoExpress-Video SDK,其中,“x.x.x” 为 ZegoExpress-Video SDK 的版本号,请参考上一步压缩包解压后的文件名。
<script src="ZegoSuperBoardManagerWeb.js"></script>
<script src="ZegoExpressWebRTC-x.x.x.js"></script>
npm 下载的 互动白板SDK 可使用下面的方法导入。
import { ZegoSuperBoardManager } from 'zego-superboard-web';
import {ZegoExpressEngine} from 'zego-express-engine-webrtc'
// 或
const ZegoSuperBoardManager = require('zego-superboard-web').ZegoSuperBoardManager;
var ZegoExpressEngine = require('zego-express-engine-webrtc').ZegoExpressEngine
实现直播互动白板功能
1 初始化 互动白板SDK
初始化 ZegoExpress-Video SDK
创建 ZegoExpressEngine 引擎实例,将申请到的 AppID 传入参数 “appID”,将接入服务器地址传入参数 “server”。
“server” 为接入服务器地址,获取方式如下:
- 登录 ZEGO 控制台。
- 在对应项目下单击“查看”。
- 弹出基本信息后单击“环境配置”下的“查看”按钮。
- 在弹窗中的“集成的SDK”中选择 “Express” 后,再选择 “Web” 平台便可获取对应的接入服务器地址。
// 初始化实例
const zg = new ZegoExpressEngine(appID, server);
初始化 即构超级互动白板SDK ZegoSuperBoard SDK
- 使用
ZegoSuperBoardManager的getInstance方法获取 ZegoSuperBoard 实例。 - 使用 ZegoSuperBoard 实例的
init方法初始化 ZegoSuperBoard SDK,这里需要传入 ZegoExpressEngine 的引擎实例。
初始化 即构互动白板 SDK 需要用于验证身份的 Token,其获取方式请参考 用户权限控制 中的 “4.1 生成 Token”。
文件共享在验证身份时不校验 “RoomId” 参数,开发者在生成 Token 的过程中,可将 “RoomId” 参数设置为空字符串。
<!-- 需要挂载的父容器 -->
<div id="parentDomID"></div>
// 获取 ZegoSuperBoard 实例
zegoSuperBoard = ZegoSuperBoardManager.getInstance();
// 初始化 ZegoSuperBoard,成功则 result 返回 true
const result = await zegoSuperBoard.init(zg, {
parentDomID: 'parentDomID', // 需要挂载的父容器 ID
appID: 0, // 申请到的 AppID
userID: '', // 用户自定义生成的用户 ID
token: '' // 登录房间需要用于验证身份的 Token
});
请初始化 ZegoExpress-Video SDK 和 ZegoSuperBoard SDK 成功之后,再调用登录房间接口。
2 互动白板SDK监听事件回调
根据实际应用需要,在初始化 SuperBoard 后监听想要关注的事件回调,比如错误提醒、远端新增白板文件、远端删除白板文件、远端切换白板文件等。
SuperBoard 自动实现了多端同步能力,远端通知回调内只需刷新本地UI逻辑即可。
on: 注册回调事件,通过 event 指定监听事件名。
// 常用的 SuperBoard 相关回调
// SuperBoard 自动实现了多端同步能力,远端通知回调内只需刷新本地UI逻辑即可。
// 监听错误回调,SDK 内部错误均通过此回调抛出,除了直接在接口中直接返回的错误外
zegoSuperBoard.on('error', function(errorData) {
// 错误码,错误提示语
conosole.log(errorData.code, errorData.message)
});
// 监听白板翻页、滚动
zegoSuperBoard.on('superBoardSubViewScrollChanged', function(uniqueID, page, step) {
});
// 监听远端白板缩放
zegoSuperBoard.on('superBoardSubViewScaleChanged', function(uniqueID, scale) {
});
// 监听远端新增白板
zegoSuperBoard.on('remoteSuperBoardSubViewAdded', function(uniqueID) {
});
// 监听远端销毁白板
zegoSuperBoard.on('remoteSuperBoardSubViewRemoved', function(uniqueID) {
});
// 监听远端切换白板
zegoSuperBoard.on('remoteSuperBoardSubViewSwitched', function(uniqueID) {
});
// 监听远端切换 Excel Sheet
zegoSuperBoard.on('remoteSuperBoardSubViewExcelSwitched', function(uniqueID, sheetIndex) {
});
// 监听远端白板权限变更
zegoSuperBoard.on('remoteSuperBoardAuthChanged', function(data) {
console.log(data.scale, data.scroll)
});
// 监听远端白板图元权限变更
zegoSuperBoard.on('remoteSuperBoardGraphicAuthChanged', function(data) {
console.log(data.create, data.delete, data.move, data.update, data.clear)
});
3 直播白板-登录房间
1. 获取登录 Token
调用 ZegoExpressEngine 的 loginRoom 接口登录房间。登录时,请传入本文 前提条件 所获取到的 Token 进行鉴权。
注意:临时 Token 仅供调试,正式上线时,请从开发者的业务服务器生成 token,详情可参考 使用 Token 鉴权。如果 Token 错误,请参考 错误码 文档中的 1002067 和 1003072 排查问题。
2. 登录房间
调用 loginRoom 接口,传入房间 ID 参数 “roomID”、“token” 和用户参数 “user”,根据实际情况传入参数 “config”,登录房间。
- 在登录房间之前,请先注册登录房间后需要监听的所有回调。成功登录房间后,即可接收相关的回调。
- “roomID”、“userID” 和 “userName” 参数的取值都为自定义。
- “roomID” 和 “userID” 都必须唯一,建议开发者将 “userID” 设置为一个有意义的值,可将其与自己的业务账号系统进行关联。
// 登录房间,成功则返回 true
// userUpdate 设置为 true 才能收到 roomUserUpdate 回调。
let userID = Util.getBrow() + '_' + new Date().getTime();
let userName = "user0001";
let roomID = "0001";
let token = ;
// 为避免错过任何通知,您需要在登录房间前先监听用户加入/退出房间、房间连接状态变更、推流状态变更等回调。
zg.on('roomStateChanged', async (roomID, reason, errorCode, extendedData) => {
})
zg.loginRoom(roomID, token, { userID, userName: userID }, { userUpdate: true }).then(result => {
if (result == true) {
console.log("login success")
}
});
4 超级白板-创建白板功能
超级白板支持创建纯白板和文件白板。
- 纯白板:指定宽、高和页数创建的白板,用户在指定的白板画布上进行实时绘制。
- 文件白板:基于文件创建的白板,白板宽高和页数由文件决定,实现在文件上绘制图元的业务需求。
创建白板前需要保证登录成功,即登录房间返回 true 后才可创建白板。
- 创建纯白板
// 上一步的登录房间成功,返回 true 后才可创建白板
const model = await zegoSuperBoard.createWhiteboardView({
name: '', // 白板名称
perPageWidth: 1600, // 白板每页宽度
perPageHeight: 900, // 白板每页高度
pageCount: 5 // 白板页数
});
- 创建文件白板
创建文件白板前需要先获取文件的 fileID,可参考 共享文件管理 进行上传。
// 上一步的登录房间成功,返回 true 后才可创建白板
const model = await zegoSuperBoard.createFileView({
fileID // 文件的 fileID,在上传文件成功后返回的唯一文件标识
});
- 一个房间内最多可创建 50 个白板,房间内已存在 50 个白板时再创建白板会失败。
- 请通过
querySuperBoardSubViewList获取房间内当前的白板数量。
5 挂载当前在线白板
- 客户端加入房间时房间内已有白板存在时,因为 ZegoSuperBoard SDK 无法得知 parentDomID 对应的父容器是否已经存在,所以无法主动挂载当前白板到父容器上。
- 进房成功后,一定要在 parentDomID 对应的父容器存在(物理像素宽高不为0)后,按照以下步骤,先调用
querySuperBoardSubViewList接口通知 ZegoSuperBoard SDK 当前白板容器已经存在,并通过switchSuperBoardSubView接口挂载当前白板到父容器上
// 获取 SuperBoardSubViewList
const superBoardSubViewList = await zegoSuperBoard.querySuperBoardSubViewList();
// 获取 SuperBoardView
const superBoardView = zegoSuperBoard.getSuperBoardView();
// 获取当前 SuperBoardSubView
const zegoSuperBoardSubView = superBoardView.getCurrentSuperBoardSubView()
// 获取 SuperBoardSubView 对应 model
const model = zegoSuperBoardSubView.getModel();
// 获取当前需要挂载白板的 uniqueID
const uniqueID = model.uniqueID;
// 判断文件类型,如果是 Excel 白板,需要先获取到 sheetIndex
let sheetIndex;
const fileType = model.fileType;
if (fileType === 4) {
// Excel 白板
const sheetName = zegoSuperBoardSubView.getCurrentSheetName();
// 获取当前 Excel 对应的 Sheet 列表
const zegoExcelSheetNameList = zegoSuperBoardSubView.getExcelSheetNameList();
// 通过 sheetName 从 zegoExcelSheetNameList 中获取到对应的 sheetIndex
sheetIndex = zegoExcelSheetNameList.findIndex(function(element, index) {
return element === sheetName;
});
}
// 挂载当前白板
const result = await superBoardView.switchSuperBoardSubView(uniqueID, sheetIndex);
6 验证在线白板的创建
运行上述项目的多个实例,登录同一房间ID。用鼠标在任一窗口的 ZegoSuperBoardView 的范围内按下移动,即可看到涂鸦效果展示在各个窗口的 ZegoSuperBoardView 上。
7 销毁互动白板SDK
// 销毁后SDK内部会自动切换到另外一个白板。展示的白板为销毁白板的上一个
const result = await zegoSuperBoard.destroySuperBoardSubView(uniqueID)
获取 互动白板SDK 更多支持
获取本文直播白板sdk的开发文档、技术支持、Demo体验,访问即构文档中心,实现视频会议直播中的实时白板互动/共享。
近期有开发规划的开发者可上即构官网查看,恰逢即构七周年全线音视频产品1折的优惠,联系商务获取产品优惠;
视频会议直播中实现Web实时互动白板功能|Demo分享的更多相关文章
- H5 EventSource 实现web页面推送功能demo
/** * H5 EventSource 实现web页面推送功能demo */ var serverData,statusDiv; var SERVER_URL = "index.php&q ...
- 声网发布教育新品:灵动课堂全球覆盖学生超400万,互动白板首创H5课件
3月31日,全球实时互动云服务商声网Agora在北京举行教育产品发布会,正式发布教育行业首款aPaaS产品"灵动课堂",和首个支持H5课件的白板PaaS产品"互动白板&q ...
- 腾讯互动白板+即时通讯+实时音视频,Android学生端接入
腾讯互动白板+即时通讯+实时音视频,Android学生端接入 一.简介 线上教学方案:腾讯云互动白板(Tencent Interactive Whiteboard,TIW)+即时通信(Instant ...
- 声网 VQA:将实时互动中未知的视频画质用户主观体验变可知
在实时互动场景中,视频画质是影响观众体验的关键指标,但如何实时评价视频的画质一直是个行业难题,需要将未知的视频画质用户主观体验变成可知. 未知的部分往往是最需要攻克的,声网也一直在持续探索符合实时互动 ...
- GoEasy实现web实时推送过程中的自动补发功能
熟悉GoEasy推送的朋友都知道GoEasy推送实现web实时推送并且能够非常准确稳定地将信息推送到客户端.在后台功能中查看接收信息详情时,可有谁注意到有时候在发送记录里有一个红色的R标志?R又代表的 ...
- Qcon 实时音视频专场:实时互动的最佳实践与未来展望
互动直播.线上会议.在线医疗和在线教育是实时音视频技术应用的重要场景,而这些场景对高可用.高可靠.低延时有着苛刻的要求,很多团队在音视频产品开发过程中会遇到各种各样的问题.例如:流畅性,如果在视频过程 ...
- 带你了解S12直播中的“黑科技”
摘要:让精彩更流畅.让较量更清晰.让参与更沉浸.让体验更有趣,幕后的舞台,从来都是技术的战场,S12背后的名场面同样场场高能. 本文分享自华为云社区<用硬核方式打开S12名场面>,作者:华 ...
- 常见的Web实时消息交互方式和SignalR
标签: WebSocket SignalR 前言 1. Web消息交互技术 1.1 常见技术 1.2 WebSocket介绍 1.3 WebSocket示例 2. Signal 2.1 SignalR ...
- TogetherJS – 酷!在网站中添加在线实时协作功能
TogetherJS是一个免费.开源的 JavaScript 库,来自 Mozilla 实验室,可以实现基于 Web 的在线协作功能.把 TogetherJS 添加到您的网站中,您的用户可以在实时的互 ...
- WEB 实时推送技术的总结
前言 随着 Web 的发展,用户对于 Web 的实时推送要求也越来越高 ,比如,工业运行监控.Web 在线通讯.即时报价系统.在线游戏等,都需要将后台发生的变化主动地.实时地传送到浏览器端,而不需要用 ...
随机推荐
- 2、Java语言基础知识
数据类型及范围 四种:整型(byte,short,int,long).浮点型(float,double).字符型(char).布尔型(true,false) 类型 byte short int lon ...
- HarmonyOS 实战:给笔记应用加防截图水印
最近在做笔记类应用时,遇到一个头疼的需求:防止用户内容被非法截图传播.思来想去,加水印是个直接有效的方案.研究了 HarmonyOS 的开发文档后,发现用 Canvas 配合布局组件能轻松实现动态水印 ...
- Spring扩展接口-初始化(@PostConstruct,afterPropertiesset, init-method)
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- Java集合源码--ArrayList的可视化操作过程
关于ArrayList的元素插入.检索.修改.删除.扩容等可视化操作过程 还有关于ArrayList的迭代器.线程安全和时间复杂度 1. 底层数据结构 基于动态数组实现,内部维护一个Object[]数 ...
- Vue前端开发 转 React 指南
JSX 先介绍 React 唯一的一个语法糖:JSX. 理解 JSX 语法并不困难,简单记住一句话,遇到 {} 符号内部解析为 JS 代码,遇到成对的 <> 符号内部解析为 HTML 代码 ...
- 题解:P1032 [NOIP 2002 提高组] 字串变换
题目链接:link. 为了高效地解决这道题目,我们考虑使用双向搜索解决. 我们从 \(A\) 和 \(B\) 同时开始搜索,要是中间有相遇,那么就说明 \(A\) 能变成 \(B\) 这样我们就结束搜 ...
- ChatMoney,分析梦境的大师
本文由 ChatMoney团队出品 作为一个爱幻想爱做白日梦的 i人,我常常就在想,什么时候能利用Al来帮助我找回一些被遗忘的.或者模糊不清的记忆? 有没有可能进入别人的梦境里瞧一瞧? 为什么世界上还 ...
- DBA 必知必会 —— OB 4.x 版本如何查询磁盘空间占用情况?
首先为大家推荐这个 OceanBase 开源负责人老纪的公众号 "老纪的技术唠嗑局",会持续更新和 #数据库.#AI.#技术架构 相关的各种技术内容.欢迎感兴趣的朋友们关注! 这是 ...
- Java集合框架性能特征与使用场景深度解析
Java 集合框架的性能优化与场景适配是高级程序员面试的核心考点.本文聚焦线性集合.集合.映射等核心组件的性能指标(时间复杂度.空间开销)与适用场景,结合 JDK 演进特性与工程实践,构建系统化知识体 ...
- C#.Net筑基-泛型T & 协变逆变
01.什么是泛型? 泛型(Generics)是C#中的一种强大的强类型扩展机制,在申明时用"占位符"类型参数"T"定义一个"模板类型",比较 ...