0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

動画の最終フレームから次のShotを作る——MCPでCanvasからTimelineまで全部つないだ

0
Posted at

cover-03-tail-frame-continuation.png

「この動画の続きを作って」——言葉にすると1回の操作に聞こえる。でも安全にAgentへ任せるなら、動画のDecode、フレーム抽出、Asset保存、Continuation Node作成、確認、有料生成、出力の接続、Timeline配置、Renderを、それぞれ別の状態として扱う必要がある。

BeatDesignではこの一連をMCP Toolとして公開しており、Agentが操作しつつ、人間は同じローカルProjectをブラウザで確認できる。

ポイント

  • 最終フレーム抽出はローカルで決定的。動画生成は外部かつ有料。この2つを分離する
  • 同じCommand IDを使えば、再試行でFrame AssetやNodeが重複しない
  • 生成前にCanvas上で抽出FrameとGeneration Nodeを確認する
  • 生成成功はAsset作成まで。CanvasやTimelineへの配置は勝手にやらない
  • Timeline編集とRenderは保存済みの最新Revisionが基準
  • 実機QAで確認した流れ:10.01秒MP4 → 最終フレーム → 派生Image Asset → Continuation Node → Timeline → 3〜7秒Trim → 4秒Clip → H.264/AAC Render → Render Asset

なぜ状態を分けるのか

「続きを作る」ボタン1つだと、こういう情報が埋もれる。

  • どの動画の何秒を参照したか
  • 抽出した画像は一時的なBlobか、再利用できるAssetか
  • 次のモデルはその画像をFirst Frameとして使うのか、汎用参照として使うのか
  • 再試行で有料リクエストが重複していないか
  • どの生成結果をTimelineに入れたか
  • Exportは最新のTimelineから作られたか

Agentが操作するなら、HTTP 200だけでは足りない。安定したID、確認できるオブジェクト、明確な停止点が要る。

前提環境

Visual Workspaceの起動:

pnpm install
pnpm db:push
pnpm dev

stdio MCPとして使う場合:

pnpm --silent mcp

MCP/Node側のフレーム抽出にはffmpegが必要。PATHに通すか、BEATDESIGN_FFMPEGに絶対パスを設定する。Timeline Renderにはffprobeも要る(BEATDESIGN_FFPROBEで指定可能)。ブラウザのPreviewとExportはこのMCP/Node要件とは別。

Toolの実行順

Agent側の基本シーケンス:

bdesign_project_list
→ bdesign_project_target
→ bdesign_project_open
→ bdesign_canvas_continue_from_tail
→ bdesign_canvas_view        # ここで人間が確認
→ bdesign_generation_submit  # 許可された生成
→ bdesign_generation_status
→ bdesign_canvas_apply       # 成功Outputを接続
→ bdesign_canvas_view
→ bdesign_editor_edit
→ bdesign_editor_view
→ bdesign_editor_get
→ bdesign_editor_render

SchemaはMCP Serverから取得できる。ここで大事なのは順番と、どこに権限の境界があるか。

1. Projectを固定する

作業対象のProjectを選んだらbdesign_project_targetを1回呼ぶ。同じMCP Session内なら、以降のProject IDは省略できる。

別Projectへの誤書き込みを減らす仕組みだが、選択したProject名と現在のCanvasを目で確認しなくてよいわけではない。早めにbdesign_project_openを呼んで、人間とAgentが同じ状態を見るようにする。

2. 安定したCommand IDで最終Frameから分岐

対象のVideo Cardと、1つのCommand IDを指定してbdesign_canvas_continue_from_tailを呼ぶ。

ローカルで3つのことが起きる。

  1. Project内の動画をDecode
  2. 最終フレームをImage Assetとして保存
  3. 派生AssetにつながるContinuation Generation Nodeを作成

次のGeneration Requestも返されるが、自動送信はしない。

応答が届いたか分からない場合は同じCommand IDを使い回す。新しいRetry IDを作るとAssetやNodeが重複する。短いRevision競合なら最新のCanvas Documentを読み直してStable IDの操作を限定回数リトライ。それでも失敗すれば構造化されたRetry情報が返り、孤立Frameは残らない。

3. 有料生成の前にCanvasで確認する

Continuationの応答に含まれるReview Handoffを開き、以下を見る。

  • 元のVideo Card
  • 抽出されたTail-frame Asset
  • 新しいGeneration Cardへの接続
  • Model、Aspect Ratio、Duration、Quality
  • 参照画像をFirst Frameとして扱う明示的なPrompt

