Editor-SDK
Editor-SDK 是编辑器部分的 SDK,可以直接在项目中引入编辑并导出 MP4 文件,Editor 是基于 Core-SDK 开发。
使用方法如下:
// 引入视频编辑器的SDK
import { VideoEditorSDK } from "@h5/videoEditorSDK";
// 创建编辑器的实例
const vs = new VideoEditorSDK({
registerId: "test123", // 必填,注册ID,需要去官网进行申请
movieData: "工程数据", // 选填二选一,工程数据,工程数据和作品ID必须传入一个,会优先读取工程数据,如果没有传入工程数据,会通过appid去api server 去获取工程数据
EModuleEffectSourcePath: '/assets/effectcanvas', // 特效资源模块加载路径
appid: "作品ID", // 选填二选一,作品id
target: document.body, // 选填,容器,默认是document.body
server: "api server配置", // 选填,如果没有传入会调用video.h5ds.com的API服务,api接口配置,具体参考APIServer
});
// 初始化
const vsdk = await vs.init();
/**
* 假设工程数据是movieData,修改数据->更新视图
*/
// 1、获取工程数据中第一个元素
const [element] = movieData.elements;
// 2、修改第一个元素的坐标为[100, 200]
element.style.x = 100;
element.style.y = 200;
// 3、更新视图
vsdk.editor.updateMovie();
可以通过new VideoEditorSDK(...)
获取到vs
实例,通过实例vs.init()
获取到vsdk
,该实例vsdk.editor
中包含了很多属性
和方法
,下面就挨个介绍这些属性和方法以及使用技巧。
// 更新视图
vsdk.editor.updateMovie();
// 更新设置区域
vsdk.editor.updateOption();
// 更新时间轴
vsdk.editor.updateTimeline();
属性说明
属性:后面的表示属性的数据类型。@表示@observable
被 mobx 监听的数据,直接修改可以触发视图的更新。
.movie: Store
内核video-core
的实例,类型为video-core
的实例,请参考video-core
的实例movie
的实例说明。
// eg: 调用movie里面的方法,播放&暂停
vsdk.editor.movie.play();
vsdk.editor.movie.pause();
.data: MovieData
视频项目的原始 JSON 数据,数据结构请参考数据说明文档
:video-core/src/react-pixi/types/data.ts
.apiServer: APIServer
外部传入的 API 服务配置,参考 APIServer 的定义(packages\video-editor\src\config\sdk.d.ts
),如果不传默认使用官方的 API
import type {
Err,
AppDataRes,
CreateAppParams,
UpdateAppParams,
TypesRes,
TemplateParams,
MaterialParams,
MaterialRes,
CollectRes,
CollectParams,
UserMaterialParams,
UserMaterialTypeParams,
CreateUserMaterialParams,
UpdateUserMaterialParams,
} from "@config/sdk.d.ts";
interface APIServer {
// 获取appData数据
getAppData: (appid: string) => Promise<[{ url: string }, Err]>;
// 创建新的作品
createApp: (params: CreateAppParams) => Promise<[{ id: string }, Err]>;
// 更新作品
updateApp: (params: UpdateAppParams) => Promise<[string, Err]>;
// 删除作品
deleteApp?: (id: string) => Promise<[string, Err]>;
// 获取模版的分类信息
getTemplateTypes: () => Promise<[{ name: string; id: string }[], Err]>;
// 获取模版列表
getTemplates: (
params: TemplateParams
) => Promise<[{ name: string; id: string }[], Err]>;
// 获取素材的分类
getMaterialTypes: (
type: string
) => Promise<[{ name: string; id: string }[], Err]>;
// 获取素材
getMaterials: (
params: MaterialParams
) => Promise<[{ id: string; name: string }[], Err]>;
// 收藏元素
collect: (params: {
source_id: string;
type: string;
}) => Promise<[string, Err]>;
// 取消收藏
cancelCollect: (sourceIds: string[]) => Promise<[string, Err]>;
// 收藏列表
getCollects: (
params: CollectParams
) => Promise<[{ id: string; name: string }[], Err]>;
// 上传base64图片
uploadBase64: (
params: UploadBase64Params
) => Promise<[{ storage_path: string }, Err]>;
// 表单上传
formUpdate: (params: FormData) => Promise<[{ storage_path: string }, Err]>;
// 获取用户素材
getUserMaterial: (
params: UserMaterialParams
) => Promise<[{ data: MaterialItemRes[]; total: number }, Err]>;
// 获取用户的素材分类
getUserMaterialType: (
params: UserMaterialTypeParams
) => Promise<[{ data: { id: string; name: string }[]; total: number }, Err]>;
// 删除用户素材
deleteUserMaterial: (ids: string[]) => Promise<[string, Err]>;
// 新增用户素材
createUserMaterial: (
params: CreateUserMaterialParams
) => Promise<[MaterialItemRes, Err]>;
//tts
createTTS: (
params: CreateTTSParams
) => Promise<[{ storage_path: string }, Err]>;
//ai字幕,传入音频的url,返回taskId,轮训taskId查询转换结果
createCaption: (url: string) => Promise<[{ TaskId: string }, Err]>;
// 轮训
seekCaptionTask: (taskId: string) => Promise<[any, Err]>;
// 修改用户素材
updateUserMaterial: (
params: UpdateUserMaterialParams
) => Promise<[MaterialItemRes, Err]>;
}
.copyTempData: any
缓存复制的数据,可以是文字内容,元素数据等数据,复制后赋值给此属性,缓存到内存中,等待粘贴的时候使用。
.copyTempFrameData: FrameItem[] | null
缓存复制的帧数据,等待粘贴的时候使用。
@.previewSource: PreviewSourceParams
点击预览的素材的时候,会缓存起来,方便展示
.activeItems: Record<ctypes.SourceType, SourceItem[]>
资源切换后,缓存 list 数据避免重复的请求服务端的数据
@.editMode: template' | 'auto'
编辑器模式分:模版替换模式 和 自由编辑模式
@.optionPanelCustom: 'background' | ''
控制切换设置区域的面板,切换到背景设置
@.appid: string
记录当前编辑项目的 appid
@.themeUpdateKey: 'dark' | 'light'
记录当前的风格主题类型,修改后会触发视图更新
@.languageUpdateKey: 'zh-CN' | 'en-US'
记录当前的多语言参数,修改后出触发视图更新
@.movieCreateSuccess: boolean
movie 实例创建成功的时候该参数会被设置为 true
@.currentTime: number
游标位置对应的时间
@.rulerScale: number
时间轴 1s 对应的缩放比例,默认是 50px,表示 1 秒对应 50px
@.playing: boolean
播放状态,播放中和暂停两种状态
@.updateKey: string
用于控制设置区域
的视图更新
@.movieDataUpdateKey: string
视频数据替换后,需要修改该参数,会强制更新画布区域
@.timelineUpdateKey: string
用于控制时间轴视图的更新
@.timelineToolsUpdateKey: string
用于控制时间轴上面部分的快捷工具栏的视图更新
@.totalTimeKey: string
总时间变化后需要修改该参数,确保其他地方都可以同步更新
@.frameSelectedId: string
选中时间轴的帧小点的时候会切换到帧模式下,帧模式下修改元素的坐标缩放旋转等信息表示直接修改该帧状态
@.selectedElementIds: string[]
编辑器中选中的元素的 ID,修改后会自动同步选中状态
@.layoutKeys: Record<ctypes.LayoutName, string>
用于更新布局的标识,字段变化后会自动更新指定模块,比如:
// 更新header部分的组件
editor.layoutKeys.header = String(+new Date());
@.sourceType: ctypes.SourceType
控制资源面板切换的变量,配合setSourceType(t: ctypes.SourceType)
方法来使用。
@.elementOptionType: ctypes.ElementOptionType
控制设置面板切换的变量,配合setElementOptionType(t: ctypes.ElementOptionType)
方法来使用。
方法说明
updateMovie(t?: number
): void
更新画布区域的画面
updateOption(): void
更新设置区域视图
updateTimeline(): void
更新时间轴区域视图
setActiveItems(items: SourceItem[]
, type: ctypes.SourceType
): void
设置缓存素材资源数据,将已经展示过的素材资源数据缓存起来,方便拖拽的时候使用
getFromActiveItems(id: string
, type: ctypes.SourceType
): SourceItem
从缓存的素材资源数据中读取数据,主要用于拖拽的时候使用
updateTimelineTools(): void
更新时间轴工具栏模块
record(params: types.RecordItem<types.RecordType>
): void
记录用户的操作日志,redo/undo 的时候使用
export interface RecordItem<T> {
desc: string; // 描述信息
type: T;
}
export type RecordType =
| "elements_delete"
| "elements_create"
| "elements_update"
| "global";
vsdk.editor.record({
type: "elements_update",
desc: "元素更新了",
});
setSelectedElementIds(ids: string[]
): void
传入元素 ID 去选中元素
// 同时选中2个元素
vsdk.editor.setSelectedElementIds(["elementId1", "elementId2"]);
setContorlAndSelectedElemenent(ids: string[]
): Promise<null>
选中元素并设置元素的控制器,需要注意的是元素控制器的设置是异步的,并非同步过程。
// 同时选中2个元素并且设置元素控制器
await vsdk.editor.setContorlAndSelectedElemenent(["elementId1", "elementId2"]);
updateComponent(...keyName: ctypes.LayoutName[]
): void
批量更新指定模块
// 布局名称
export type LayoutName =
| "sources"
| "timeline"
| "options"
| "canvas"
| "header";
// 批量更新时间轴和设置区域
await vsdk.editor.updateComponent("timeline", "options");
setSourceType(t: ctypes.SourceType
): void
切换左侧资源面板
// 资源面板类型
export type SourceType =
| "my"
| "template"
| "image"
| "video"
| "audio"
| "text"
| "filter"
| "effect"
| "transition"
| "lottie"
| "background"
| "more"
| string;
// 切换到图片资源面板
await vsdk.editor.setSourceType("image");
setElementOptionType(t: ctypes.ElementOptionType
): void
切换设置面板的方法
// 设置面板类型
export type ElementOptionType =
| "basic"
| "audio"
| "speed"
| "animation"
| "colour"
| "caption"
| "mask";
// 切换到动画设置
await vsdk.editor.setElementOptionType("animation");
getElementData(): types.BaseElement
获取选中的元素,如果选中了多个元素,只会返回一个元素
// 如果editor.selectedElementIds有数据,可以调用该方法获取选中元素的数据
const elementData = vsdk.editor.getElementData();
getGroupElementData(): types.BaseElement[]
和 getElementData 方法类似,获取选中的多个元素,返回一个数组
mergeCaption(id: string
): void
和下一个字幕进行合并,合并成一个新的字幕,这里传入字幕的 ID,如果下一个字幕没有数据将无法合并
deleteCaption(id: string
): void
删除字幕,传入要删除的字幕 ID
addCaption(text: string
, index?: number
): void
添加字幕数据,text 是传入的字幕内容,index 是要添加到第 index + 1 个元素后面,如果不传将会插入到最后面
// 插入到第2个元素后面
vsdk.editor.addCaption("今天是个好天气", 1);
pause(time?: number
): void
暂停到指定的时间,如果不传参数将暂停到最后一帧