你可以在白板客户端上传文档并在白板房间中展示。本文介绍如何使用客户端 SDK 为你的应用添加文档上传和展示功能。
对照动态转码文件要求检查文件,以确保动态文档转码任务顺利执行。
你可以根据应用场景的实际需要,灵活选择文档上传中发起文件转码任务和客户端使用转码结果的实现方式。
你只需要在文件上传端实现以上步骤,房间内的其他用户端将自动同步展示。

| Android | iOS | |
|---|---|---|
| 静态转码 | PageInfo | pageInfos |
| 动态转码 | PPTInfo | ByteWhiteBoardPptInfo |
| Android | iOS | |
|---|---|---|
| 静态转码 | createWhiteBoard | createWhiteBoard:pageInfo:backgroundInfo:boardName: |
| 动态转码 | createFileWhiteBoard | createFileWhiteBoard:boardName:pptInfo: |

// 发起静态转码
const transcodeRes = await whiteboardRoom.createTranscodeTask({
app_id: 'xx',
resource: 'your-ppt-url',
resource_attr: {
file_name: '文件名称',
size: '文件大小',
},
operator: 'userId',
transcode_mode: TranscodeMode.static,
storage_config: {
type: StorageType.Tos,
tos_config: {
account_id: accountId,
bucket,
},
},
onProgress: (transcodePercent: number, transcodeStatus: TaskStatus, task_id: string) => {
// 业务逻辑,展示进度
},
});
// 创建白板
const { images } = transcodeRes;
const pageInfoList = images.map((i) => {
return {
pageId: String(i.page_id),
bkInfo: {
bkColor: '',
bkImage: i.img,
bkImageFillType: BkFillType.kCenter,
},
};
});
whiteboardRoom.createWhiteBoard({ pages: pageInfoList });
// 监听白板创建成功
whiteBoardRoom.on( WhiteBoardRoomEventsTypes.onCurrentWhiteBoardChanged, ({ userId, boardId, whiteBoard }) => {
bindWhiteBoardEvent(whiteBoard);
});
// 处理事件
const bindWhiteBoardEvent = (whiteBoard: IWhiteBoard) => {
whiteBoard.on(WhiteBoardEventsTypes.onError, e => {});
};
javascript// 转码文件
const transcodeRes = await whiteboardRoom.createTranscodeTask({
app_id: 'xx',
resource: 'your-ppt-url',
resource_attr: {
file_name: '文件名称',
size: '文件大小',
},
operator: 'userId',
transcode_mode: TranscodeMode.dynamic,
onProgress: (transcodePercent: number, transcodeStatus: TaskStatus, task_id: string) => {
// 业务逻辑,展示进度
},
});
// 创建白板
const { file_id } = transcodeRes;
const baseName = file.name.replace(/\.pptx?/, '');
whiteboardRoom.createFileWhiteBoard({
boardName: baseName,
pptInfo: {
fileId: file_id,
title: file.name,
customArgs: 'your-info',
},
});
// 监听白板创建成功
whiteBoardRoom.on( WhiteBoardRoomEventsTypes.onCurrentWhiteBoardChanged, ({ userId, boardId, whiteBoard }) => {
bindWhiteBoardEvent(whiteBoard);
});
// 处理事件
const bindWhiteBoardEvent = (whiteBoard: IWhiteBoard) => {
whiteBoard.on(WhiteBoardEventsTypes.onError, e => {});
};
javascript小程序端仅支持展示静态转码结果。
Page({
async handleCreate() {
// 微信文档 https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.chooseMessageFile.html
const res = await wx.chooseMessageFile({
count: 1,
extension: ['pdf', 'doc', 'docx', 'ppt', 'pptx'],
type: 'file',
});
const url = await new Promise((resolve, reject) => {
// 微信文档 https://developers.weixin.qq.com/miniprogram/dev/api/network/upload/wx.uploadFile.html
wx.uploadFile({
name: 'file',
filePath: res.tempFiles[0].path,
url: UPLOAD_SERVER_URL,
success: result => {
resolve(result)
},
fail: reject,
});
});
const transcodeRes = await this.room.createTranscodeTask({
app_id: APPID,
resource: URL,
operator: USERID,
transcode_config: {
input_format: VolcMiniappWhiteboardSdk.InputFormat.pdf,
output_format: VolcMiniappWhiteboardSdk.OutputFormat.png,
output_width: 1200,
output_height: 900,
thumbnail: false,
},
storage_config: {
type: VolcMiniappWhiteboardSdk.StorageType.Tos,
tos_config: {
account_id: TOS_ACCOUNT_ID,
bucket: TOS_BUCKET,
},
},
});
const pages = transcodeRes.images.map((img, idx) => ({
pageId: `${img.page_id === undefined ? idx + 1 : img.page_id}`,
bkInfo: {
bkImage: img.img,
},
}));
javascript将以下示例代码加入到 room.js 的 handleCreate() 中。
await this.room.createWhiteBoard({
pages,
});
javascript你可以通过调用客户端接口,对包含音频、视频和动画步骤的文档进行交互控制。
交互是指用户的触控或鼠标点击事件驱动 PPT 动画进入下一步、翻页和音视频播放、暂停等。
| Android | iOS | Web | |
|---|---|---|---|
| 获取 PPT 信息 | getPptInfo | getPptInfo: | getPptInfo |
| 获取 PPT 动画步数 | getPptStepCount | getPptStepCount: | getPptStepCount |
| 获取 PPT 当前动画步数 | getPptCurrentStep | getPptCurrentStep: | getPptCurrentStep |
| 下一个 PPT 动画 | pptNextStep | pptNextStep | pptNextStep |
| 上一个 PPT 动画 | pptPrevStep | pptPrevStep | pptPrevStep |
| PPT 动画改变回调 | onPptStepChanged | byteWhiteBoard:onPptStepChanged:currentStep:totalStep:currentPageIndex: | onPptStepChanged |