通过 Web 上传 SDK,您可以上传本地视频或图片、管理视频封面,并创建和更新点播间,快速完成企业直播媒资接入。本文档介绍如何集成 Web 上传 SDK 并使用 Web 上传 SDK 完成上述功能。
Web 上传 SDK 需要使用临时 token 进行初始化,您可以借助火山引擎的 STS (Security Token Service) 服务来获取。
具体流程如下:您的服务端使用一个具有固定权限的子账号(拥有永久 AK/SK)调用 AssumeRole 接口,获取一个有权限和时间限制的临时安全凭证(临时 AK/SK + SessionToken),然后将该凭证下发给前端的上传 SDK 使用。
创建子账号前,您需先创建一个具有企业直播管理员(LiveSaaSFullAccess)权限的角色。
说明
此处可以授予角色较高的管理员权限。后续在调用AssumeRole 接口时,您可以再进行精细化的最小权限配置,从而降低后续该角色可能需因添加权限而带来的运维成本。
livesaas_videoroom,然后单击下一步。LiveSaaSFullAccess 策略并勾选。然后单击提交。livesaas_videoroom 角色名,进入角色详情。创建一个具有企业直播管理员权限(LiveSaaSFullAccess)和 STS 角色扮演(STSAssumeRoleAccess)权限的子账号,用于调用 AssumeRole 接口。
Videoroom,勾选编程访问,然后单击下一步。LiveSaaSFullAccess 和 STSAssumeRoleAccess 策略,然后单击下一步。AssumeRole 接口。AssumeRole 接口获取临时凭证 使用步骤二中创建的子账号 AK/SK,调用 AssumeRole 接口,获取临时凭证的 AccessKeyId、SecretAccessKey 和 SessionToken。接口文档请参考 AssumeRole API 文档。
为遵循“最小权限原则”,建议您在调用 AssumeRole 接口时,通过 Policy 参数精细化地限制临时凭证的权限。以下代码示例展示通过 assumeRoleRequest.setPolicy 设置的集成 Web 上传 SDK 所需的最小权限配置。
/** * Example Code generated by Beijing Volcanoengine Technology. */ package com.volcengine.sample; import com.volcengine.ApiClient; import com.volcengine.ApiException; import com.volcengine.sign.Credentials; import com.volcengine.sts.StsApi; import com.volcengine.sts.model.*; public class TestAssumeRole { public static void main(String[] args) throws Exception { String ak = "Your AK"; // 填入步骤二获取的子账号的 AK String sk = "Your SK"; // 填入步骤二获取的子账号的 SK String region = "cn-beijing"; ApiClient apiClient = new ApiClient() .setCredentials(Credentials.getCredentials(ak, sk)) .setRegion(region); StsApi api = new StsApi(apiClient); AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest(); assumeRoleRequest.setDurationSeconds(3600); // 临时密钥有效时长,单位为秒。默认为 3600 秒 assumeRoleRequest.setPolicy("{\"Statement\":[{\"Effect\":\"Allow\",\"Action\":[\"livesaas:GetUploadTokenSDK\",\"livesaas:UploadActivityMediaSDK\",\"livesaas:CheckSpaceActivityMediaSDK\",\"livesaas:UpdateMediaCoverImageSDK\",\"livesaas:CreateVideoRoomConsole\",\"livesaas:ListActivityMedia\",\"livesaas:UploadMedia\",\"livesaas:ListActivityMedias\",\"livesaas:UpdateActivityMediaOnlineStatus\"],\"Resource\":[\"*\"],\"Condition\":{\"StringEquals\":{\"volc:RequestedRegion\":[\"cn-beijing\"]}}}]}"); // 最小权限配置 assumeRoleRequest.setRoleSessionName("a"); // 角色会话名称,用于区分会话 assumeRoleRequest.setRoleTrn("trn:iam::2100xxxxxx:role/livesaas_videoroom"); // 传入步骤一获取的角色 TRN 值 try { // 复制代码运行示例,请自行打印API返回值。 api.assumeRole(assumeRoleRequest); } catch (ApiException e) { // 复制代码运行示例,请自行打印API错误信息。 // System.out.println(e.getResponseBody()); } } }
AssumeRole 接口成功调用后,您的后端服务会获取到一个包含临时凭证的结果,包括 AccessKeyId、SecretAccessKey 和 SessionToken。请确保前端最终传入 SDK 的临时凭证符合如下 JSON 结构。
{ userToken: { AccessKeyId: Result.Credentials.AccessKeyId, SecretAccessKey: Result.Credentials.SecretAccessKey, SessionToken: Result.Credentials.SessionToken, } }
您可以根据现有业务架构,选择以下任一方式完成适配:
AssumeRole 返回结果中提取临时凭证信息,并按照上述结构重新封装返回,前端无需改造。AssumeRole 的原始结果,由前端提取相应字段并组装为上述结构后传入 SDK。参考以下步骤,将上传 SDK 集成到您的 Web 应用中。
在您项目的 .html 文件中添加以下代码引入 SDK。
<script src="https://unpkg.byted-static.com/byted/byte-live-console-uploader/1.0.1/dist/index.min.js"></script>
创建 uploader 实例,初始化 SDK。示例代码如下:
let uploader document.getElementById('test').addEventListener('change', async function () { const fileList = this.files; // 从服务端获取用户 token const data = await (await fetch(`http://127.0.0.1:3000`, { mode: 'cors' })).json() // 创建 uploader 实例 uploader = new ByteConsoleTools.Uploader({ userId: "210020****", region: "cn-north-1", service: "iframeTest", videoConfig: { spaceName: "livesaas-new", processAction: [ { name: "GetMeta", }, ] }, // 包含 AccessKeyId、SecretAccessKey 和 SessionToken 的对象 userToken: data.userToken, }); // 上传前检查,详情参考下文 uploader.initCheck({ file: fileList, type: 'video', }).then(fileKey => { console.log(fileKey); }).catch(e => { console.log(e) }) });
创建 uploader 实例时,您需要设置以下参数:
名称 | 类型 | 是否必选 | 默认值 | 描述 |
|---|---|---|---|---|
userId | String | 是 | 不适用 | 账号 ID。获取方式详见步骤二:新建子账号,并获取其 AK/SK 和 ID。 |
region | String | 是 | 不适用 | 上传地区。您需将此参数设为 |
service | String | 是 | 不适用 | 服务名称,仅用于标记。 |
videoConfig | JSON | 是 | 不适用 | 视频上传配置。当前仅支持以下参数:
|
userToken | JSON | 是 | 不适用 | 临时上传 token。获取方式参考获取临时上传 token。格式如下所示:
|
用于视频上传后处理的 Action 对象数组,包含以下参数:
名称 | 描述 |
|---|---|
name | Action 名称。当前仅可设为 |
在上传文件前,调用 initCheck 检查以下内容:
说明
如果您希望在上传完成后自动创建点播间,也需要在 initCheck 中传入与点播间相关的参数。详见步骤五:创建点播间。
上传视频或图片前检查的代码如下所示:
上传视频前进行检查的示例代码如下:
uploader.initCheck({ file: fileList, type: 'video', }).then(fileKey => { console.log(fileKey); }).catch(e => { console.log(e) })
上传视频或图片前检查的相关参数如下表所示:
名称 | 类型 | 是否必选 | 默认值 | 描述 |
|---|---|---|---|---|
file | Array | 是 | 不适用 | 待上传文件。每次仅可上传一个文件。 |
type |
| 是 | 无 | 待上传文件的类型。可设为:
|
vid | String | 否 | 无 | 如果您将 说明 仅当 |
检查通过后,SDK 会返回上传任务 ID fileKey,例如 'file_149544227xxxx_xxxxxx'。
您可调用以下方法控制上传任务:
调用 start 启动上传任务。示例代码如下:
uploader.start();
调用 pause 暂停上传任务。SDK 会暂存当前文件的上传信息。
uploader.pause();
调用 restart 重启上传任务。SDK 会从暂停位置重新开始上传。
uploader.restart();
调用 cancel 取消上传任务,并删除当前文件的上传信息。
uploader.cancel();
如果您希望在本地视频上传完成后自动创建点播间,您需要在 initCheck 中传入与点播间相关的参数。相关参数如下表所示。
名称 | 类型 | 是否必选 | 默认值 | 描述 |
|---|---|---|---|---|
newVideoRoomName | string | 是 | 无 | 点播间名称。传入该参数后,SDK 可在本地视频上传完成后自动创建点播间。 |
file | Array | 是 | 不适用 | 待上传的视频文件。每次仅可上传一个文件。 |
type |
| 是 | 无 | 待上传文件的类型。在当前创建点播间场景下,固定取值为 |
示例代码如下所示。SDK 会先进行上传前检查,之后上传视频:
fileKey,例如 'file_149544227xxxx_xxxxxx'。uploader.initCheck({ newVideoRoomName: '<点播间名称>', file: fileList, // 每次仅可上传一个文件。 type: 'video', }); uploader.start();
调用 updateVideoRoom,通过传入视频 ID、或上传本地视频的方式,更新点播间。
名称 | 类型 | 是否必选 | 默认值 | 描述 |
|---|---|---|---|---|
videoRoomId | string | 是 | 无 | 点播间 ID。可通过监听 video_room_created_result 事件获取点播间 ID。详见文档末尾。 |
file | Array | 否 | 无 | 待上传的视频文件。每次仅可上传一个文件。 说明
|
type |
| 否 | 无 | 待上传文件的类型。在当前更新点播间场景下,固定取值为 说明 如果您传入了 |
vids | Array | 否 | 无 | 传入视频的 ID。 说明
|
isAppend | bool | 否 | false | 是否追加视频。
|
以下示例代码展示了同时处理本地视频上传和 vids 指定视频上传的场景:SDK 会先上传本地视频文件,再上传 vids 中指定的视频。
uploader.updateVideoRoom({ videoRoomId: '<点播间id>', // 可通过监听 video_room_created_result 事件获取点播间 ID。详见文档末尾。 file: fileList, // 每次仅可上传一个文件。 type: 'video', // 固定取值为 `video`。 vids: ['<vid1>', '<vid2>'], // 传入视频的 ID。 isAppend: true // 保留点播间内已有视频,追加新视频。 });
您可以参考以下示例代码监听上传任务的事件。
uploader.on('event_name', function(data) { console.log('event_name', data); });
下表列出上传任务生命周期中 SDK 可能触发的事件。
事件名称 | 描述 |
|---|---|
crc32 | SDK 进行视频切片后触发。上传视频时,SDK 会将视频切分成多个片段。该事件返回 CRC-32 信息数组和每个片段的长度。 |
progress | 返回上传任务的进度 (%)。 |
fileMerge | 所有视频分片上传成功并合并后触发。 |
complete | 上传任务完成时触发。SDK 触发 |
error | 提示错误信息。 |
video_room_created_result 用于监听点播间创建结果。示例代码如下:
uploader.on('video_room_created_result', result => { console.log(result); // result.VideoRoomId });
无论创建成功还是失败,SDK 都会触发该事件:
VideoRoomId,即点播间 ID;