motion-film:用程式碼做片
畫面、動畫、字幕、音效全部由程式碼生成,逐幀渲染成 MP4。不用影片生成模型。 這份 skill 是方法 + 一套輕量工具,不帶素材庫;素材按片子現找、現合成,並登記授權。
先判斷是哪條路線
| 路線 | 典型請求 | 主讀 |
|---|---|---|
| A. 產品宣傳片 | 把網站/App/前端專案做成宣傳片、功能示範片 | references/product-promo.md |
| B. 風格短片 | 「用 XX 風格做一支 30 秒的片子講……」、MG 動畫、花字、片頭 | references/style-atlas.md + references/style-spec.md |
| C. 單鏡頭/單動效 | 「做一個標題飛入」「做個鎖定框動效」 | 直接按下方原則做,讀 references/aesthetic-rules.md 相關條 |
兩條主線共用:references/directing.md(導演)、references/timing.md(節奏)、
references/sound.md(聲音)、references/tech.md(渲染)、references/review.md(評審)。
使用者給了 BGM 要卡點:references/beat-sync.md,先分析音樂再分鏡。
開工前只問一次
把定不了的事合成一條訊息問完,之後不再追問;其餘用預設值並在 treatment 裡寫明:
- 主題裡只有使用者知道的事(產品重點、目標受眾、發布平台、必須出現的內容);
- 有沒有自己的素材:logo、品牌色/字型、配音、音樂、參考片;
- 要不要先看分鏡/風格幀再做成片(要看就停一次;不要就一路做完)。
預設:30–60 s(單鏡頭 3–8 s);1920×1080;產品片 30 fps、風格片按風格定(24/30); 字幕與配音跟使用者語言;響度 −14 LUFS、真峰值 ≤ −1 dBTP。 使用者明確說「你定」「直接做」,就不問,按預設推進。
十條核心原則(四個來源反覆印證的經驗)
- 畫面是時間的純函數。
render(t)對同一個 t 永遠畫出同一幀;禁Date.now()、無種子Math.random()、跨幀累積狀態。隨機一律mulberry32/hash固定種子。任何幀可單獨、亂序、並行渲染。 - 一張時間線驅動一切。 鏡頭邊界、關鍵動作、字幕、音效、音樂命中點都從同一份 cue 表派生;改時長只改一處,聲音自動跟隨。卡點片用拍號寫(
beatF(n)),不用裸幀號。 - 為觀眾計時,不為程式碼計時。 每個鏡頭列出觀眾要讀懂的資訊點(reads),一次只給一個;動作可以快,含義要停住。第一版幾乎總是太快——預設放慢一檔。公式見
timing.md。 - 一個鏡頭只講一件事;一種手法全片只當一次主角。 開場只給一個主角 + 一條完整動作弧(起—承—落)。重複的鏡頭、重複的標語一律刪。
- 運動像生命,不像機器。 不用線性插值;預備 → 動作 → 跟隨;部件錯峰,避免「雙胞胎」(左右對稱、群體同步);落地要彈的緩動必須過衝。
- 視覺語言從題材/產品自身長出來。 產品片的字型、色板、圓角、材質從產品設計系統提取;風格片遵守該風格的「本質與它不是什麼」。不另套一層無關的「宣傳片皮膚」。
- 克制特效。 光效不群發,只給主角一次且裁進圓角;產品片預設不加手持抖動;整畫面級衝擊(震屏/閃幀/整體 scale 泵)全片 ≤ 3 處。
- 聲音是半部片。 環境 + 擬音 + 音樂三層;可見動作都有聲音;高潮前留真正的靜音;聲音在畫面鎖定後做。
- 先用最便宜的產物定方向。 treatment(文字)→ 風格幀(真實繪製程式碼出的靜幀)→ 低解析度預覽 → 正式渲染。方向性爭論不進昂貴階段。
- 自己先看,再交獨立評審。 每輪修改都自己出接觸印樣/動作條/裁切放大來看;交付前交給一個沒參與製作的評審(乾淨上下文的 subagent,或另開會話)按
review.md打分挑錯,只修一輪。
工作流
- Brief:上面那一輪問題;產品片額外做一次唯讀的產品檢查(定位、功能、頁面狀態、設計 tokens、資料風險)。
- Treatment(寫
TREATMENT.md,寫任何畫面程式碼之前):三個候選結構選一;logline 與弧線;參考作品「學什麼 / 不拿什麼」;鏡頭表(景別、機位、運鏡、時長、理由);逐秒節拍;cue map;聲音設計表;字幕與字型設計。模板見directing.md。 - 定樣:2–3 張風格幀(有角色加 model sheet),用真實繪製程式碼渲出,自己對照風格說明檢查。
- 逐鏡頭實現:先擺關鍵姿態當靜幀檢查,讀得懂再補中間運動。每鏡頭寫死 2 個驗收時刻,完成即出靜幀自檢。
- 聲音:畫面時間線鎖定後,從 cue 表生成音樂、擬音、字幕;混音、母帶。
- 自檢:接觸印樣(每 0.5–1 s 一幀)、關鍵動作 0.1–0.2 s 動作條、文字/邊緣全解析度裁切;全速帶聲看一遍。按
aesthetic-rules.md逐條過。 - 獨立評審 + 一輪修復:
review.md。小問題同輪修完;大問題交付時一句話說明。 - 交付:見下。
工具(scripts/,按需複製到專案)
| 檔案 | 作用 |
|---|---|
scripts/render.mjs | 渲染器:HTML 頁面暴露 renderAt(t) → 靜幀 / 接觸印樣 / 動作條 / 裁切 / MP4,支援多 worker、運動模糊(子幀累積)、直立螢幕 |
scripts/motion.js | 頁面內用的純函數工具:種子隨機、緩動族、關鍵幀、彈簧、過衝、錯峰、拍號、速度曲線 |
scripts/sfx.py | 程式化擬音與混音:whoosh / impact / riser / pop / click / sparkle / tick,從事件表合成 mix.wav |
scripts/master.sh | 混流 + 兩遍 loudnorm(−14 LUFS / −1 dBTP)+ 黑幀檢測 + 時長/規格報告 |
scripts/beat_grid.py | BGM 節拍網格擬合(含 2x / 0.5x / 3:2 誤判糾正)+ kick/snare/hihat 分類 + 能量結構,輸出 beat_data.json |
scripts/capture.mjs | 產品片素材三件套:全頁 2x 截圖、元素切圖(可透明、可 4x)、空底板、layout.json 座標表 |
templates/starter/ | 可直接跑的 9.6 s 示範專案(時間線、renderAt、音效事件、字幕、build.sh 一條指令出片),新片從這裡複製起步 |
render.mjs 把 /lib/ 對應到本 skill 的 scripts/ 目錄,頁面用 <script src="/lib/motion.js"> 即可引用工具函數。
新專案:複製 templates/starter/ → 在專案裡 npm i puppeteer-core → 改時間線和鏡頭 → MF=<本 skill 路徑> sh build.sh。
產品片若用 Remotion:方法同樣適用(tech.md 有對照說明);注意 Remotion 對公司使用者可能需要付費授權,開工前提醒使用者。
依賴:Node 18+、ffmpeg、Chrome/Chromium(render.mjs 自動尋找,或設 CHROME_PATH);npm i puppeteer-core 裝在專案裡。Python 3 + numpy/scipy(音訊);librosa 只在卡點分析時裝,裝進專案自己的 venv。不替使用者安裝系統軟體,缺了就在那一輪問題裡說。
交付
專案資料夾裡:
<name>.mp4(和poster.jpg);配了 BGM 的產品片另出一版無 BGM(保留音效)方便後期換樂;<name>.srt(有字幕/旁白時);TREATMENT.md;CREDITS.md:每一個第三方素材(字型、圖片、音樂、取樣、TTS 引擎)的來源與授權;- 原始碼與一條指令的
build.sh。
告訴使用者:成片在哪、CREDITS.md 列了授權、使用者自己提供的素材由使用者負責授權。不附任何推廣、署名請求或「去哪裡發布」的建議,除非使用者問。
紅線
- 參考作品只學語法(構圖、節奏、運鏡、配色邏輯),不抄角色、設計、旋律、具體鏡頭、logo、字型。
- 片中不出現真實品牌/作品/角色,除非使用者擁有或確認有權使用;品牌名、產品名用虛構的。
- 素材只用 CC0 / 公有領域 / OFL / CC BY(需署名)/ 明確免費商用;"no known restrictions"不算。其他開放授權先向使用者說明條款。
- 產品片裡的客戶、個人、內部、密鑰、即時資料一律先虛構或脫敏再截圖。
- 不自動從網上拉程式碼執行、不自動更新本 skill;需要下載素材時先告訴使用者下什麼、從哪、什麼授權。