4k-vfx について
動画間の VFX 編集を Pika MCP の Seedance 4K 参照動画生成に結び付けるスキルです。全フレームと音声を分析してショットの特徴を保つタイムコード付きプロンプトを作成し、生成前にプロンプトと費用の承認を求めます。
主な機能
- 01ffmpeg による全フレームの抽出と確認
- 02会話、音楽、効果音の分析
- 03ショットの特徴を保つ Seedance プロンプト作成
- 04動作や音声のビートに合わせた VFX の指定
- 05生成前の費用提示と承認待ち
活用シーン
- 01既存の動画に指定した視覚効果を追加
- 02動作や音声の合図に合わせて効果を出す
- 03生成前にショットの説明と費用を確認
MCP 対応
Pika MCP のメディア分析、音声文字起こし、費用見積もり、Seedance 参照動画生成ツールを利用します。フレーム抽出とコンタクトシート作成はローカルの ffmpeg で行います。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ pika-labs/ pika-plugins --skill 4k-vfxインストール後、Claude Code で/4k-vfxを入力して読み込まれたか確認します。
詳細
4k-vfx
動画から動画へのVFX編集を、Pika MCP のSeedance 4K reference-to-videoに反映します。ユーザーからクリップと希望する変更を受け取り、すべてのフレームを読み込み(ffmpeg でローカルに抽出してコンタクトシートにタイル化)、音声(会話、音楽、効果音、環境音)を理解します。そのうえで、元の映像(顔、ジェスチャー、カメラの動き)を維持しつつ、変更を適切なビートにタイムコードで指定した、Seedance に忠実なプロンプトを作成し、VFX を合成した状態で同じショットを 4K で再生成します。1 回の実行につき、指定された 1 つの変更を反映した 4K クリップを 1 本生成します。
動作の仕組み — すべてのフレーム(と音声)を読み込むことが重要な理由(読み込みを省略しないでください)
Seedance は参照動画を動き/スタイルのアンカーとして扱い、ピクセル単位で固定されたベースとしては扱いません。入力をフレームごとにコピーするのではなく、プロンプトに基づいてショットを再生成します。そのため、忠実度を左右するのはプロンプトです。元の映像(被写体の同一性、正確なジェスチャー、カメラの動き、フレーミング、照明、色調、衣装)と音声(台詞とリップシンク、音楽/効果音のビート)を詳細に説明するほど、変更を重ねた 4K 出力が元と同じショットとして認識されやすくなります。**一部ではなくすべてのフレームを読むことが、この詳細な説明を作る方法です。**ffmpeg で全フレームをローカルに抽出し、25 枚ずつ(5×5)コンタクトシートにタイル化して、プロンプトを数枚の静止画ではなくタイムライン全体に基づいて作成できるよう、各シートを分析します。読み込みを省略したり、一部だけを読んだりすると、出力にずれが生じます。顔が変わる、カメラの動きが変わる、部屋が変わる、動きのビートが抜ける、といった問題が起きます。すべてのフレームと音声を読み込むことこそが、このスキルです。
前提条件
pika MCP が利用可能であること、また実行環境にローカルの ffmpeg があること(全フレームの抽出とコンタクトシートの作成に使用します)。ユーザーから受け取る入力は 2 つです。(1)動画クリップ(ローカルファイルまたは公開 URL)と、(2)適用したい VFX 変更です。使用するツールは upload_asset、probe_media、analyze_media、transcribe_audio、estimate_cost、generate_reference_video、task_status です(フレームの抽出とタイル化は MCP ツールではなく、ffmpeg を使ってローカルで行います)。
ステージ 0 — 入力を集める(まずこれを確定します)
生成の前に必要なのは、次の 2 つだけです。
- 動画 — 変換する元のクリップです。ローカルファイルが指定された場合はアップロードします(ステップ 1)。公開 URL が指定された場合は、そのまま使用します。
- 変更/VFX — 出力で何を変えるかです(例:「指を鳴らした瞬間に広場を開けた砂漠に変える」、「雪を降らせる」、「自分の後ろで部屋に火をつける」、「ジャケットを光る鎧に変形させる」)。
どちらか一方でも欠けている場合は、ほかの作業を始める前にユーザーに確認してください。変更を勝手に考案したり、アクセスできないクリップで処理を進めたりしないでください。両方がそろったら、これから行うことを 1 行で伝え(「クリップの全フレームを読み込み、指を鳴らすと砂漠に変わる 4K 用プロンプトを作成します……」など)、追加の確認を挟まずにステップ 1~5 を実行します。ただし、生成前のステップ 6 の合意ゲートで必ず停止してください。4K レンダリングは高コストで、取り消せない処理です。ユーザーがプロンプトと費用を承認した場合にのみ実行します。
ステップ 1 — クリップをアップロードする(upload_asset)
実際の動画はアップロードする必要があります。インライン Base64 が使えるのは小さなアセット(約 3MB 未満)だけなので、通常のクリップはすべて、署名付きアップロードの手順で送信します。
filename、mime_type(mp4 の場合はvideo/mp4)、size_bytes(ファイルのバイト数)を指定してupload_assetを呼び出します。- 返された
presigned_urlに生のバイトデータを PUT します。 - 返された
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 のゲートでユーザーに提示し、ステップ 7 ではその値を使って処理を実行します。
ステップ 3 — すべてのフレームをローカルで抽出し、コンタクトシートにタイル化する(ffmpeg)
サンプルではなく、動画全体を読み取ってください。ローカルの ffmpeg を使って、ソースのフレームレートですべてのフレームを抽出し(間引きや例外は一切なし)、読みやすいコンタクトシートに**1 シートあたり 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 フレームを 1 シートにまとめます。ローカルの ffmpeg ビルドで drawtext を使用できない場合は、scale=480:-1,tile=5x5 にフォールバックしてください。INPUT はローカルのクリップ(または URL のローカルコピー)です。シートの枚数がステップ 2 のプローブ結果と一致することを確認してください。例外なく、すべてのフレームがシートに含まれていなければなりません。
ステップ 4 — すべてのシートを読み取り、音声を把握する(upload_asset、analyze_media、transcribe_audio)
これは忠実度を高めるステップであり、必須の作業が 2 つあります。すべてのフレームを読み取ることと音声を把握することです。どちらも省略できません。
4a — すべてのフレームを読み取る(全シート)
ステップ 3 の各コンタクトシートについて(すべてのフレームがシートに含まれているため、すべてを対象にし、例外はありません)、upload_asset でアップロードします(シートは画像なので、URL を取得するためにアップロードします)。次に、そのシートの URL を使って analyze_media を呼び出し、連続する 25 フレームの全体的な流れを読み取る query を指定します。プロンプトで固定すべき内容をすべて抽出してください。
- 被写体/人物の特定 — フレームに映っている人物や物。顔、髪型、体格、識別できる特徴。
- 正確な動きとジェスチャー — 被写体が何をするかを動作ごとに記述し、刻印されたフレーム番号を参照します(例:「フレーム 0048 前後で右手を上げ、フレーム 0072 前後で指を鳴らす」)。
- カメラの動き — 固定/パン/プッシュイン/手持ち/オービットと、そのタイミング。
- フレーミング — ショットのサイズ(クローズ/ミディアム/ワイド)、被写体の位置、ヘッドルーム。
- ライティング — 光の方向、硬さ、色温度、時間帯。
- カラーパレット — 支配的な色、雰囲気。
- 衣装/小道具/設定 — 服装、物、背景。
すべてのシートにわたって読み取りを続け、サンプリングした中間部分だけでなく、タイムライン全体を最初から最後まで把握してください。
4b — 音声を把握する(必須。発話だけではありません)
音声は必ず読み取ってください。これは必須であり、省略できません。次の 2 段階で行います。
transcribe_audioで発話とタイムスタンプを取得します(何を、いつ話すか)。プロンプトでセリフとリップシンクのタイミングを維持できるようにします。- 音声(または動画 URL)に対して
analyze_mediaを実行し、発話以外の音声も把握します。音楽、効果音、環境音、音調、リズム/ビートを確認します。
必要な箇所で音声の情報をプロンプトに反映します。誰かが話す場合はセリフとリップシンクを維持し、VFX の変化をタイムスタンプだけでなく音楽や音(例:指を鳴らす音、ヒット音、ダウンビート)に合わせるべき場合は、音のビート/キューに合わせてタイミングを設定します。
全フレームの読み取り結果と音声の読み取り結果を合わせ、元の内容を忠実に記述してください。この記述がステップ 5 の素材になります。
Step 5 — Seedance プロンプトを作成する(作成ステップ。絶対に省略しないこと)
プロンプトを1つ作成します。元の内容を忠実かつ漏れなく記述したもの(固定する要素)+ユーザーが希望した変更(タイムコード付き)+入力クリップへの参照としての @Video1 トークンで構成します。詳細に記述してください。Step 4 で確認した内容を1つでも省略すると、その内容は Seedance が自由に変更できるようになります。
テンプレート — Step 4 で確認した内容を [SLOTS] に記入してください。
Re-render this exact shot @Video1 in cinematic 4K. 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)— 生成前に必須
4K レンダリングは高額なステップであり、実行すると取り消せません。このセッションでユーザーから明示的な承認を得る前に、generate_reference_video を呼び出してはなりません。 次の内容を1つのメッセージで提示します。
- Step 5 のプロンプト全文 — ユーザーが費用発生前に、誤った詳細(顔、ジェスチャー、タイミング)を確認できるよう、原文どおりに提示します。
- 生成レシピ — プロバイダー
seedance、モデルstandard、解像度4kに加え、Step 2 の確認結果から選んだaspect_ratioとduration。 - 推定費用 — Step 7 の
generate_reference_video呼び出しに対してestimate_costを呼び出し、その結果を提示します。推定に失敗した場合は費用が不明であることを伝え、4K standard が最も高額な価格帯であることを明示してください。数値を黙って省略してはなりません。
その後、待ちます。結果は次の3つです。
- 承認 → 変更を加えずに Step 7 へ進みます。
- 修正 — ユーザーが詳細や変更指示を修正した場合 → Step 5 のプロンプトを更新し(修正内容に応じて該当するシートを再確認し)、承認ゲートを再提示します。
- 中止/回答なし → 生成してはなりません。沈黙を承認とみなしてはなりません。
ユーザーがこのセッション内で費用を明示的に事前承認している場合に限り、このゲートを省略できます(「確認せずに、そのまま実行して」や、確認なしでレンダリングするという継続的な指示など)。クリップと変更内容が提供されているだけでは事前承認になりません。それらは Stage 0 の入力にすぎません。
Step 7 — 生成(Seedance 4K の参照動画生成)(generate_reference_video)
generate_reference_video を、次の4Kレシピどおりに呼び出します。
provider:seedanceseedance_model:standard— 4k では必須です(fast/mini は720pが上限です)。resolution:4kreference_videos:[state.clip_url]— 動き/スタイルの基準として元の映像を指定します(Seedance は最大3本の動画を受け付けます)。reference_images: 任意 — スタイル/クリーチャー/アイデンティティの基準(生成した参照画像など)。用意できている場合に限ります。prompt: Step 5 のプロンプト(入力クリップを参照するために@Video1トークンを使用します。最大長がないため、詳細に記述してください)。aspect_ratio:auto(または Step 2 で確認したソースの値に合わせます)。duration: ソースに合わせるか、auto_duration:trueを設定します。
negative_prompt は渡さないでください(seedance ではサポートされておらず、呼び出しが拒否されます)。また、fps パラメーターも渡さないでください(そのようなパラメーターはありません)。
Step 8 — 納品
呼び出し結果がインラインで返された場合は、4K 動画の URL を取得できます。{ task_id, status: running/background } が返された場合は、completed/failed/cancelled になるまで task_status(task_id) を短い間隔で繰り返し呼び出してポーリングします。完了したら、ユーザーに 4K 動画の URL を返します。注:出力 CDN からのダウンロードはセッション内でブロックされる場合があります。ローカルでバイトデータを取得しようとせず、URL 自体を納品してください。
失敗モード
| 症状 | 原因 → 対処 |
|---|---|
| クリップが長すぎる/大きすぎる | 大きなファイルでもアップロードはできます。Seedance が長さを理由に拒否する場合は、重要な部分に合わせて元の動画をトリミングするか、auto_duration: true を設定して、より短い duration を指定します。 |
| 読み取りで顔/被写体が見つからない | シートでは被写体がはっきり見えない場合があります。被写体が見えているフレームを含む特定のシートで analyze_media を再実行してください(スタンプされたフレームインデックスを使います)。または、ディテールが保たれるように、ダウンスケールせずにシートを作り直します。サンプリング抽出に切り替えてはいけません。すべてのフレームがシートに残ります。 |
ffmpeg がない/drawtext が使えない | 実行環境にローカルの ffmpeg が必要です。ビルドに drawtext フィルターがない場合は、scale=480:-1,tile=5x5 のみを使います(インデックスのスタンプは付かないシートですが、すべてのフレームを読み取ります)。 |
| 出力で同一性/ショットがずれる(顔、部屋、カメラワークが異なる) | プロンプトの説明が十分に網羅的ではありませんでした。ステップ 4~5 に戻り、コンタクトシートの読み取りから不足している固定要素(顔、ジェスチャー、カメラワーク、ライティングなど)を追加します。Seedance が維持するのは、プロンプトで指定された内容だけです。再レンダリングには新たな費用がかかります。再実行前に、修正したプロンプトでステップ 6 の承認ゲートを再度通過してください。 |
| 4k が拒否される/出力の解像度が下がる | seedance_model: standard(fast/mini は 720p が上限です)と resolution: 4k が指定されていることを確認します。誤ったパラメーターの呼び出しがすでに完了し、課金されている場合、修正した呼び出しは 2 回目のレンダリングとなります。再実行前にステップ 6 の承認ゲートを再度通過してください。呼び出しが完全に拒否され、課金されていない場合は、元の承認のもとで修正した呼び出しを再実行してください。 |
| 音声/音声データが維持されない、または変更がビートからずれる | transcribe_audio(音声とタイミング)と、音声に対する analyze_media(音楽/効果音/環境音)の両方を実行します。その後、プロンプトでセリフとリップシンクのタイミングを説明し、タイムコード付きの変更を適切な音声キュー/ビートに結び付けて、再レンダリングでも同期が保たれるようにします。 |
| Seedance が要求した変更を反映しない | ステップ 5 のタイムコード付き変更の指示を強化し、より具体的にするとともに、時間を明示します(「N 秒時点で変更が発生する」など)。修正したプロンプトは新規の未承認プロンプトであり、再レンダリングには新たな費用がかかります。再実行前にステップ 6 の承認ゲートを再度通過してください。 |
| 長時間の実行後にジョブが失敗する | 数分間実行された後に失敗した場合、コンテンツはすでに安全性チェックを通過しています。失敗はインフラストラクチャに起因するため、同じ呼び出しを再実行してください(ユーザーによるステップ 6 の承認には、すでに承認された同一の呼び出しの再試行も含まれるため、承認ゲートを再度通過する必要はありません)。 |
1 行まとめ
ローカルで ffmpeg を使ってすべてのフレームを抽出 → 25 フレームずつ(5×5)のコンタクトシートに並べ、すべてのシートを分析 → 音声を把握(音声を文字起こしし、音楽/効果音/環境音を分析) → 元の映像を忠実に固定し、適切な音声ビートに合わせて変更をタイムコードで指定する、網羅的な Seedance 用プロンプトを作成 → 承認ゲート:プロンプト+レシピ+estimate_cost を提示し、承認を待つ → generate_reference_video を使って同じショットを 4K で再レンダリング(seedance/standard/4k、reference_videos に元の動画を指定、プロンプトで @Video1 を使用、negative_prompt は使用しない)。