Skip to content

Editor-SDK

Editor-SDK 是编辑器部分的 SDK,可以直接在项目中引入编辑并导出 MP4 文件,Editor 是基于 Core-SDK 开发。

使用方法如下:

js
// 引入视频编辑器的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中包含了很多属性方法,下面就挨个介绍这些属性和方法以及使用技巧。

ts
// 更新视图
vsdk.editor.updateMovie();

// 更新设置区域
vsdk.editor.updateOption();

// 更新时间轴
vsdk.editor.updateTimeline();

属性说明

属性:后面的表示属性的数据类型。@表示@observable被 mobx 监听的数据,直接修改可以触发视图的更新。

.movie: Store

内核video-core的实例,类型为video-core的实例,请参考video-core的实例movie的实例说明。

ts
// 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

ts
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>

用于更新布局的标识,字段变化后会自动更新指定模块,比如:

ts
// 更新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 的时候使用

ts
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 去选中元素

ts
// 同时选中2个元素
vsdk.editor.setSelectedElementIds(["elementId1", "elementId2"]);

setContorlAndSelectedElemenent(ids: string[]): Promise<null>

选中元素并设置元素的控制器,需要注意的是元素控制器的设置是异步的,并非同步过程。

ts
// 同时选中2个元素并且设置元素控制器
await vsdk.editor.setContorlAndSelectedElemenent(["elementId1", "elementId2"]);

updateComponent(...keyName: ctypes.LayoutName[]): void

批量更新指定模块

ts
// 布局名称
export type LayoutName =
  | "sources"
  | "timeline"
  | "options"
  | "canvas"
  | "header";

// 批量更新时间轴和设置区域
await vsdk.editor.updateComponent("timeline", "options");

setSourceType(t: ctypes.SourceType): void

切换左侧资源面板

ts
// 资源面板类型
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

切换设置面板的方法

ts
// 设置面板类型
export type ElementOptionType =
  | "basic"
  | "audio"
  | "speed"
  | "animation"
  | "colour"
  | "caption"
  | "mask";

// 切换到动画设置
await vsdk.editor.setElementOptionType("animation");

getElementData(): types.BaseElement

获取选中的元素,如果选中了多个元素,只会返回一个元素

ts
// 如果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 个元素后面,如果不传将会插入到最后面

ts
// 插入到第2个元素后面
vsdk.editor.addCaption("今天是个好天气", 1);

pause(time?: number): void

暂停到指定的时间,如果不传参数将暂停到最后一帧

Powered by 四川爱趣五科技有限公司.蜀ICP备18034069号.