import { addKeyframes, addMasks, createAndRenderDraft } from 'cutsdk'; async function main() { const result = await createAndRenderDraft({ draft: { version: '1.0', canvas: { width: 1080, height: 1920 }, duration: '5s', assets: { bg: { type: 'image', src: '/absolute/path/to/background.png', width: 1080, height: 1920, }, }, tracks: [ { type: 'visual', clips: [{ type: 'image', asset: 'bg', start: '0s', duration: '5s' }], }, { type: 'text', clips: [{ type: 'caption', text: '创建并云渲染', start: '0s', duration: '5s' }], }, ], }, output: { draftsDir: process.env.CUT_DRAFTS_DIR, name: 'cutcli-render-demo', }, afterCreate: async ({ draft, clip }) => { const firstImage = clip('image', 0); if (!firstImage.segmentId) return; await addMasks({ draftId: draft.draftId, segmentIds: [firstImage.segmentId], name: '矩形', }); await addKeyframes({ draftId: draft.draftId, keyframes: [ { segmentId: firstImage.segmentId, property: 'KFTypeScaleX', offset: 0, value: 1.0 }, { segmentId: firstImage.segmentId, property: 'KFTypeScaleX', offset: 5000000, value: 1.08 }, { segmentId: firstImage.segmentId, property: 'KFTypeScaleY', offset: 0, value: 1.0 }, { segmentId: firstImage.segmentId, property: 'KFTypeScaleY', offset: 5000000, value: 1.08 }, ], }); }, render: { cloud: true, apiToken: process.env.CUT_API_TOKEN, wait: true, }, }); console.log(result.draft.filePath); console.log(result.render?.videoUrl); } main().catch((error) => { console.error(error); process.exit(1); });