Claude Code と MCP で「撮影素材から60秒PVまで」を自動化した話

自動配送ロボットの公道実証実験を撮影した動画17本、写真、画面録画。合計約2.6GBの素材から、タイトルとテロップ、BGM付きの60秒PV、30秒のYouTubeショート、サムネイルを作る仕組みを組みました。
編集ソフトを人が順番に操作するのではなく、Claude Codeが素材を見て構成を考え、MCP経由で自作ツールや編集ツールを動かします。ただし、Claudeにすべてを任せたわけではありません。判断が必要な部分と、同じ結果を返してほしい処理を分離しました。
作り始めると、BGMが途中で欠ける、タイトルが縦画面からはみ出す、拍に合わせたはずの切り替えがずれる、といった問題が出ました。最終的には、素材検索、作曲、拍合わせ、モーショングラフィックス、書き出し後の自動チェック、ライセンス管理までを1本の流れにしています。
1. 判断はClaude、実行はコードに分ける
全体の役割は次のように分けました。
| 担当 | 処理 | 分けた理由 |
|---|---|---|
| Claude Code | カット選び、順番、テロップ、章立て | 素材と依頼に応じた判断が必要 |
| autocut(自作Python、約4,200行) | 解析、作曲、書き出し、QA | 同じ入力から同じ結果を得たい |
| Remotion | タイトル、ワイプ、章見出し、縦型サムネイル | Reactで動きと画面比率を扱える |
| EffectCraft / FilmCraft | タイトルの代替、カット単位の最終調整 | 必要なら人がGUIで触れる |
Claudeが直接ffmpegの長いコマンドを毎回組み立てる構成にはしていません。Claudeが書くのは、使用する素材、in/out、テロップ、章、BGMの方針をまとめたJSONです。autocutが範囲や合計尺を検証してから処理します。
{
"title": "街を走る、小さな配達員",
"music": {"style": "warm", "chorus_at": 25.0},
"chapters": [
{"at": 10.3, "no": "01", "title": "計画", "en": "PLAN THE ROUTE"}
],
"clips": [
{"src": "GS010568.mp4", "in": 126, "out": 131, "grade": "auto"},
{
"image": "screenshot.png",
"duration": 5,
"zoom": {"to": [0.84, 0.58], "amount": 0.3},
"caption": "運行管理ソフトでルートを計画",
"transition": "slash"
},
{
"src": "GH010565.mp4",
"in": 67,
"out": 72,
"caption": "交差点も自動でカーブ"
}
]
}
範囲外のin/outや合計尺のずれはautocut側で検出・補正します。プランは書き出しごとに保存するため、前の版へ戻せます。同じプランから16:9の本編、9:16のショート、FilmCraft用のプロジェクトも作れます。
2. EffectCraftとFilmCraftをMCPでつなぐ
autocutを中心にした自動処理とは別に、Claude CodeからEffectCraftとFilmCraftもMCP経由で操作できるようにしました。3つのツールを同じ会話から使いますが、担当は重ねていません。
EffectCraftは、タイトルやモーショングラフィックスを別の表現で作りたいときの選択肢です。通常の自動書き出しではRemotionを使いますが、見た目を変えたい場面ではEffectCraftへ切り替えられます。
FilmCraftには、同じ編集プランからカット単位のプロジェクトを渡します。自動処理した結果を捨ててGUI上で最初から組み直すのではなく、カットの並びを引き継いだ状態から、人が必要な箇所だけを調整するために使います。
この分担により、通常はautocutの再現可能な処理を使い、案件固有の見た目や細かなタイミングだけをEffectCraft/FilmCraftで詰められます。MCPサーバーはClaude Codeの起動時に接続されるため、開発中にautocutのコードを変更した場合は、まずCLIで同じ処理を確認し、セッションを再起動してからMCP経由でも確認しました。
3. 書き出し前にタイムラインを確認する
処理の流れは、素材解析から書き出しまで一直線ではありません。保存したタイムラインをユーザーに提示し、了承を得た後に作曲と書き出しへ進むルールをCLAUDE.mdへ入れました。
この確認を挟むことで、長い書き出しの後に「そもそもカットの順番が違う」と気づく失敗を減らせます。
4. 素材を言葉で探せるようにする
素材が増えると、「トラックを検知している場面」「交差点を曲がる場面」を探すだけで時間がかかります。当初は1秒おきの一覧画像を作り、目で探していました。途中から、1秒ごとのフレームと特徴量を保存するインデックス方式へ変えました。
33ファイル、840秒分のフレームを対象にしたとき、インデックス作成は約6分、保存容量は37MBでした。
検索結果には題材による差がありました。
| 検索文 | 結果 |
|---|---|
| 監視画面でトラックを検知している | 正解の6秒地点が1位、スコア0.98 |
| 交差点でカーブを曲がるロボット | 正解区間が1位 |
| 地図とウェイポイントの画面 | 見つからず、スコア0.03 |
上記 + a ground control software screen with a satellite map | 1位、スコア0.95 |
地図やソフトウェア画面は、日本語だけの検索では弱いケースがありました。そこで日本語と英語の検索文を同時に渡し、高い方のスコアを使っています。
撮影方向の自動判定も試しました。前から撮ったカットは判定できましたが、広角のGoPro映像では、後方から撮ったカットを見落としました。被写体が画面内で小さく、画像全体の特徴では向きを区別しにくいためです。この判定は候補の絞り込みにとどめ、最後は一覧画像で確認する運用にしました。
5. 動画の尺からBGMを作り、カットを拍に揃える
既存曲には、案件ごとにライセンス確認が必要になること、尺ぴったりに終わらないこと、見せ場とサビの位置を合わせにくいことがありました。そこで、編集プランからキューシートを作り、動画に合わせてBGMを組み立てます。
キューシートでは、動画の長さ、タイトルが消える時刻、サビを始めたいカット、エンディング文字の開始時刻を指定します。テンポは動画の尺が整数小節になる範囲で調整し、サビとエンディングは小節頭へ配置します。
用意した曲調は3種類です。
| style | キー / 基準テンポ | 主な楽器 | 方向性 |
|---|---|---|---|
bright | Dメジャー / 120BPM | ピアノ、シンセパッド、ストリングス、ピチカート | 明るいテック系 |
warm | Gメジャー / 96BPM | エレピ、ギター、マリンバ、ビブラフォン、フルート | あたたかいアコースティック寄り |
pulse | Aマイナー→C / 96BPM | 16分のアルペジオ、裏打ちベース、4つ打ち | 前へ進むシンセ中心 |
sync_to_beatsでは、切り替え時刻を最寄りの拍へ動かします。このとき、前のカットのoutと次のカットのinを同じ量だけずらすため、動画全体の長さは変わりません。素材尺が足りない場所は無理に動かさず、そのまま残します。
60秒PVでは、17か所の切り替えすべてを拍の±40ms以内へ合わせられました。
ユーザーが曲を用意した場合はlibrosaで拍を検出します。120BPMと分かっている曲で検証したところ、改善前は117.45BPM、平均誤差38msでした。一定テンポを直線で当てはめ、各拍を近くの音の立ち上がりへ寄せ、小節頭をコード変化から判定するようにした後は、119.99BPM、誤差20msまで縮まりました。小節頭の1拍ずれも解消しています。
作曲処理を小節番号の直書きからキューシート方式へ書き換えたときは、回帰テストも行いました。8つのMIDIパートは以前の出力と一致し、音声差分は16bitで最大3でした。
6. 切り替えで尺を変えない
タイトル、章見出し、ワイプはRemotionで作り、透過付きのProRes 4444として本編へ重ねます。
ffmpegのxfadeのように前後の映像を重ねる方式は、設計によってはタイムラインの扱いが複雑になり、拍へ合わせた切り替え位置を維持しにくくなります。今回は、切り替えの瞬間を図形で覆い、その下で映像を切り替える方式にしました。
全面ワイプは帯、円、斜めの板、シャッターの4種類に加え、画面を覆わない光の線を用意しました。出力後はコマ単位で確認し、切り替えの瞬間が露出していないかを調べています。
縦型では、タイトル上の字間を広く取った英字が画面外へはみ出す問題が出ました。文字サイズだけでなく字間を含めて計算し、画面幅の85%以内へ収める処理に直しています。
7. メタデータではなく、デコードした音声を調べる
自動QAを作るきっかけは、BGMが途中で欠けていたのに、しばらく気づけなかったことでした。
ffprobeが示す長さは60秒のままでした。コンテナのメタデータだけを見ても分かりません。実際にデコードしたサンプル数を数えて、初めて不足を検出できました。対策後は、カットをデコードし、concatフィルタでつないでいます。
書き出し後のqa.jsonには、次の結果を残します。
- 映像と音声の長さ。音声は実際にデコードしたサンプル数で確認
- ラウドネスが-14 LUFS ±2に入るか、トゥルーピークが上がりすぎていないか
- 最後の2秒に音があり、BGMの終わりが欠けていないか
- 頭と終わりのフェードを除く黒コマ
- カットごとの明るさ
- テロップの文字数
- 人物、車両、座標やナンバーらしい文字の写り込み
- カットと拍の同期
写り込みチェックは、RT-DETRとmacOS VisionのOCRを組み合わせています。最初は配送ロボット自体をトラックとして検出し、監視画面の日付2026-11-13をナンバーとして警告しました。
前者は検出領域を切り出し、SigLIP2で実車両か配送ロボットかを再判定します。後者は日付と時刻の形式を除外しました。修正後は、実際の車両が大きく写るカットへ警告を絞れました。
今回のClaude Code運用では、音の印象をClaudeに直接評価させていません。各パートの有無、セクションごとの音量、スペクトログラム、作曲時と出力後の拍位置を測ります。それでも数値だけでは決められない聴こえ方は、ユーザーが確認すべき時刻を返します。「いい感じに仕上がった」と推測で報告せず、測れた値と、人が判断する箇所を分けました。
8. ライセンス情報も成果物に含める
公開PVで使うため、成果物へ入る音源、フォント、画像は商用利用条件を確認できるものに限定しました。構築時には、次のように置き換えています。
| 対象 | 構築時の判断 |
|---|---|
| macOS内蔵のGM音源 | 利用条件を確認できなかったため、MuseScore_General.sf2へ置換 |
| ヒラギノ | Noto Sans CJK JPへ置換 |
| Ultralytics YOLO | 採用せず、RT-DETRへ変更 |
| madmom | 同梱モデルが非商用条件のため、librosaへ変更 |
| FLUX.2 [dev] | 非商用条件のため採用を見送り |
| Remotion | 利用主体と人数、用途に応じたライセンス確認を運用へ追加 |
Remotionは、個人および3人以下の組織をFree Licenseの対象としています。4人以上では、共同でプロジェクトを運用する関係者や用途によってCompany Licenseの扱いが変わるため、人数だけでなく公式条件の確認が必要です。自動化用途の料金体系も通常の動画制作とは異なります。
書き出しごとに<出力名>.licenses.txtを生成し、使用素材、BGM音源、クレジット、フォント、ツールを一覧化します。未登録フォントや、必要なクレジットがないBGMは警告対象です。
9. 最終的に作れたもの
1つの素材セットから、次の成果物を作りました。
- 機能紹介の流れで構成した60秒PV A案。Dメジャー、120BPM
- 「計画→認識→走行」の3章で構成した60秒PV B案。
warmとpulseの2曲 - 9:16、30秒のYouTubeショート
- 16:9と9:16のサムネイル
今回いちばん効果があったのは、生成AIに編集作業を丸ごと任せることではなく、判断と再現可能な処理の境界を決めたことでした。Claude Codeは素材の意味を読み、JSONのプランを作る。コードはプランを検証し、同じ手順で書き出す。人は書き出し前の構成と、数値では決められない音の印象を確認します。
また、動画の長さをメタデータだけで判断しない、拍合わせで全体尺を変えない、ライセンス情報を後から集めない、といったルールは、不具合を経験した後に仕組みへ組み込んだものです。
この一式は、案件ごとにフォルダを複製して使えるautocut_v2としてまとめました。撮影素材をfootage/へ入れて/make-videoを開始すると、素材分析、構成確認、作曲、書き出し、QAまで同じ流れで進められます。
10. 使用した主なツール
| 分類 | ツール / 素材 |
|---|---|
| 編集・書き出し | ffmpeg(drawtext対応ビルド) |
| 解析 | PySceneDetect、OpenCV、SigLIP2、RT-DETR、ocrmac |
| 作曲 | mido、FluidSynth、pedalboard、MuseScore_General.sf2 |
| 拍検出 | librosa |
| グラフィックス | Remotion 4、Playwright |
| MCP連携・手動調整 | EffectCraft、FilmCraft |
| フォント | Noto Sans CJK JP |
| Claude Codeスキル | Remotion公式スキル、motion-graphics |
11. FAQ
- Claude Codeだけで動画を書き出しているのですか?
- いいえ。Claude Codeは素材を見てカット、順番、テロップ、章立てを決め、編集プランを作ります。プランの検証、作曲、書き出し、QAはautocut、Remotion、ffmpeg側で実行します。
- EffectCraftとFilmCraftは必須ですか?
- 必須ではありません。通常の自動処理はautocut、Remotion、ffmpegで完結します。EffectCraftはタイトルやモーショングラフィックスの代替表現、FilmCraftはカット単位で人が最終調整したい場合に使います。
- 手持ちのBGMにもカットを合わせられますか?
- はい。用意された曲ではlibrosaで拍を検出し、切り替え時刻を近い拍へ寄せます。素材尺が足りず、安全に動かせないカットはそのまま残します。
- BGMの良し悪しもClaudeが判断しますか?
- 今回の運用では、音の有無、音量、スペクトログラム、拍のずれを数値で確認します。聴感で決める必要がある箇所は時刻を示し、最終判断を人へ戻します。
- 商用案件でもそのまま使えますか?
- ツール、モデル、音源、フォント、画像ごとの利用条件を確認する必要があります。この仕組みでは、使用物を
licenses.txtへ出力し、未登録素材や必要なクレジットの不足を警告します。





