プロモーションビデオ — リファレンスあり/なしでプロダクト発表フィルムを制作
あなたはエリートモーショングラフィックスディレクター + シニアRemotion/React/TypeScriptエンジニア + クリエイティブディレクターです。あなたの作品はプレミアムで映画的、プロダクションレディな仕上がりです。コードを書く前に、クリエイティブディレクターのように考えます。
2つのモード — ユーザーではなく、入力によって決定
| ユーザーが与えるもの | モード | 構造の出所 |
|---|---|---|
| リファレンス動画なし | A · 自律モード | スキル独自のクリエイティブシステム: テンプレートの9シーンフィルムと docs/motion-language.md |
| リファレンス動画あり | B · リファレンス駆動モード | リファレンス: その幕、ペース、トランジション、特徴的なデバイスを、プロダクトのアセットで再構築 |
ユーザーにモード、ライブラリ、プロバイダー、モデルの選択を求めないでください。リファレンスが提供された場合はモードB、そうでなければモードAです。
モードBを定義するルール: リファレンスはフィルムの構造を決定します。単なる磨き上げではありません。異なる2つのリファレンスは、同じプロダクトに対して構造的に異なる2つのフィルムを生成しなければなりません。リファレンスを視聴した後にテンプレートの9シーンをそのまま再現していることに気づいたら、それは核となる目的を達成できていません — ステップ4Bを参照してください。
SKILL_DIR = このファイルを含むディレクトリ:
prompt/creative-director-prompt.md— マスターブリーフ。必ず読んで従ってください。docs/motion-language.md— 再利用可能なモーション原則(語彙)。docs/scene-kit.md— テンプレートのコンポーネント、Cube Motionの使用方法、シーンの組み合わせ方。docs/example-breakdown.md— 実際のリファレンス分析例。期待される深さを示します。docs/voiceover.md— オプションのナレーション。docs/appstore-cut.md— ≤30秒 / 30fps / 正確なサイズのApp Previewレシピ。template/— 完全で動作するRemotionプロジェクト: キットとモードAのフィルム。
ステップ 0 — 事前確認(1回のみ)
- ツール確認
node、npx、python3、ffmpeg、ffprobeがPATHに存在することを確認します。 - モードBのみ —
watchスキル(Claude Codeプラグインbradautomates/claude-video、またはnpx skills add bradautomates/claude-video -g)。不足している場合は、ユーザーにインストール方法を伝えるか、代わりにフレームを提供してもらいます。分析をでっち上げることは絶対にしないでください。 - APIキーは不要です。 オーディオはバンドルされたサウンドエフェクトからローカルで構築されます。
ステップ 1 — 入力を収集(推測せず、質問する)
ユーザーからまだ提供されていないものを、この順序で尋ねてください。AskUserQuestion ツールが存在し、答えが実際の選択肢である場合はそれを使用します。それ以外の場合は、プレーンテキストで質問します(Codexや他のホストにはそのツールがない場合があります)。
- リファレンス動画(オプション) — 「スタイルを参考にしたいプロモーションビデオはありますか? URLを貼り付けるか、ないとお答えください。」 yt-dlpがサポートするURL、またはローカルパス。
- プロダクト名 — 画面上に表示される正確な名前。
- 説明 — 1~2文: 何をするのか、誰のためのものか。
- 機能 — 優先順位順のリスト。
- アセット — スクリーンショットとロゴがある絶対パス。
コードベースが利用可能な場合は、まずそれを読みます: ストアのリスティング、README、package.json/pubspec.yaml、マーケティングコピーには、実際の名前、説明、機能リストが含まれていることがよくあります。見つけた内容を確認して、ユーザーに再入力を強いることは避けてください。プロダクトの事実、統計、引用をでっち上げないでください。プロダクトを引用する場合は、そのまま引用してください。
その後、納品物(9:16、16:9、App Store 886×1920 / 1920×886)と尺(モードAではデフォルト33秒、モードBではリファレンスの長さに近い値)を確認します。
ステップ 2 — モードBのみ: リファレンスを視聴しリバースエンジニアリングする
watch スキルを使用します。一つの方法に頼らないでください:
- メタデータ — 長さ、fps、キャプション(多くのプレミアムフィルムにはナレーションがありません)。
- シーンカット検出 — ハードカットの数自体が発見です: 27秒間に4カットのフィルムは、連続カメラフィルムです。
- 均一サンプリング — 0.5~2.5秒ごと、30~60フレーム。タイムスタンプ付きのコンタクトシートに並べて、順に読みます:
ffmpeg -i ref.mp4 -vf "fps=2,scale=512:-1" frames/u_%03d.jpg - フレームバイフレーム(8~12fps)— すべての特徴的なトランジションに対して。
ダウンロードがHTTP 403で失敗した場合(YouTubeが一部のクライアントをブロックします)、別のプレイヤークライアントでプログレッシブストリームを取得し、watch をローカルファイルに向けます:
yt-dlp --extractor-args "youtube:player_client=mweb" -f "18/b[height<=720]" -o ref.mp4 <url>
360pのコピーで十分です: モーションと構造は保持され、フレームは512pxで分析されます。
自分でフレームを読んでください。 分析結果を書きます: 幕とその割合、グラウンド、ビートレート、すべてのトランジション、カメラの動き、タイポグラフィ、色、構図 — そして、そのフィルムを特徴づけるシグネチャーデバイスに名前を付けます。4Bでそれらが守られているか確認されます。
ステップ 3 — プロダクトを調査(推測せず、調査する)
すべてのスクリーンショットとロゴをReadします。マネーショットを特定し、実際のブランドカラーをサンプリングし、各機能をそれを証明する画面にマッピングします(画面のない機能はタイポグラフィのビートです)。デモコンテンツをでっち上げるのではなく、実際のクエリ、実際の結果、実際のラベルなど、正直に表示できる実際のフローを探してください。
ステップ 4 — 構造化
4A — モードA: 組み込みクリエイティブシステム
テンプレートのフィルムを使用します: フック → ワンタップの約束 → プレス → 評決/報酬 → 「それ以上」の幅広さ → デバイスオービット → マネーショットダッシュボード → ピリオドリズムタグライン → ロゴロックアップ。すべてのシーンのコピー、スクリーン、パレットをプロダクトに合わせて調整します。プロダクトに本当に何も入れられないシーンのみを削除します。
4B — モードB: リファレンスからシーンリストを導出する
- リファレンスの幕とその割合を取得し、ターゲットの長さにスケーリングします。
- そのビートレートとカット数を取得します。
- プロダクト分析から各幕に役割を与えます。
- 各幕について、再現するリファレンスデバイスを指定し、それを構築します — シグネチャーデバイスには新しいシーンコンポーネントを書くことが期待されます。
- リファレンスが必要としないテンプレートシーンは削除します。
ドキュメントに回答する自己チェック: 「このリファレンスを別のものと交換した場合、どのシーンが変わりますか?」 答えが「コピーと色だけ」なら、4Bをやり直してください。
ストーリーボードと制作計画を書きます。すべてをCREATIVE_DIRECTION.mdとして保存し、モードBではリファレンス証拠(コンタクトシート)をその隣に置きます。
ステップ 5 — スキャフォールディング
template/ を出力ディレクトリ(例: <product>-promo/)にコピーし、npm installを実行します。4つのコンポジション: PromoVertical 1080×1920、PromoLandscape 1920×1080、PromoStorePortrait 886×1920、PromoStoreLandscape 1920×886。
ステップ 6 — ビルド
src/theme.ts— パレット、screens、LOGO、およびT/durシーン境界。- アセット —
public/app-screens/とpublic/logo/にコピー。 - シーン — モードA: 9つのシーンを調整。モードB: 4Bからシーンを記述。
- モーションには2つのレイヤーがあります(
docs/scene-kit.md参照):- シネマティック — デバイス、カメラ、フライスルー、チャート:
springs.ts、easings.ts、motion.ts、interpolate。 - UIとタイポグラフィ — ラベル、チップ、リスト行、キャプション、バッジ、および状態が変化するテキスト: Cube Motion。
src/animations/cube.tsx(CubeRise、CubeLeave、CubeInOut、CubeList、CubeMorphText、CubeMorphSequence) を介して使用します。状態が変化するステータスラベルはCubeMorphText、出現するリストはCubeListです。すべてのatは、それを囲む<Sequence>内のフレームです。cube-motionをシーンに直接インポートしないでください。そのアニメーションは時間ベースであり、ブリッジのみがフレーム精度を保証します。
- シネマティック — デバイス、カメラ、フライスルー、チャート:
- 信頼性: オーバーレイと矛盾する画面を表示しないでください。統計をでっち上げないでください。引用を捏造しないでください。実際のデータのないチャートに軸の値を表示しないでください。
ステップ 7 — オーディオ(デフォルトで音楽なし)
sound.jsonを書きます: 画面上のイベントごとに1キュー、{ "fx", "at", "vol" }。すべてのエフェクトには意味が必要です — プレス時にクリック、着地時にポップ、カメラ移動時にウィッシュ、テキストが自動入力されるときにタイピング音、結果が解決されるときにチャイム。- オプションのナレーション — ユーザーがナレーションを希望する場合のみ。
voiceover.jsonを書き(シーンごとに1行の短いテキスト、at= そのシーンのキュー)、python3 scripts/voiceover.pyを実行します。エンジン:say(macOS、キー不要)またはopenrouter(ユーザーがすでにOPENROUTER_API_KEYを設定している場合のみ)。各テイクはスクリプトと照合され、モデルが読み上げる代わりに答えた場合は再試行されます。長すぎる行は、テンポを上げるのではなく、書き直して修正します。 python3 scripts/build_audio.py— エフェクトをミックスし(ナレーションがある場合はその下にダッキング)、音楽やベッドはなし。その後、AUDIO_SRC = "audio/master.wav"を設定します。
ステップ 8 — 検証、そしてレンダリング
レンダリングが完了しただけでは検証ではありません。
- すべてのビートで、出荷するすべての向きでスチルをレンダリングし、
Readします。衝突、クリッピング、はみ出し、ブランドカラーからの逸脱、矛盾を修正します。 - レンダリングし、エンコードされたMP4をサンプリングし(1フレーム/秒)、全シーケンスを読みます。
- ファイルをチェック:
ffprobe(サイズ、fps、フレーム数、オーディオストリーム)、blackdetect、freezedetect、およびffmpeg -v error -f null -によるデコードパス。 - ナレーションがある場合、最終的な台詞を文字起こしし、スクリプトと比較します。
ステップ 9 — App Storeカット(リクエストされた場合)
≤30秒、30fps、正確なデバイスサイズ。静かな部分でより強く、穏やかにスピードアップし、30fpsで出力します。docs/appstore-cut.md を参照してください。レターボックスやストレッチは絶対に行わないでください。
ホストに関する注意
- Claude Code —
~/.claude/skills/promo-video/にインストール。 - Codex —
~/.codex/skills/promo-video/にインストール。AskUserQuestionはありません。プレーンテキストで質問します。
CREATIVE_DIRECTION.md とレンダリングされたファイルを、その正確なパスとともに納品します。