auto-save 2026-05-13 21:24 (~6)

This commit is contained in:
2026-05-13 21:24:32 +08:00
parent d4eb18e5f8
commit 2befdf4e40
6 changed files with 81 additions and 17 deletions

View File

@@ -250,6 +250,7 @@ export default function Home() {
`竖屏 9:16${duration.toFixed(1)}SKG 产品短视频广告。`,
"直接根据当前分镜关键帧生成视频。必须使用输入的完整视频关键帧作为第一帧和视觉锚点:第一帧构图、主体位置、透视关系和光线方向保持稳定,然后从这一帧自然动起来。",
"生成一段单镜头连续视频,一镜到底,不要跳切,不要突然换场景,不要突然换主体,不要蒙太奇,不要多镜头拼接。",
"如果提供了原视频链接,把它只作为节奏、镜头运动、动作顺序和画面调度参考;不要照搬原视频里的品牌、文字、水印、竞品产品或具体人物。",
"时间线0%-25% 保持首帧构图并轻微启动25%-70% 做一个清晰、缓慢、可信的产品展示动作70%-100% 镜头自然停稳在 SKG 产品或使用效果特写。",
`主体改造:${subjectDirection}`,
`产品替换:${productDirection}`,
@@ -274,6 +275,7 @@ export default function Home() {
frame_idx: frameIdx,
label: `分镜 ${frameIdx + 1} 关键帧`,
}
const sourceUrl = job.url?.trim()
const updated = await generateStoryboardVideo(job.id, frameIdx, {
prompt,
duration,
@@ -281,6 +283,7 @@ export default function Home() {
scene_image: null,
product_image: null,
action_image: null,
source_ref: sourceUrl ? { kind: "source_video", url: sourceUrl } : null,
model,
size: "720x1280",
})

View File

@@ -122,7 +122,6 @@ export function StoryboardWorkbench({ job, selectedFrames, open, onClose, onJobU
window.addEventListener("pointerup", onUp)
}
const hasVideoRefs = !!(form.subject_image || form.scene_image || form.product_image || form.action_image)
const currentModelLabel = VIDEO_MODELS.find((m) => m.value === videoModel)?.label ?? "Seedance"
return (
@@ -303,7 +302,7 @@ export function StoryboardWorkbench({ job, selectedFrames, open, onClose, onJobU
</div>
</div>
<button
disabled={!hasVideoRefs || focusedIdx === null || generating}
disabled={focusedIdx === null || generating}
onClick={async () => {
if (focusedIdx === null) return
queueSave(form)
@@ -315,13 +314,13 @@ export function StoryboardWorkbench({ job, selectedFrames, open, onClose, onJobU
}
}}
className="w-full py-3 rounded-lg text-[13.5px] font-semibold inline-flex items-center justify-center gap-2 bg-gradient-to-r from-rose-500 to-violet-500 text-white border border-violet-300/40 shadow-lg shadow-violet-500/20 hover:from-rose-400 hover:to-violet-400 disabled:opacity-40 disabled:cursor-not-allowed"
title={hasVideoRefs ? `调用 ${currentModelLabel} 生视频 API,结果进入 Video Gen 节点` : "先粘贴至少一张参考图"}
title={`用当前分镜关键帧作为首帧,调用 ${currentModelLabel} 生视频 API`}
>
{generating ? <Loader2 className="h-4 w-4 animate-spin" /> : <Wand2 className="h-4 w-4" />}
{currentModelLabel}
</button>
<div className="mt-2 text-[10.5px] text-white/35 leading-relaxed">
4 API MP4 Video Gen
4 MP4 Video Gen
</div>
</section>
</div>

View File

@@ -382,6 +382,7 @@ export async function generateStoryboardVideo(
scene_image?: ImageRef | null
product_image?: ImageRef | null
action_image?: ImageRef | null
source_ref?: { kind: "image" | "source_video"; url: string } | null
model?: string
size?: string
},