智能生產制作提供專業在線的普通模板剪輯能力,針對視頻制作中重復性內容和定制美化需求,您可以通過自定義模板和素材替換,實現批量化視頻生產。通過閱讀本文,您可以了解如何接入普通模板剪輯Web SDK。
接入說明
普通模板是基于視頻剪輯工程創建的,因此基于普通模板的視頻剪輯是集成在視頻剪輯Web SDK中。如果您需要接入普通模板剪輯,只需要接入視頻剪輯Web SDK,并在初始化中傳入參數mode
。關于接入及初始化視頻剪輯Web SDK,請參見接入視頻剪輯Web SDK。
window.AliyunVideoEditor.init({
mode: 'template'
......
});
config屬性說明
由于普通模板是基于視頻剪輯工程創建的,因此接入視頻剪輯Web SDK中的config屬性也同樣適用于普通模板剪輯,詳情請參見config屬性說明。除此之外,基于普通模板剪輯的config屬性中還額外增加了以下參數:
參數 | 類型 | 必填 | 描述 | 引入版本 |
updateTemplate | (data: {coverUrl: string; duration: number; timeline: Timeline; isAuto: boolean}) => Promise<{projectId: string}>; | 是 | 編輯普通模板界面右上角保存模板按鈕對應的參數,作用為保存模板的時間線,參數依次為:工程的封面圖地址、時長(單位:秒)、Timeline數據和是否自動保存(當前每分鐘自動保存1次)。返回的Promise對象需要resolve項目ID。 | 3.7.0 |
init()示例代碼
重要
Web SDK只負責界面交互,不會發起請求,您需要通過Web SDK調用請求邏輯。請求本身應該先發送給您自己的服務端,您自己的服務端再根據AccessKey信息(AccessKey ID和AccessKey Secret)轉發給相關的阿里云OpenAPI。
// 注意,WebSDK 本身并不提供 request 這個方法,這里僅作為示例,您可以使用您喜歡的網絡請求庫,如 axios 等
window.AliyunVideoEditor.init({
container: document.getElementById('aliyun-video-editor'),
locale: 'zh-CN',
mode: 'template', // 開啟普通模版編輯模式
getEditingProjectMaterials: () => {
if (templateId) {
// templateId 由調用方自己保存
// 相關接口文檔 http://bestwisewords.com/document_detail/277452.html
return request('GetTemplate', {
TemplateId: templateId,
RelatedMediaidFlag: 1 // 加上這個參數,會返回相應的用于綁定媒資的字段
})
.then(res => {
const { RelatedMediaids } = res.data.Template;
const MediaIds = Object.values(JSON.parse(RelatedMediaids)).reduce(
(acc, cur) => acc.concat(cur),
[]
);
// 批量獲取媒資ID對應的資源
// 用 GetMediaInfo 逐個媒資單個查詢 http://bestwisewords.com/document_detail/197842.htm
return request('BatchGetMediaInfos', {
MediaIds,
AdditionType: 'FileInfo'
});
})
.then(res => {
return transMediaList(res.data.MediaInfos); // 需要做一些數據變換,具體參考后文
});
}
return Promise.resolve([]);
},
searchMedia: mediaType => {
// mediaType 為用戶當前所在的素材 tab,可能為 video | audio | image,您可以根據這個參數對應地展示同類型的可添加素材
return new Promise(resolve => {
// 調用方需要自己實現展示媒資、選擇媒資添加的界面,這里的 callDialog 只是一種示例,WebSDK 本身并不提供
// 關于展示媒資,請參考:http://bestwisewords.com/document_detail/197964.html
callDialog({
onSubmit: async materials => {
// 這里的 materials 是 ListMediaBasicInfos 接口獲取的媒資列表,并經過 transMediaList 轉換
// 相關接口文檔 http://bestwisewords.com/document_detail/277452.html
const res = await request('GetTemplate', {
TemplateId: templateId, // templateId 由調用方自己保存
RelatedMediaidFlag: 1 // 加上這個參數,會返回相應的用于綁定媒資的字段
});
const { Template } = res.data;
const MediaIdsMap = JSON.parse(Template.RelatedMediaids); // 解析出當前已綁定的媒資
// 將選中的媒資進行添加
materials.forEach(({ mediaType: type, mediaId }) => {
if (!MediaIdsMap[type]) {
MediaIdsMap[type] = [];
}
if (!MediaIdsMap[type].includes(mediaId)) {
MediaIdsMap[type].push(mediaId);
}
});
// 保存更新的媒資
// 相關接口文檔 http://bestwisewords.com/document_detail/340673.html
await request('UpdateTemplate', {
TemplateId: templateId, // templateId 由調用方自己保存
RelatedMediaids: JSON.stringify(MediaIdsMap)
});
resolve(materials);
}
});
});
},
deleteEditingProjectMaterials: async (mediaId, mediaType) => {
// 相關接口文檔 http://bestwisewords.com/document_detail/277452.html
const res = await request('GetTemplate', {
TemplateId: templateId, // templateId 由調用方自己保存
RelatedMediaidFlag: 1 // 加上這個參數,會返回相應的用于綁定媒資的字段
});
const { Template } = res.data;
const MediaIdsMap = JSON.parse(Template.RelatedMediaids); // 解析出當前已綁定的媒資
// 剔除要刪除的媒資
if (MediaIdsMap[mediaType] && MediaIdsMap[mediaType].includes(mediaId)) {
MediaIdsMap[mediaType].splice(MediaIdsMap[mediaType].indexOf(mediaId), 1);
// 保存更新的媒資
// 相關接口文檔 http://bestwisewords.com/document_detail/340673.html
await request('UpdateTemplate', {
TemplateId: templateId, // templateId 由調用方自己保存
RelatedMediaids: JSON.stringify(MediaIdsMap)
});
return true;
}
return false;
},
getEditingProject: async () => {
// 相關接口文檔 http://bestwisewords.com/document_detail/277452.html
const res = await request('GetTemplate', {
TemplateId: templateId // templateId 由調用方自己保存
});
const config = res.data.Template.Config;
return {
timeline: config ? JSON.parse(Config) : undefined
};
},
updateTemplate: async ({ coverUrl, timeline, isAuto }) => {
const updateParams = {
TemplateId: templateId, // templateId 由調用方自己保存
CoverURL: coverUrl,
Config: JSON.stringify(timeline)
};
// 保存更新
// 相關接口文檔 http://bestwisewords.com/document_detail/340673.html
await request('UpdateTemplate', updateParams);
}
// updateEditingProject 模版模式下不會使用到該參數,不需要傳入
// produceEditingProjectVideo 模版模式下不會使用到該參數,不需要傳入
});
/**
* 將服務端的素材信息轉換成 WebSDK 需要的格式
*/
function transMediaList(data) {
if (!data) return [];
if (Array.isArray(data)) {
return data.map(item => {
const basicInfo = item.MediaBasicInfo;
const fileBasicInfo = item.FileInfoList[0].FileBasicInfo;
const mediaId = basicInfo.MediaId;
const result = {
mediaId
};
const mediaType = basicInfo.MediaType;
result.mediaType = mediaType;
if (mediaType === 'video') {
result.video = {
title: fileBasicInfo.FileName,
duration: Number(fileBasicInfo.Duration),
// 源視頻的寬高、碼率等數據,用于推薦合成數據,不傳入或是0時無推薦數據
width: Number(fileBasicInfo.Width) || 0,
height: Number(fileBasicInfo.Height) || 0,
bitrate: Number(fileBasicInfo.Bitrate) || 0,
coverUrl: basicInfo.CoverURL
};
const spriteImages = basicInfo.SpriteImages;
if (spriteImages) {
try {
const spriteArr = JSON.parse(spriteImages);
const sprite = spriteArr[0];
const config = JSON.parse(sprite.Config);
result.video.spriteConfig = {
num: config.Num,
lines: config.SpriteSnapshotConfig?.Lines,
cols: config.SpriteSnapshotConfig?.Columns,
cellWidth: config.SpriteSnapshotConfig?.CellWidth,
cellHeight: config.SpriteSnapshotConfig?.CellHeight
};
result.video.sprites = sprite.SnapshotUrlList;
} catch (e) {
console.log(e);
}
}
} else if (mediaType === 'audio') {
result.audio = {
title: fileBasicInfo.FileName,
duration: Number(fileBasicInfo.Duration),
coverURL: '' // 您可以給音頻文件一個默認的封面圖
};
} else if (mediaType === 'image') {
result.image = {
title: fileBasicInfo.FileName,
coverUrl: fileBasicInfo.FileUrl,
// 圖片的寬高等數據,用于推薦合成數據,不傳入或是0時無推薦數據
width: Number(fileBasicInfo.Width) || 0,
height: Number(fileBasicInfo.Height) || 0
};
}
return result;
});
} else {
return [data];
}
}
文檔內容是否對您有幫助?