关于 vfx
vfx 是面向视频特效改造的工作流技能,使用 Pika MCP 的 Seedance 参考视频生成功能。它逐帧分析画面并理解音频,再编写提示词以保留原镜头并按时间点加入特效,生成前须经用户确认。
主要功能
- 01逐帧提取并分析视频
- 02分析对白、音乐与音效
- 03编写保留原镜头的 Seedance 提示词
- 04按音频节拍或时间点安排特效
- 05生成前展示提示词与估算成本
适用场景
- 01在指定节拍将广场变成沙漠
- 02为原视频添加降雪或火焰
- 03将服装变为发光盔甲
- 04保留人物动作与镜头运动并改造场景
MCP 相关
通过 Pika MCP 调用上传、媒体探测与分析、音频转录、费用估算及参考视频生成等工具。生成前需用户明确批准提示词、分辨率和费用。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ pika-labs/ pika-plugins --skill vfx安装后在 Claude Code 中输入/vfx确认已加载。
详细介绍
vfx
将视频到视频的 VFX 效果映射到 Pika MCP 的 Seedance 参考视频生成,默认使用 1080p(只有用户提出要求时,才提升到 4K 或降至 720p)。用户提供一个片段和想要的改动;你需要逐帧读取(在本地使用 ffmpeg 提取,并拼成联系表)并理解音频(语音 + 音乐 + 音效 + 环境音),编写忠实于 Seedance 的提示词,锁定原片(面部、手势、镜头运动),并将改动按时间码对应到正确的节拍,然后重新渲染同一个镜头,并将 VFX 效果融入其中。每次运行只生成一个片段,对应一项所需改动。
若要使用不提供分辨率选项、仅支持 4K 的此技能版本,请参阅
/pika:4k-vfx。
工作原理——为什么逐帧读取(以及音频)是关键步骤(不可跳过读取环节)
Seedance 将参考视频视为动作/风格锚点,而不是像素锁定的底片——它不会逐帧复制输入,而是根据提示词重新生成镜头。因此,忠实度取决于提示词:越详尽地描述原片(主体身份、确切手势、镜头运动、构图、光线、色调、服装)和音频(对白 + 唇形同步、音乐/音效节拍),输出就越像叠加了所需改动的同一个镜头,且适用于任何分辨率。**逐帧读取——而不是抽样读取——是构建详尽描述的方式:**你需要在本地使用 ffmpeg 提取所有帧,每 25 帧拼成一张联系表(5×5),并分析每张联系表,以便根据完整时间线而非少数静帧来编写提示词。跳过读取(或只抽样读取),输出就会偏离——变成另一张脸、另一种镜头运动、另一个房间,或错过某个动作节拍。读取环节——所有帧 + 音频——就是这项技能本身。
前提条件
运行环境中需提供 pika MCP 和本地 ffmpeg(用于提取每一帧并生成联系表)。用户需提供两项输入:(1)一个视频片段(本地文件或公开 URL)以及**(2)希望对其进行的 VFX 改动**。还可选提供第三项输入:(3)分辨率——若未指定,默认为 1080p。使用的工具:upload_asset、probe_media、analyze_media、transcribe_audio、estimate_cost、generate_reference_video、task_status(帧提取和拼接由本地 ffmpeg 完成,不使用 MCP 工具)。
阶段 0 — 收集输入(先确定这些)
生成前,你需要恰好两项内容,另有一个隐式默认值:
- 视频 — 要进行转换的原始片段。如果用户提供了本地文件,则需要上传(步骤 1);如果提供的是公开 URL,则保留该 URL。
- 更改 / 视觉特效 — 输出中需要有什么不同(例如,“打个响指时把广场变成开阔的沙漠”“让它下雪”“让我身后的房间着火”“把我的夹克变成发光盔甲”)。
- 分辨率(
state.resolution) — 除非用户的请求另有说明,否则默认为1080p。注意明确的信号:“4K”“最高画质”“最高分辨率” →state.resolution = "4k";“720p”“更便宜”“更快”“较低分辨率也可以” →state.resolution = "720p"。如果没有任何信号,则保持1080p——不要询问“你想要哪种分辨率?”,直接静默使用默认值,并让步骤 6 的确认关卡呈现此选项供用户确认。立即根据state.resolution设置state.seedance_model,因为步骤 6 会引用它:1080p或4k使用standard(fast/mini最高支持 720p——必需),720p使用fast(更便宜、更快,而且该分辨率下已经足够)。
如果视频或更改任一缺失,请先询问用户,除此之外不要做任何事——不要擅自编造更改,也不要对无法访问的片段继续操作。两者都准备好后,用一句话说明接下来要做什么(“我将读取片段的每一帧,生成打响指时切换成沙漠的 1080p 提示词……”),然后运行步骤 1–5,不再中途确认——但在步骤 6 的确认关卡处停止,等待用户同意后再生成:渲染成本高且不可撤销,只有用户批准提示词、分辨率和费用后才会启动。
步骤 1 — 上传片段(upload_asset)
必须上传真实视频——内联 base64 仅适用于极小的资源(<~3MB),因此任何实际片段都必须走预签名上传流程。
- 使用
filename、mime_type(mp4 对应video/mp4)和size_bytes(文件的字节大小)调用upload_asset。 - 将原始字节 PUT 到返回的
presigned_url。 - 保留返回的
public_url→state.clip_url。
如果用户已经提供了公开 URL,则跳过此步骤,并将其设为 state.clip_url。
步骤 2 — 探测(probe_media)
对 state.clip_url 调用 probe_media,读取时长、fps、尺寸和宽高比。使用这些信息:(a) 检查步骤 3 中的全帧提取是否合理(时长 × fps ≈ 总帧数 ≈ 25 × 图集数量);(b) 在此处选择与源视频匹配的输出 aspect_ratio 和 duration——步骤 6 的确认关卡会向用户说明此选择(以及阶段 0 中的 state.resolution),步骤 7 则会使用这些设置启动生成。
步骤 3 — 在本地提取每一帧并拼成联系表(ffmpeg)
读取整段视频,而不是抽样。使用本地 ffmpeg 按源帧率提取每一帧(不丢帧,无例外),然后将帧拼成清晰易读的联系表,每张 25 帧(5×5 网格),这样每次 analyze_media 调用就能一次覆盖连续的 25 帧。
在相对工作目录中操作(不要使用绝对系统临时路径):
mkdir -p frames sheets
ffmpeg -i INPUT -vsync 0 frames/f_%05d.png # every frame, no drops
然后生成每张 25 帧的联系表(5×5),缩小每帧以便联系表清晰易读,并在每个缩略图上标注帧索引:
ffmpeg -i INPUT -vf "scale=480:-1,drawtext=text='%{n}':x=4:y=4:fontsize=20:fontcolor=yellow:box=1:[email protected],tile=5x5" sheets/sheet_%03d.png
drawtext=text='%{n}' 会在每个缩略图上标注帧索引,以便分析时引用准确的帧;tile=5x5 会将连续的 25 帧分组成一张联系表。如果本地 ffmpeg 构建版本不支持 drawtext,则改用普通的 scale=480:-1,tile=5x5。INPUT 是本地片段(或 URL 的本地副本)。确认联系表数量与步骤 2 的探测结果一致——每一帧都必须出现在联系表中,无一例外。
步骤 4 — 查看每张联系表并理解音频(upload_asset、analyze_media、transcribe_audio)
这是确保保真度的步骤,包含两个必做部分:查看所有帧和理解音频。两者缺一不可。
4a — 读取所有帧(每张表格)
对于第 3 步中的每一张联系表(全部检查——每一帧都在某张表上,无一例外):使用 upload_asset 上传表格(表格是图片,因此上传后可获取 URL),然后对该表格 URL 调用 analyze_media,并使用 query 读取这 25 帧的完整变化过程,提取提示词必须锁定的所有内容:
- 主体/身份——画面中有谁/什么;面部、头发、体型、显著特征。
- 精确动作和手势——按节拍描述主体的动作,并引用帧上标注的索引(例如“约在第 0048 帧抬起右手,约在第 0072 帧打响指”)。
- 镜头运动——静止/摇摄/推进/手持/环绕,以及运动时机。
- 构图——景别(特写/中景/远景)、主体位置、头部留白。
- 光线——方向、硬度、色温、时间。
- 色调——主色、氛围。
- 服装/道具/场景——衣物、物品、背景。
综合读取所有表格,确保从头到尾了解完整时间线,而不只是抽查中间部分。
4b — 理解音频(必须执行,不仅限于语音)
始终读取音频——这是必需步骤,不可跳过。分两遍处理:
- 使用
transcribe_audio转录语音和时间戳(说了什么、何时说),以便提示词保留对白和口型同步的节拍。 - 对音频(或视频 URL)调用
analyze_media,以了解非语音音频——音乐、音效、环境声、基调和节奏/节拍。
在适当之处将对音频的理解融入提示词——如有人说话,则保留对白和口型同步;如果特效变化应该落在音乐或声音提示(例如打响指、撞击、强拍)上,而非单纯的时间戳上,就要将特效变化与音频节拍/声音提示对齐。
将对所有帧的读取结果和音频读取结果整合成一段对原内容的忠实描述——这是第 5 步的原始素材。
第 5 步 — 编写 Seedance 提示词(撰写步骤,绝不可跳过)
撰写一条提示词 = 对原内容的忠实、详尽描述(锁定元素)+ 用户要求的变更,按时间编码 + 通过 @Video1 标记引用输入片段。务必详尽:第 4 步读到的每项细节,只要有所省略,Seedance 就可以自由更改。
模板——根据第 4 步的读取结果填写 [SLOTS]([RESOLUTION LABEL] = 与 state.resolution 匹配的 4K/1080p/720p):
Re-render this exact shot @Video1 in cinematic [RESOLUTION LABEL]. LOCK the original: [SUBJECT/IDENTITY — face, hair, build, wardrobe], performing [EXACT GESTURES, beat by beat]. Keep the SAME camera move ([CAMERA: static / pan / push-in / handheld], [timing]), the SAME framing ([SHOT SIZE + subject position]), the SAME lighting ([direction, hardness, color temp, time of day]) and the SAME palette ([dominant colors / mood]). CHANGE: [the VFX], time-coded — at [t0]–[t1]s [what the scene looks like before the change], then at [t2]s [the change triggers / VFX appears] and [how the scene reads after]. Everything not described by the change stays identical to @Video1. Photorealistic, high detail, consistent identity throughout.
为变更标注时间码,让 Seedance 知道它相对于锁定动作在何时发生(例如:“0–3 秒时,主体抬手期间广场保持不变;3 秒时,在打响指的瞬间,广场逐渐变成一片开阔的沙漠,建筑被沙地和热浪取代,同时主体、镜头运动和构图保持不变”)。时间编码的变更描述越有力、越具体,Seedance 就越不容易忽略它。
Step 6 — 确认关卡(estimate_cost)——生成前必须完成
渲染是成本高昂的步骤,而且一旦启动,费用就无法撤回。**未经用户在本次会话中明确批准,绝不要调用 generate_reference_video。**在一条消息中展示:
- 完整的第 5 步提示词——逐字呈现,让用户能在花费成本前检查是否有细节错误(面部、手势、时间安排)。
- 生成方案——提供商
seedance、模型state.seedance_model、分辨率state.resolution(明确说明除非用户另有要求,否则为1080p),以及你根据第 2 步探测结果选择的aspect_ratio和duration。 - 预估费用——为第 7 步的
generate_reference_video调用执行estimate_cost,并引用结果。如果估算出错,要说明费用未知;如果选择的是 4K,还要提示这是最高价位;不要悄悄略过费用。
然后等待。有三种结果:
- 批准 → 不作更改,继续第 7 步。
- 修改——用户更正某项细节、变更说明或分辨率 → 更新第 5 步提示词(如果更正需要,重新阅读相关表格),并重新呈现确认关卡。
- 取消/未回复 → 不要生成。绝不要把沉默视为批准。
只有在用户明确预先授权了本次会话中的费用(“直接运行,不用问”,或长期有效的无需确认即可渲染的指示)时,才能跳过此关卡。用户提供了片段和变更要求并不等于预先授权——这只是第 0 阶段的输入。
Step 7 — 生成(Seedance 参考视频转视频)(generate_reference_video)
调用 generate_reference_video,并根据 state.resolution 匹配以下方案:
provider:seedanceseedance_model:state.seedance_model——在第 0 阶段设置(1080p/4k使用standard,因为fast/mini最高仅支持 720p;720p使用fast)。resolution:state.resolution——除非第 0 阶段/第 6 步确认关卡确定使用4k或720p,否则为1080p。reference_videos:[state.clip_url]——将原始素材作为动作/风格参考(Seedance 最多接受 3 个视频)。reference_images:可选——风格/生物/身份参考(例如生成的参考图),仅在有此类图片时使用。prompt:第 5 步提示词(使用@Video1token 引用输入片段;没有最大长度限制,因此应尽可能详尽)。aspect_ratio:auto(或与第 2 步的源视频匹配)。duration:与源视频匹配,或将auto_duration设置为true。
不要传入 negative_prompt(seedance 不支持,会拒绝调用),也不要传入任何 fps 参数(不存在此参数)。
Step 8 — 交付
如果调用直接返回结果,你就会获得视频 URL。如果返回 { task_id, status: running/background },则紧密循环轮询 task_status(task_id),直到状态变为 completed/failed/cancelled。完成后,将视频 URL返回给用户。注意:输出 CDN 可能会阻止会话内下载,因此应直接交付 URL,而不要尝试在本地获取视频数据。
失败模式
| 症状 | 原因 → 解决方法 |
|---|---|
| 视频片段过长 / 文件过大 | 大文件仍可上传;如果 Seedance 因时长而拒绝,请将源素材剪辑到关键片段,或设置 auto_duration: true 并匹配更短的 duration。 |
| 读取时未找到人脸 / 主体 | 某张联系表可能未能清楚呈现主体——请对涵盖主体可见帧的特定联系表重新运行 analyze_media(使用标注的帧索引),或重新生成联系表且不缩小尺寸,以保留细节。不要改用抽样提取——每一帧都必须保留在联系表中。 |
缺少 ffmpeg / 无法使用 drawtext | 运行环境需要本地 ffmpeg;如果构建版本缺少 drawtext 滤镜,请改用纯 scale=480:-1,tile=5x5(联系表不带标注的索引——仍需读取每一帧)。 |
| 身份 / 镜头偏移(输出中出现不同的人脸、房间或摄像机移动) | 提示词描述不够全面。返回步骤 4–5,根据联系表的读取结果补充缺失的锁定细节(例如更多面部特征、手势、摄像机移动和光线信息)——Seedance 只会保留提示词中明确写出的内容。重新渲染 = 新一笔费用:再次运行前,使用修订后的提示词重新通过步骤 6 的审批关卡。 |
| 请求的分辨率遭拒 / 输出分辨率降低 | seedance_model 必须设为 standard,才能使用 1080p 或 4k——fast/mini 会静默限制为 720p。如果使用错误参数的调用已完成(并已收费),修正后的调用将是第二次渲染——再次运行前,请重新通过步骤 6 的审批关卡;如果调用直接遭拒(未收费),则可在原审批范围内重新运行修正后的调用。 |
| 语音 / 音频未保留或变化与节拍不同步 | 对音频同时运行 transcribe_audio(语音 + 时间信息)和 analyze_media(音乐 / 音效 / 环境音),然后在提示词中描述对话 + 唇部动作的节拍,并将带时间码的变化点对应到正确的音频提示音 / 节拍,以确保重新渲染时保持同步。 |
| Seedance 忽略请求的变化 | 强化步骤 5 中带时间码的变化描述——写得更具体,并明确锚定时间(“在第 N 秒触发变化”)。修订后的提示词是新的、从未获批的提示词,重新渲染也会产生新费用:再次运行前,请重新通过步骤 6 的审批关卡。 |
| 任务运行很久后失败 | 如果运行了几分钟才失败,说明内容已通过安全检查——问题出在基础设施;使用相同调用重新运行即可(用户对步骤 6 的审批涵盖重试相同的、已获批调用——无需重新审批)。 |
一句话回顾
使用本地 ffmpeg 提取每一帧 → 按每张 25 帧(5×5)平铺成联系表并分析每张联系表 → 理解音频(转录语音 + 分析音乐 / 音效 / 环境音)→ 编写详尽且忠实于 Seedance 的提示词,锁定原始内容,并将变化的时间码对应到正确的音频节拍 → 审批关卡:展示提示词 + 配方(默认分辨率为 1080p,按需使用 4K/720p)+ estimate_cost,并等待批准 → 通过 generate_reference_video(seedance,模型与分辨率匹配,原视频作为 reference_videos,提示词中使用 @Video1,不使用 negative_prompt)重新渲染同一镜头。