本文面向需要在 Web 页面中集成剪辑能力的前端开发者。通过 AI MediaKit Web 剪辑 SDK,你可以在业务页面中嵌入完整的剪辑编辑器,包括素材管理、轨道编辑、特效渲染和视频导出,无需自行拼装底层编辑器组件。
AI MediaKit 提供一款一站式 Web 剪辑 SDK @volcengine/amk-editor,将编辑器界面、素材管理、轨道编辑、特效渲染和视频导出封装在一个包中,你只需提供剪辑工程标识和业务代理地址,即可在页面中快速嵌入完整的剪辑能力。
在开始集成之前,你需要了解 AI MediaKit Web 剪辑 SDK 的一个核心设计原则:为保障密钥(API Key)安全,浏览器不能直接请求 AI MediaKit 服务,必须通过你自己的业务代理服务来中转。这个代理服务需要由你自己在服务端实现,主要负责两件事:
- 安全地附加密钥:将存储在你自己服务器上的 AI MediaKit API Key 添加到请求中。
- 转发请求:将来自 SDK 的请求安全地转发给 AI MediaKit 服务端。
基于此架构,以下两个概念是你接入 SDK 时必须理解并在代码中配置的:
简单来说,你的职责是创建工程、实现代理和配置回调函数,SDK 会负责其余的一切——从界面渲染到数据保存,从素材管理到视频导出。架构图参考如下:
在正式开始集成编码前,请确保已完成以下一次性的前置准备,为你后续创建工程、实现代理服务提供必要的权限和凭证。
- 获取并妥善保管 API Key:API Key 是你在服务端调用 AI MediaKit API 进行身份认证的唯一凭证。它与你的账号绑定,具有高权限,必须妥善保管。你可以前往 AI MediaKit 控制台的 API Key 管理页面创建并获取专用 API Key。获取后,可将其配置为你服务端(即业务代理)的环境变量。
注意
API Key 是高权限凭证,必须严格保管在服务端。严禁将其硬编码在前端代码中或通过任何方式传递到浏览器。浏览器端的所有请求都应只访问你自己的业务代理地址。
完成以上准备后,你已经具备了从服务端安全调用 AI MediaKit API 的所有条件。接下来的快速开始章节将引导你完成具体的编码工作,包括:
- 调用服务端 API 创建一个剪辑工程,并获得 projectId。
- 在你的后端项目中,实现用于安全转发请求的业务代理服务。
- 在你的前端页面中,初始化 SDK 并配置相关回调。
本节将引导你完成一个端到端的集成流程。
在你的前端项目根目录中执行以下命令,将 SDK 包添加到你的前端项目中。
你需要在服务端调用 AI MediaKit OpenAPI API 为用户的每次剪辑创建一个云端草稿箱,获取其唯一标识 projectId,并将返回的 project_id 传递给前端。这个 ID 是后续所有操作的基础。
说明
$AMK_API_KEY:替换为你从 AI MediaKit 控制台获取并安全存储在服务端的 AI MediaKit API Key。
响应示例:
搭建一个业务代理,让前端的 SDK 可以通过你的后端服务,间接地调用 AI MediaKit 的 API,从而避免在浏览器中暴露敏感的 API Key。以下是一个基于 Node.js + Express 的最小化实现示例,你可以根据它来构建自己的代理。在实际项目中,你还需要补充用户身份验证、接口限流和操作审计等逻辑。
在你的前端页面中,引入并初始化 SDK,从而在网页的指定位置渲染出剪辑器界面,并加载指定 projectId 的工程数据。你需要为 SDK 提供一个 DOM 容器和从后端获取的 projectId,同时完成实际的上传和媒资管理的回调配置。
说明
回调返回的素材对象必须符合 SDK 的标准格式,具体字段请参考素材标准格式。 如果你需要在用户打开编辑器前,就为工程预置一批素材(例如,从已有的媒资库选择),可以通过服务端 API 进行批量创建素材。
此 API 每次最多支持批量创建 100 条素材。该操作是原子性的,即如果其中任一素材校验失败,则整批操作都会失败,不会写入任何数据。
完成以上步骤后,启动你的 Web 应用并打开包含编辑器的页面,进行以下验证:
- 界面渲染:编辑器界面能否正常加载并显示工程名称。
- 素材加载:若通过 API 预置了素材,检查它们是否显示在素材库面板中。
- 本地导入:尝试通过“导入”按钮上传本地视频或图片,检查上传成功后是否出现在素材库。
- 轨道编辑:将素材从素材库拖拽到时间轴轨道上,并进行预览播放。
- 自动保存:在轨道上进行一些操作(如裁剪、移动)后,刷新页面,检查编辑状态是否被成功恢复。
如果以上步骤均验证通过,恭喜你已成功完成 SDK 的基本集成。
本章介绍更多进阶配置,帮助你根据具体的业务需求深度定制 SDK 的行为和外观。
在生产环境中,一个健壮的业务代理除了实现基本的请求转发外,还应重点关注安全性和稳定性。以下指南将帮助你构建一个生产级的代理服务。
为了确保你的代理服务不被滥用,只响应来自 SDK 的合法请求,建立一套严格的 API 路径白名单至关重要。SDK 运行时会访问以下路径,请确保你的代理只允许这些路径通过:
- API Key 隔离:确保 API Key 始终仅在你的代理服务内部注入,绝不出现在发往代理的浏览器请求中。
- 权限强校验:务必在代理层校验当前会话的用户是否有权限访问其请求的 projectId,这是防止数据越权的关键。
- 响应透传:应原样透传 AI MediaKit 服务端返回的 HTTP 状态码和响应体,以便 SDK 能够正确处理成功、失败和任务状态。
- 日志与监控:建议记录请求 ID、工程 ID、用户 ID 和请求耗时等信息用于问题排查,但日志中绝不能记录 API Key。
素材回调是你业务逻辑与 SDK 连接的桥梁。通过实现这些函数,你可以完全控制素材的上传、管理和刷新机制。
SDK 提供灵活的本地上传机制。您可以通过实现 onUploadFile 回调来接管上传流程。作为一种更便捷的选择,如果您使用了火山引擎对象存储(TOS),也可以通过配置 storage.getUploadSTS 来启用 SDK 内置的 TOS 直传功能。上传方式的优先级如下:
- TOS 直传:如果配置了 storage.getUploadSTS,SDK 将激活内置的 TOS 上传流程,此时 onUploadFile 和 onUploadMaterial 回调将不会被触发。
- 自定义上传 onUploadFile:如果没有配置 TOS 直传,SDK 会调用您实现的 onUploadFile 函数来处理每个文件的上传。
- 旧版自定义上传 onUploadMaterial(已废弃):为兼容旧版本,如果仅实现了此回调,SDK 仍会调用它。建议您尽快迁移至 onUploadFile。
根据您实现的 material 回调函数,素材面板中“导入”按钮的行为会相应调整:
以下是几个核心回调的用途和实现要点:
为保证用户在任何时候都能访问和编辑素材(尤其是使用带时效签名 URL 的场景),您需要实现 onRefreshPlayInfo 回调。
SDK 自动抽取的封面图和雪碧图地址可能是临时的。通过实现 onPersistExtractUrls 回调,你可以将这些产物转存到自己的存储中变为永久资源,并将新的存储标识(如 Object Key)保存回素材对象,以便后续刷新。
你可以灵活配置编辑器的外观和功能,使其与你的应用风格保持一致,并提供恰当的功能集。
你可以定制编辑器的主题,并定义标题栏中返回、关闭按钮的行为。
SDK 内置了字体、花字、转场等丰富的预设资源面板。为了简化界面或根据业务需要,你可以选择性地关闭某些面板。
将配置项设为 false 后,SDK 将不会在 UI 中展示对应的面板入口,也不会请求相关资源,从而优化加载性能。例如,要禁用花字和转场功能,可以这样配置:
SDK 已内置左侧素材面板的收起与展开功能,无需你额外配置。用户点击收起按钮后,预览区域会自动扩展至全宽,并在左侧边缘显示一个“素材”入口用于重新展开面板。
当用户点击标题栏的“导出视频”按钮时,SDK 会弹出一个内置的导出配置表单,支持用户设置视频名称、分辨率、帧率、格式、编码方式以及画质增强选项。导出是一个异步过程,后台任务的执行不会影响用户继续编辑。导出时,SDK 会在内部复制一份当前的编辑数据用于提交渲染任务,这不会影响用户当前的工程状态或预览画面。
本章节提供集成 Web 剪辑 SDK 时所需的详细参考信息,包括服务端 API、SDK 初始化配置、实例方法和事件。
以下 API 是你在服务端与 AI MediaKit 后端服务交互时可能需要调用的接口。
所有接口在 HTTP 层面统一返回 200 OK,具体的业务成功与失败通过响应体内容来区分。
常见错误码:
所有与素材相关的 API 和回调函数都遵循此标准格式。
说明
自定义字段:你还可以在素材 JSON 对象中添加任意业务自定义字段(如 my_custom_field: 'some_value'),服务端 API 会在存储和返回时原样保留这些字段。
POST /api/v1/editing/projects
创建一个新的剪辑工程,并返回其唯一标识 project_id。
请求参数
请求示例
响应示例
POST /api/v1/editing/projects/{projectId}/materials
向指定工程中批量添加素材。此操作是原子性的,任一素材校验失败,整批操作都将失败。
请求参数
请求示例
响应示例
PUT /api/v1/editing/projects/{projectId}/materials
向指定工程中批量更新或插入素材。此操作具有原子性,即请求中的任何一条素材处理失败,整个批次都将回滚,不会写入部分数据。该 API 根据 source_material_id 自动判断执行更新还是插入操作:
- 更新现有素材:如果请求中某素材的 source_material_id 在工程中已存在,则会更新该素材。此时,你只需提供需要修改的字段。例如,仅传入 name 即可重命名该素材,其他字段将保持不变。
- 插入新素材:如果 source_material_id 在工程中不存在,则会创建一条新的素材记录。在这种情况下,你必须提供创建素材所需的所有必填字段(如 type, url, source 等)。
请求参数
请求示例
响应示例
以下是 new AmkEditor() 时可传入的完整配置项列表。
AmkEditor 实例上暴露了以下常用方法。
你可以通过 editor.getEditor().on(eventName, handler) 来监听底层编辑器触发的各类事件。
监听与销毁示例:
为了方便你快速构建功能,SDK 内置了丰富的预设资源库,覆盖花字、字体、特效、转场、滤镜和文字动画等多个类别。你可以通过 UI 配置与资源面板按需开启或关闭。