ここが最も重要な境界。フレーム抽出とNode配置はローカルの決定的処理。次のGenerationは外部Creditを消費する可能性があるから、別の許可された操作として扱う。

Agentへの指示例:

この動画の最終フレームから次のShotを準備して。
人物・カメラ方向・光・動きの方向を維持して。
Continuation Nodeを作り、Canvasを確認できる状態で止めて。
まだGenerationは送信しないで。

4. Model確認 → 生成

送信前にbdesign_generation_modelsbdesign_generation_model_getで対象Modelの入力とパラメータを確認する。

bdesign_generation_submitにはCanvas上のGeneration CardをsourceCardIdとして渡す。Cardがない・実行中・設定不一致なら拒否される。

Providerへの連絡前に、BeatDesignはCanvasへPending Output Cardを書き込む。有料Requestだけ飛んで、状態の置き場所がない事態を防ぐ。

成功するとProject Assetができるが、Continuation NodeやTimelineは自動で書き換わらない。バックグラウンドタスクが勝手に編集結果を変えないための境界だ。

5. 成功OutputをNodeへ接続

成功後の手順:

  1. 最新のContinuation CardとCanvas Revisionを読む
  2. Generation設定を維持する
  3. bdesign_canvas_applyで成功OutputをCardに接続
  4. 同じCard IDでbdesign_canvas_viewを開く

これで元Clip → 派生Tail Frame → Continuation Node → 生成Outputが1つのCanvas上に見えるようになる。複数案を生成した場合も各Outputは別Assetとして残り、1つをEditorに入れても他は消えない。

6. CanvasからTimelineへ

Timeline全体を置き換えず、bdesign_editor_editのIncremental Operationを使う。

実機QAでは10.01秒のローカルMP4を入力にした。Continuation準備後、Timeline Nodeを作りEditorを開き、元Clipの3.00〜7.00秒をTrimして4.00秒のClipを作った。

Canvas Output Asset
→ Timelineへ明示的に配置
→ Non-destructive Trim
→ 保存済みTimeline Revision

Image Overlay、Audio、SRT Captionも別のTimeline Objectとして管理できる。元動画への焼き込みは不要。

7. 最新RevisionでRender

Exportの許可が出たら、bdesign_editor_getで現在のRevisionを取得し、bdesign_editor_renderに渡す。

RenderにはVideo Clip・Image Clip・Overlay・Caption・Mixed Audioを含められる。結果はProject所有のMP4 Asset。

Render中にTimelineが変わった場合、Revision Checkで古い出力のCommitを拒否し、一時Assetを削除する。古い編集結果が最新Renderとして登録されるのを防ぐ仕組み。

失敗と対応

失敗 意味 対応
ffmpegが見つからない ローカル動画をDecodeできない PATHBEATDESIGN_FFMPEGを設定し、環境が変わるまで再試行しない
Revision競合が続く 別のWriterがCanvasを変え続けている 最新状態を読み、Retry指示を1回だけ実行
Generation許可がない 次の処理が外部で有料の可能性 Continuation Nodeが見える状態で止める
成功したのにNodeに表示されない Asset作成とCanvas配置が別処理 最新Cardを読んでbdesign_canvas_applyで接続
RenderがStale Export中にTimelineが変わった 最新Revisionを読み、再Render前に確認
SRTが不正 Caption検証に失敗 Parse Errorを報告。既存Captionは変更されない

この設計で得られること

「Continue」1回より手順は増える。でも全部確認できる。

  • ローカル処理と有料処理が分離されている
  • RetryがIdempotent
  • 派生Frameが再利用可能なAsset
  • Provider送信前からGeneration Stateが見える
  • 成功Outputが勝手に編集を変えない
  • MP4が特定のTimeline Revisionに紐づく

ボタンの自動化ではなく、Agentが安全に扱えるControl Planeを作る設計。

現在の範囲

BeatDesignはSkill・Project・Asset・Canvas・Generation・Editorの6グループで29個のローカルMCP Toolを公開している。対象はローカルのShort-form制作。

完全なAgent NLEではない。Real-time UI Event Push、永久Audit Log、MCPによるPixel Preview、Advanced Transition、Speed Control、Waveform、Hosted Collaboration、Desktop Packageは現在の公開範囲外だ。

今の範囲でも、CanvasからEditorまでの制作ループを検証可能な状態で組める。

BeatDesignはオープンソース。

https://github.com/BeatAPI/BeatDesign

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?