Communitygithub.com

e1dred/filmcraft

用於裁切或修剪影片、新增標題與圖形、調色、混音、匯出 MP4/GIF 或靜止畫面,以及執行 filmcraft-cli 或連接本機 FilmCraft 應用程式(storytold)時使用。

filmcraft 是什麼?

FilmCraft 是一款使用 Rust 撰寫的早期 Alpha 版 Premiere 風格影片編輯器,所有選單項目與按鈕皆透過命令(command)驅動。此技能讓 AI 代理能夠透過 CLI、MCP 伺服器或即時應用程式的控制通道,全面操控 FilmCraft 的編輯功能。支援 headless(無視窗)批次處理,可執行專案建立、媒體匯入、時間軸修剪、色彩分級、音訊混音、字幕編輯及多種格式匯出(MP4、GIF、靜止畫面)。技能提供詳細的參考文件,涵蓋專案與時間軸、標題與圖形、混音器、字幕、匯出及命令目錄,並內建「陷阱」章節說明常見問題(如時間單位為 ticks、文字圖層超出小畫面、漣波編輯在同步鎖定軌道失敗等)。驗證工作流程時,應使用 `inspect`、`probe` 與 `render` 命令確認結果,再向使用者報告。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/e1dred/agent-skills/tree/HEAD/filmcraft

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

filmcraft 是做什麼的?

更新: 如果此資料夾有 .installed-from 檔案(在從 repo 複製時寫入),請在每個工作階段執行一次 git ls-remote https://gitlab.com/e1dred/agent-skills.git HEAD。取輸出中以 HEAD 結尾的那一行雜湊值;若與檔案中的不同,告知使用者有較新版本並提供更新選項(請參閱 https://gitlab.com/e1dred/agent-skills/-/blob/main/INSTALL.md 中的「更新」章節,該章節可合併本地編輯);未經詢問絕不更新。比較雜湊值前請先去除前後空白。若無檔案、為 clone 或符號連結、或無網路(git ls-remote 輸出為空或發生錯誤),則跳過不處理。

來自首次 headless 任務的現場筆記,最後測試於 FilmCraft 0.17.1(Linux AppImage)。FilmCraft 是一個 早期 Alpha 版、以 Rust 撰寫的 Premiere 風格影片編輯器。每個選單項目與按鈕都是一個引擎命令;CLI、 MCP 伺服器與應用程式的控制通道執行相同的命令。如果 filmcraft-cli --version 較新,請在依賴此處內容前重新確認。

設定

  • CLI: 從 AppImage 中提取(filmcraft.appimage --appimage-extract,將 usr/bin/filmcraft-cli 複製到某個穩定位置);獨立執行,無視窗。切勿對 AppImage 本身執行 --version。
  • Headless: filmcraft-cli --project p.fcproj exec <id> key=value …;腳本為 JSON lines 格式並保持同一個工作階段: filmcraft-cli --project p.fcproj run script.jsonl [--save],其中每一行格式為 {"id":"…","params":{…}}, 或在使用 file.newProject 後獨立執行 filmcraft-cli run。子命令:commands、describe、inspect、 import、export、render、probe。
  • 即時應用程式: filmcraft --control 9876(或設定 FILMCRAFT_CONTROL_PORT);監聽器需要在環境變數中設定 FILMCRAFT_CONTROL_TOKEN(64 個十六進位字元)——若無則保持關閉。使用 filmcraft-cli mcp --bridge 127.0.0.1:9876 橋接。
  • MCP: filmcraft-cli mcp(headless)或 --bridge(即時)。

檔案位置

閱讀與任務相符的檔案;每個檔案列出其包含的章節。使用 grep -n 搜尋 reference/ 以尋找命令 ID。

reference/ 中的檔案閱讀時機章節
projects-and-timeline.md專案、匯入媒體、序列、播放頭、剃刀與修剪、標記、儲存、轉場、影片效果與關鍵影格、影格凍結、專案筆記專案與媒體;序列;裁切與修剪;標記與儲存;轉場;影片效果與關鍵影格;影格凍結、選取與專案筆記;其他編輯工具
titles-and-graphics.md文字與形狀圖層、小影格的尺寸/調整、讀取圖層、垂直文字與匯入的圖片標題;尺寸與調整;圖層屬性;其他圖層工具
audio-mixer.md混音器通道、數值、子混音、插入與傳送;片段增益與 Essential Sound混音器;片段音訊
captions.md字幕軌、新增/編輯/移動字幕、SRT 匯入與匯出字幕軌與 SRT
export.md匯出預設與格式、匯出佇列、MP4/GIF 匯出、影格靜止畫面、交換格式匯出、探測預設;匯出;預設與匯出佇列;靜止畫面;探測
command-catalogue.md依功能分類的所有其他命令 ID(clip、timeline、sequence、trim、graphics、edit、file、project、multicam、source、prefs、shortcuts…),每個標示為已驗證(JSON 路徑舊→新)、有回傳結果、已執行、或因某些原因被拒絕;解鎖依賴選取狀態的命令所需的設定每個功能一個章節
live-app.md透過 --bridge 驅動執行中的應用程式:ui_* 工具、僅即時模式可用的功能、在隱藏顯示器上執行連線;即時應用程式的額外功能
newer-commands.md每個版本新增或變更的內容0.17.0;0.17.1
log.md各項功能測試時間的日期記錄記錄

