@volcengine/amk-editor 0.0.1-beta.4 → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -123
- package/dist/export-modal-view.d.ts +2 -1
- package/dist/export-modal.d.ts +2 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1815 -1228
- package/dist/types.d.ts +8 -0
- package/dist/veveditor.css +13 -6
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,139 +1,43 @@
|
|
|
1
1
|
# @volcengine/amk-editor
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
火山引擎 AI MediaKit 官方 Web 视频编辑器 SDK。
|
|
3
|
+
## 安装
|
|
4
|
+
```bash
|
|
5
|
+
npm install @volcengine/amk-editor
|
|
6
|
+
```
|
|
7
|
+
需要 React 18 或 19。使用本 SDK 须获得有效的火山引擎商业授权,条款见 [LICENSE](./LICENSE)。
|
|
8
|
+
本 SDK 使用的第三方开源组件仍分别适用其各自的许可证。
|
|
9
|
+
## 快速开始
|
|
11
10
|
```ts
|
|
12
11
|
import { AmkEditor } from '@volcengine/amk-editor';
|
|
13
|
-
|
|
14
12
|
const editor = new AmkEditor({
|
|
15
13
|
container,
|
|
16
|
-
projectId: '
|
|
17
|
-
endpoint: 'https://your-
|
|
18
|
-
getLicenseUrl: 'https://license.example.com',
|
|
14
|
+
projectId: 'your-project-id',
|
|
15
|
+
endpoint: 'https://your-backend.example.com',
|
|
19
16
|
material: {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
onUploadMaterial: async files => {
|
|
18
|
+
// 上传到业务存储后返回素材列表,每项必须带 source_material_id
|
|
19
|
+
return [];
|
|
20
|
+
},
|
|
21
|
+
onUploadUrlMaterial: async urls => {
|
|
22
|
+
return [];
|
|
23
|
+
},
|
|
24
24
|
onRefreshPlayInfo: async materials =>
|
|
25
25
|
materials.map(item => ({
|
|
26
26
|
material_id: item.material_id, // 仅用于匹配,不要改写
|
|
27
|
-
url: '...',
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
sprite: item.sprite_storage_keys
|
|
31
|
-
? { ...item.sprite, storeurls: ['https://signed-sprite-url'] }
|
|
32
|
-
: item.sprite,
|
|
27
|
+
url: '...',
|
|
28
|
+
poster: item.poster,
|
|
29
|
+
sprite: item.sprite,
|
|
33
30
|
})),
|
|
34
|
-
// 抽帧临时链转存成长效地址(可选);URL 和 key 会一起写回素材
|
|
35
|
-
onPersistExtractUrls: async ({ kind, urls, material }) => {
|
|
36
|
-
const result = await persistToBusinessStorage({ kind, urls, material });
|
|
37
|
-
return {
|
|
38
|
-
urls: result.urls,
|
|
39
|
-
// SDK 会把 materialPatch 原样合并并写回素材;字段名由业务决定。
|
|
40
|
-
materialPatch:
|
|
41
|
-
kind === 'poster'
|
|
42
|
-
? { poster_storage_key: result.storageKeys[0] }
|
|
43
|
-
: { sprite_storage_keys: result.storageKeys },
|
|
44
|
-
};
|
|
45
|
-
},
|
|
46
31
|
},
|
|
47
32
|
});
|
|
48
|
-
|
|
49
|
-
// 两种上传返回素材后,SDK 统一:
|
|
50
|
-
// 1. addSketchItems → 素材面板
|
|
51
|
-
// 2. createAmkMaterials → POST 远端仓库,并把服务端返回的 material_id 记到面板
|
|
52
|
-
// 3. ensureMaterialExtractTasks → 缺/过期 poster/sprite 时抽帧;临时链上屏后可后台转存再 PUT
|
|
53
|
-
|
|
54
|
-
// 转存完成后素材会保存:
|
|
55
|
-
// - poster + poster_storage_key(推荐字段,可自定义)
|
|
56
|
-
// - sprite.storeurls + sprite_storage_keys(推荐字段,可自定义)
|
|
57
|
-
// 下一次 onRefreshPlayInfo 会收到这些 key,业务可据此重新生成有时效的访问 URL。
|
|
58
|
-
// SDK 不读取上述两个 key,也不把它们当作固定 Schema。业务也可以返回:
|
|
59
|
-
// materialPatch: {
|
|
60
|
-
// biz_storage: { poster_key: '...', sprite_keys: ['...'] },
|
|
61
|
-
// }
|
|
62
|
-
// 只需在 onRefreshPlayInfo 中按同一套自定义结构读取即可。
|
|
63
|
-
|
|
64
|
-
// 导出:invokeTool('vibe-editing-common', { edit_param, callback_args? })
|
|
65
|
-
// 开启画质增强时附带 callback_args(JSON 字符串),供代理后续调增强:
|
|
66
|
-
// - standard/professional → { tool:"enhance-video", tool_version, resolution, fps }
|
|
67
|
-
// - large-model → { tool:"enhance-video-generative", resolution, fps }
|
|
68
|
-
// SDK 不负责增强任务本身。
|
|
69
|
-
|
|
70
|
-
// 工程会从 {endpoint}/api/v1/editing/projects/{projectId} 加载并自动保存。
|
|
71
|
-
// 通用 MediaKit 工具仍通过 POST {endpoint}/api/v1/tools/{toolName} 调用。
|
|
72
|
-
await editor.invokeTool({
|
|
73
|
-
toolName: 'asr-subtitles',
|
|
74
|
-
params: {
|
|
75
|
-
input: {
|
|
76
|
-
type: 'video',
|
|
77
|
-
url: 'https://example.com/demo.mp4',
|
|
78
|
-
},
|
|
79
|
-
},
|
|
80
|
-
});
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
## 构建
|
|
84
|
-
|
|
85
|
-
先构建 SDK,再构建本包:
|
|
86
|
-
|
|
87
|
-
```bash
|
|
88
|
-
pnpm build-veveditor
|
|
89
|
-
pnpm --filter @volcengine/amk-editor run build
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
产物位于 `dist/index.js`(含 veveditor 运行时)与 `dist/veveditor.css`(样式 side-effect)。
|
|
93
|
-
|
|
94
|
-
- `projectId` / `endpoint` 均为必传;鉴权密钥留在业务服务端,由 `endpoint` 代理注入
|
|
95
|
-
- 发布包不声明底层编辑器为运行时依赖;底层编辑器和 `video-editor` 已在构建阶段内联到 `dist/index.js`,类型声明也不依赖内部包。
|
|
96
|
-
- 发布前必须使用 `npm pack --dry-run` 检查 tarball;公网用户只需要能访问 npm 公网源和业务方提供的 `endpoint`。
|
|
97
|
-
|
|
98
|
-
## Editing API 对接
|
|
99
|
-
|
|
100
|
-
初始化时,AMK Editor 会组合以下接口:
|
|
101
|
-
|
|
102
|
-
- `GET /api/v1/editing/projects/:project_id`
|
|
103
|
-
- `GET /api/v1/editing/projects/:project_id/materials`
|
|
104
|
-
- `GET /api/v1/editing/projects/:project_id/editor`
|
|
105
|
-
|
|
106
|
-
编辑过程中按资源分别写回:
|
|
107
|
-
|
|
108
|
-
- 标题变更:`PATCH /projects/:project_id`
|
|
109
|
-
- 素材变更:`PUT/DELETE /projects/:project_id/materials`
|
|
110
|
-
- 剪辑参数变更:`PUT /projects/:project_id/editor`
|
|
111
|
-
|
|
112
|
-
Editor 保存携带服务端 `revision`,SDK 内部串行提交保存请求,避免同一页面内的并发保存互相覆盖。素材身份字段分工:
|
|
113
|
-
|
|
114
|
-
- `source_material_id`:业务必填主键。POST / PUT 请求体、DELETE 都用它;DELETE body 为 `{ source_material_ids: string[] }`
|
|
115
|
-
- `material_id`:Editing API 自己生成的服务端 id。业务方不用传,传了也不会入库;SDK 只在 POST 成功后把返回值记到面板,供轨道内部关联
|
|
116
|
-
- `source`:VeVEditor 轨道 `Source` / 加密 vid 等资源标识。Editing API 请求体里的 `source` 是 origin url,与面板 `source` 不是同一语义
|
|
117
|
-
|
|
118
|
-
服务端响应缺少 `source` 时,加载工程仅使用 `material_id` 作为 `source` fallback。
|
|
119
|
-
|
|
120
|
-
浏览器不应持有 AMK API Key。`endpoint` 应指向业务代理,由代理向 Editing API 注入:
|
|
121
|
-
|
|
122
|
-
```http
|
|
123
|
-
Authorization: Bearer <AMK_API_KEY>
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
`amkeditordemo` 默认使用与 Editing API 契约一致的内存 mock。联调真实服务时,在启动 demo 的服务端环境设置:
|
|
127
|
-
|
|
128
|
-
```bash
|
|
129
|
-
EDITING_API_UPSTREAM='https://your-editing-api.example.com' \
|
|
130
|
-
AMK_API_KEY='<your-api-key>' \
|
|
131
|
-
VITE_AMK_PROJECT_ID='<existing-project-id>' \
|
|
132
|
-
pnpm --dir packages/amkeditordemo/fe dev
|
|
133
33
|
```
|
|
134
|
-
|
|
135
|
-
卸载时销毁:
|
|
136
|
-
|
|
34
|
+
页面卸载时销毁:
|
|
137
35
|
```ts
|
|
138
36
|
editor.destroy();
|
|
139
37
|
```
|
|
38
|
+
## 接入说明
|
|
39
|
+
- `projectId`、`endpoint` 必填。`endpoint` 指向你的业务服务,由服务端转发并注入鉴权,不要把 API Key 放到浏览器。
|
|
40
|
+
- 本地上传、URL 导入由业务回调完成。返回的素材必须带业务主键 `source_material_id`,不必填写 `material_id`。
|
|
41
|
+
- 播放地址、封面、雪碧图可能有时效。通过 `onRefreshPlayInfo` 返回新的访问地址。
|
|
42
|
+
- 可选实现 `onPersistExtractUrls`:把抽帧得到的临时地址转存为业务长期地址,并随 `materialPatch` 写回自定义存储字段。
|
|
43
|
+
- 可选配置 `export.qualityEnhancement: true` 以在导出弹窗展示「视频画质增强」;默认不展示。
|
|
@@ -5,7 +5,8 @@ export interface ExportModalViewProps {
|
|
|
5
5
|
videoName: string;
|
|
6
6
|
visible: boolean;
|
|
7
7
|
t: AmkI18nInstance['t'];
|
|
8
|
+
showQualityEnhancement?: boolean;
|
|
8
9
|
onConfirm: (params: ExportVideoParams) => Promise<void> | void;
|
|
9
10
|
onClose: () => void;
|
|
10
11
|
}
|
|
11
|
-
export declare function ExportModalView({ videoName, visible, t, onConfirm, onClose, }: ExportModalViewProps): React.ReactElement;
|
|
12
|
+
export declare function ExportModalView({ videoName, visible, t, showQualityEnhancement, onConfirm, onClose, }: ExportModalViewProps): React.ReactElement;
|
package/dist/export-modal.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ export interface CreateExportModalOptions {
|
|
|
5
5
|
videoName: string;
|
|
6
6
|
onConfirm: (params: ExportVideoParams) => Promise<void> | void;
|
|
7
7
|
t?: AmkI18nInstance['t'];
|
|
8
|
+
/** 是否展示「视频画质增强」。默认不展示。 */
|
|
9
|
+
showQualityEnhancement?: boolean;
|
|
8
10
|
}
|
|
9
11
|
export interface ExportModalController {
|
|
10
12
|
open: () => void;
|
package/dist/index.d.ts
CHANGED
|
@@ -4,4 +4,4 @@ export type { AmkApiClientOptions, AmkInvokeToolParams } from './api/client';
|
|
|
4
4
|
export type { PresetLibrary, PresetLibraryItem, PresetLibraryResourceKey, } from './api/preset-library';
|
|
5
5
|
export { AMK_I18N_KEYS, createAmkI18n, tAmk, getGlobalAmkI18n, setGlobalAmkI18n, } from './i18n';
|
|
6
6
|
export type { AmkI18nInstance, AmkI18nOptions, Locale, LocaleMessages, Messages, } from './i18n';
|
|
7
|
-
export type { AmkEditorOptions, AmkEditorConfig, AmkEditorDecodeOptions, AmkEditorHeaderConfig, AmkEditorInternalConfig, AmkProjectSnapshot, ExportVideoParams, MaterialConfig, MaterialItem, PersistExtractUrlsResult, RecommendedExtractStorageFields, Theme, VeVeditorInstance, } from './types';
|
|
7
|
+
export type { AmkEditorOptions, AmkEditorConfig, AmkEditorDecodeOptions, AmkEditorExportConfig, AmkEditorHeaderConfig, AmkEditorInternalConfig, AmkProjectSnapshot, ExportVideoParams, MaterialConfig, MaterialItem, PersistExtractUrlsResult, RecommendedExtractStorageFields, Theme, VeVeditorInstance, } from './types';
|