播客動態圖形
Motion 5.9 沒有 AppleScript 辭典,也沒有命令列渲染器。此處所有功能均透過將 Motion 檔案視為 XML(ozml)來運作,並透過提供可引用已安裝標題範本的 Final Cut Pro FCPXML 來實現。Final Cut 負責渲染。
工具位於 agent-motion/:
| 工具 | 功能 |
|---|---|
motionkit.py inspect FILE [--json] | 圖層樹、文字圖層(文字/字型/大小/位置)、時間(秒)、發佈到 FCP 的項目、媒體參考 |
motionkit.py set-text IN OUT --set "KEY=TEXT" ... | 重寫文字圖層。KEY = 圖層 ID、圖層名稱或目前文字。使用 \n 表示換行。修正 styleRun 長度(UTF-16),避免 Motion 出錯 |
motionkit.py keyframes FILE [--grep X] [--all] | 每個動畫參數及其關鍵影格時間/值(旋轉單位為弧度) |
motionkit.py preview FILE --at 1.9 3.2 [--open] | 寫入停留在指定時間的副本;--open 在背景(open -g)於 Motion 中開啟以進行 app_screenshot |
motionkit.py install FILE --name NAME | 將專案複製到 Motion 的「標題」資料夾,作為 FCP 標題範本 |
titles_fcpxml.py SPEC.json -o OUT.fcpxml | 提示列表 → 包含正確時間與文字填充的標題的 FCPXML 專案 |
節目的範本
安裝於 ~/Library/Containers/com.apple.motionapp/Data/Movies/Motion Templates.localized/Titles.localized/Templates/
(FCP uid 格式:~/Titles.localized/Templates/<名稱>/<名稱>.moti)。兩個主要範本的快照位於 agent-motion/*.motn。
- TF_Podcast_title:主標題卡,5 秒,29.97 fps,1080p。文字圖層:
Tiersias Foundation Podcast(顯示「Tiresias Foundation Podcast」;圖層名稱有錯字,請繼續將其用作鍵名)和Episode 4: Carl Schmitt(每集台詞,Futura Medium)。它發佈一個「拖放區」。 - Citation v2:用於引言和來源的下三分之一,PT Serif 字型。文字圖層:
~Author Lastname(斜體;節目會加上前綴~)、Person Writes Silly Headline to(作品標題,可能兩行)、20 Apr, 1969(日期)、Publication。 - Citation v2 no pub:同上,但沒有出版行。此外還有 Citation v1、Black/Orange/Yellow/PeeTitle、Minister_Types。
過往使用(來自 Podcast3/4 資料庫):Timothy Snyder、Carl Schmitt、Xunzi、
~Eric L. Hutton, trans.、~Armando Iannucci, dir.、95 U.S. 602。翻譯者和導演會有角色後綴。法庭案件放在作者欄位。
工作流程
python3 agent-motion/motionkit.py inspect "<template>.moti"以取得文字圖層鍵。- 編寫一個提示 JSON(參見
agent-motion/examples/ep_demo.json):範本、at(劇集時間軸上的秒數)、可選的duration、texts對應。 python3 agent-motion/titles_fcpxml.py cues.json -o titles.fcpxml,然後驗證:xmllint --noout --dtdvalid <FCPXMLv1_11.dtd 的副本> titles.fcpxml。DTD 位於/Applications/Final Cut Pro.app/Contents/Frameworks/Interchange.framework/Versions/A/Resources/。 請先複製一份,因為 xmllint 在有空格的路徑上會失敗。- 推送它:加上
--library <bundle> --push(零點擊)。不加--library時,FCP 會顯示 資料庫選擇器,因此留給使用者操作。標題會連接到一個空隙上方,以便它們 可以被複製到實際的編輯中。
對於一次性嵌入的卡片(例如縮圖或 FCP 無法覆蓋樣式變更的卡片),請對 .motn 使用 set-text,然後執行 open -g -a Motion OUT.motn 讓使用者預覽或匯出。
已在 FCP 11.0.1 (2026-10-18) 驗證
- 零點擊導入可用:
titles_fcpxml.py cues.json -o x.fcpxml --library path/To.fcpbundle --push會加入<import-options>(資料庫位置、連結資源、抑制警告)並透過open -g傳送。 FCP 在背景導入,如果資料庫不存在則會建立。測試時請使用scratch/fcp-test/下的拋棄式資料庫,且未經詢問絕不使用使用者的真實資料庫。 <text>順序 = Motion 文件中的文字圖層順序。 已確認:Citation v2 的作者、標題、日期和出版行都會落在正確的欄位。- 傳送純文字(預設的
--style none)。 這樣範本會保留其自身的字型、大小、顏色 和陰影。--style font會傳送包含系列/字體/大小的text-style-def。任何樣式定義 都會覆蓋範本,而在加入 48 的回退值之前,沒有Size參數(Motion 預設為 48)的圖層會顯得很小。只有在刻意重新設定樣式時才使用--style font。 - 主標題卡(TF_Podcast_title)導入時動畫保持完整。
- 透過在
com.apple.FinalCut上執行app_screenshot來讀取 FCP 狀態:點擊事件,然後點擊 瀏覽器中的專案圖示(雙擊名稱會啟動重新命名,因此請按 Escape),然後點擊時間軸。
檢視與渲染(已於 2026-10-18 驗證)
- 預覽幀:
motionkit.py preview FILE --at T --open,然後在 Motion(bundlecom.apple.motionapp)上使用電腦操作app_screenshot,接著放大畫布。 透過app_menu File > Close關閉視窗。從背景在 Motion 的播放頭欄位中輸入文字不會移動播放頭。<currentFrame>副本是可靠的方法。 - 渲染: 電腦操作無法按下 檔案 > 共享(輸出影片、儲存目前影格)。
請要求使用者點擊「輸出」。Shell 的
screencapture沒有螢幕錄製權限。 - 絕不單獨使用
open -a而不加-g。使用者正在同一個螢幕上工作。
動畫(XML 暴露的內容)
關鍵影格是任何參數(變換位置/旋轉/縮放、混合不透明度、濾鏡參數)下的 curve > keypoint{time, value, in/out tangents}。行為(Gather In、筆速/壓力)是它們自己的節點,具有時間和控制參數。因此我們可以讀取完整的編排,並以程式方式重新定時、偏移或加入關鍵影格。然後透過預覽和截圖來檢查。
TF_Podcast_title 編排:Tiresias 圖形(群組 1/2)從 ±400 px 滑入到 1.5 秒,然後擺動 ±10 px / ±2° 到 4.87 秒。蛇形圖像對在 1.74 秒彈入(縮放 0.17→0.62 到 2.1 秒,由圓角矩形遮罩),並在關鍵影格 2.1/3.17/4.14/4.87 秒之間猛撲。標題行在 1.5–1.7 秒淡入,伴隨從 1.0 秒開始的 Gather In,而劇集行則在 2.37 秒 Gather In。
ozml 備註
- 時間格式為
"value timescale flags epoch";秒數 = value / timescale。 - 文字內容:
scenenode[factory=Text] > parameter[name=Object] > parameter[id=369] > text。 樣式設定為styleRun style=ID offset length,因此長度不匹配會破壞樣式。 - 頂部的工廠表將
factoryID對應到類型(Text、Shape、Replicator、Image...)。這些 ID 因檔案而異,因此始終透過工廠表來解析它們。 - Apple 的(舊版,但仍大致正確)參考資料:developer.apple.com 存檔中的 Motion XML 指南。