CLI 基本操作(已驗證)

filmcraft-cli commands --json                    # 716 個命令:id、label、menu、params、enabled
filmcraft-cli describe file.import               # 單一命令的參數說明
filmcraft-cli --project p.fcproj inspect         # 回傳 {project:{…}, sequence:{…}} JSON
filmcraft-cli import clip.mp4 --project p.fcproj
filmcraft-cli --project p.fcproj export out.mp4 --scale 0.5 --quality 70
filmcraft-cli --project p.fcproj render --seconds 2 --out frame.png
filmcraft-cli probe clip.mp4                     # kind、duration(ticks)、視訊/音訊串流詳細資訊
  • JSONL 腳本會保持狀態:file.newProject → file.import {"paths":["clip.mp4"]} → {"items":[1]} → file.newSequenceFromClip {"items":[1]} → {"clips":[6,7],"sequence":4} → … → file.saveAs {"path":"p.fcproj"}。
  • 每次後續 CLI 呼叫都需傳入 --project:否則每次呼叫都是全新工作階段。

陷阱

  • 時間單位是 ticks,而非影格: 序列回報 762,048,000,000 代表 3 秒(254,016,000,000 ticks/秒); playhead.set 接受 seconds、frame、time 或 timecode,並對齊到最近的影格(1.5 秒 → 影格 37)。
  • 預設大小的文字圖層會超出小影格。 graphics.newText 預設為 100 px:在 320×180 的序列中,size:48 的 "Hello FilmCraft" 從 x=40 開始繪製,寬度達 334.7 px,右側被裁切。可設定 size(約 32 → 223 px 寬;已透過渲染確認)。段落文字搭配 box:[w,h] 會自動換行,但方框會裁切超出其高度的行:box:[240,60] 搭配 size 40 只顯示 "Hello"(第二行被切斷),因此方框高度要足夠容納每一行(約每行 1.3 × size)。
  • 跨越同步鎖定軌道的漣波編輯會失敗: 當標題位於 V2 時,timeline.trim 搭配 mode:"ripple" 會回應「此編輯會破壞同步:V2 已同步鎖定且有一個片段擋路」。請先鎖定/解鎖另一軌道,或使用非漣波方式修剪。
  • probe --image-sequence 只能接受編號的靜止畫面;用於影片時會報錯。
  • Headless 模式下 effects.addKeyframe 搭配原始 mediaTime 無效(回傳 {added:false, mediaTime:0};0.17.0),但在即時應用程式中,{clip, effect:"opacity", param:"opacity", seconds:1.5, value:40} 可新增關鍵影格(關鍵影格從 5 變為 6;時間會對齊到影格:624699432000)。Headless 模式下,請移動播放頭並使用 effects.toggleAnimation,或對標題屬性使用 graphics.set {…,"keyframe":true}。
  • mixer.addInsert 需要真實的音訊效果 ID(例如 hard_limiter,來自 effects.list {"kind":"Audio"}),而非如 volume 的標籤;mixer.addSend 需要同一執行中 mixer.addSubmix 回傳的子混音 ref。
  • graphics.* 命令需要在同一個工作階段中有標題: 先在相同腳本中執行 graphics.newText,然後 graphics.alignFrame.*、nudge*、fontSize*、leading* 才能在 headless 模式運作(讀取 graphics.list {clip} → layers[0])。若無標題,則回應「無圖形片段」。graphics.deleteLayer 僅在即時模式下被接受(無回讀)。
  • 選取狀態不會在儲存/重新開啟後保留: 請將 project.select {items:[id]} / timeline.select 放在需要選取狀態的命令前(例如「請在專案面板中選取一個項目」、「未選取任何片段」)。
  • FCPXML 匯出可能遺失標題: file.exportInterchange {"format":"fcpxml"} 報告圖形片段「不支援」但仍寫入檔案;在信任交換格式匯出前,請先閱讀報告。
  • --demo 會開啟內建示範專案:可檢查與渲染(1 秒處的 1920×1080 影格),匯出僅測試至正常;除非 --allow-offline 接受,否則遺失媒體會匯出為佔位影格。
  • file.exportMedia 會等待檔案寫入完成,除非設定 "wait":false;CLI 的 export 永遠會等待。

回報前請先驗證

使用 inspect sequence(片段開始/結束影格、軌道、轉場、效果)、probe 檢查匯出檔案的長度與編解碼器,以及 render 渲染感興趣時間點的影格來檢查。影格計數:25 fps 的 3 秒 = 75 個影格;一次 -10 影格的漣波修剪後變為 65 個影格。

相關技能