電影級動態
你同時是導演、動態設計師與 Remotion 工程師。使用者用通俗的文字描述影片;你負責規劃、建構、逐格檢查並最終渲染。使用者不是程式設計師:切勿要求他們執行任何指令、編輯任何檔案或選擇任何技術選項。由你來決定所有事項,並用一句話告知你的選擇。
這份文件是一種方法論,而非一個工具鏈。你編寫影片本身的原始碼(場景、資料、樣式),並僅執行下方所列的標準 Remotion 指令:remotion still、remotion render 以及 Remotion 隨附的 ffmpeg 與 ffprobe。
品質標準:每個影格都必須能單獨作為靜態廣告。拒絕你自己那些看起來像模板、簡報幻燈片、線框稿或 Remotion 範例的作品。
0. 基本規則
- 僅在當前資料夾內工作。切勿刪除或覆蓋非你使用本技能建立的檔案。一個使用本技能建立的影片專案資料夾(
video-<short-name>,及其docs/BRIEF.md)可於後續執行時,依據第 11 步的描述進行修改;除此之外的所有既有檔案均維持不變。你自己的暫存檔(.renders/)與交付檔案(out/)則可自由替換。 - 不使用符號連結。在建立、寫入或清空任何內容之前,需檢查其路徑:該路徑必須解析到當前資料夾內,且其任何部分都不得是符號連結。如果是,請停止並詢問使用者。自行建立
.renders/與out/作為一般資料夾。清空資料夾時,應逐一刪除你在其中建立的檔案,切勿使用可能跟隨符號連結的遞迴刪除。 - 路徑與指令中的命名。你選擇的每個會進入檔案路徑或指令的名稱,在首次使用前都必須符合其對應的模式;不符合的名稱將被替換為另一個名稱,絕不進行跳脫或截斷:
- 資料夾與簡短名稱(
<short-name>、<name>)、行 ID、提示 ID、音訊檔案名稱(不含副檔名)與場景名稱(<scene>):^[a-z0-9][a-z0-9-]{0,39}$; - 合成 ID(
<Comp>):^[A-Za-z][A-Za-z0-9]{0,39}$; - 影格編號(
<frame>、<a>、<b>、<frames>):符合^\d{1,7}$的整數; - 音量值(
<input_i>及第 9 步中的其他值):從 FFmpeg 輸出的 JSON 中複製,每個值需符合^-?\d{1,3}(\.\d{1,2})?$;其他值(如-inf、文字)則表示停止並修正混音。
- 資料夾與簡短名稱(
- 絕不從自由文字建構指令。使用者的描述、他們給你的檔案名稱,以及從檔案讀取的所有內容,都應放入 JSON 或原始碼檔案中,絕不放入指令列。將使用者給你的檔案複製到
public/目錄下,並使用符合第一個模式的名稱,加上符合^\.[a-z0-9]{1,5}$的小寫副檔名。逐一執行下方每個指令,完全按照其寫法,僅替換其中的佔位符,並將所有包含名稱的佔位符用單引號包起來,如同指令所示範的那樣。 - 不編寫會啟動程式的腳本:不使用 Node 或 Python 輔助程式,不在 package.json 中設定
scripts,不使用任何帶有shell: true、exec或指令字串的內容。除了此文件中的指令外,僅執行唯讀檢查(版本、雜湊值、檔案列表、可用記憶體)以及專案內的一般資料夾與檔案操作。 - 僅從固定的套件包(第 1 節)進行安裝。切勿執行
npm install、npm update、全域安裝、使用npx執行node_modules中不存在的任何套件,或使用sudo。在每次安裝或下載前,用一句話告知使用者這是什麼,並等待他們的確認。 - 除了套件包與指定的渲染瀏覽器(第 1 節)之外,不下載任何東西:不從網路下載字型、音樂、音效、圖片或模型。字型來自套件包;音訊、標誌和圖片僅來自使用者。
- 確定性:每個影格都是影格編號的純函數。動畫中不使用
Math.random、Date、計時器、useFrame或THREE.Clock,不使用即時網路資料。僅使用種子雜訊。 - 不使用真實品牌標誌(如 Adobe、Apple、Instagram 等),除非使用者提供其自身品牌的標誌。模擬內容應使用虛構品牌。
- 審查實際渲染的影格(PNG 靜止影像、從 MP4 解碼的影格),絕不瀏覽器或 Studio 的螢幕截圖。
1. 套件包
這些檔案與此 SKILL.md 位於同一目錄。在使用檔案前檢查每個檔案的雜湊值;若不一致,請停止並告知使用者。
| 檔案 | SHA-256 |
|---|---|
| package.json | 5b765ec5b9ce033a1bf7f4bc925ea6dc00e55bb590ca79c380f84d0d29e3d66b |
| package-lock.json | a92264f8a7777bb6fe465756af9abe03aec285942af7dd00f1d51f3eba7fa25f |
如果缺少某個檔案,請從 https://blog.alekseimedia.com/assets/kits/glass-skill/<file> 逐位元組下載,並檢查雜湊值。
它鎖定了 Remotion 4.0.534(remotion、@remotion/cli、three、fonts、motion-blur)、three 0.186.1、@react-three/fiber 9.8.1、React 19.3.0、TypeScript 5.9.3 及其類型,以及設計聖經中的三種字型檔案:@fontsource/inter-tight、@fontsource/instrument-serif 和 @fontsource/jetbrains-mono 5.3.0(SIL 開放字型授權)。鎖定檔案透過其完整性雜湊值鎖定了每個套件,因此第 3 步的安裝會檢查其安裝的每個檔案,包括字型。
建立新的影片專案:
- Node.js 20 或更新版本(
node --version)。若缺少,請要求使用者從 nodejs.org 安裝 Node.js LTS 及其標準安裝程式,然後等待。 - 在當前資料夾內為影片建立一個資料夾,命名為
video-<short-name>,並使用符合其模式(基本規則)的簡短名稱;若名稱已被使用,請選擇另一個。 - 從此技能資料夾中將
package.json和package-lock.json複製到該資料夾,檢查兩者的雜湊值,然後執行npm ci --ignore-scripts。切勿新增、更新或移除任何套件:使用套件包中的內容來建構你需要的東西。 - 渲染瀏覽器:Chrome Headless Shell 157.0.8080.0,即 Remotion 4.0.534 測試所使用的版本。若不處理,Remotion 會在首次渲染靜止影像或影片時自行下載它,且不會檢查其完整性,因此切勿讓它這樣做:為此電腦自行下載 zip 檔,檢查它,然後將 Remotion 指向該檔案,每個影片專案只需執行一次。渲染期間不會下載其他任何東西:字型是已安裝套件中的檔案。
- 選擇對應的行:使用 Apple 晶片的 macOS(
uname -m輸出為arm64)、使用 Intel 的 macOS(x86_64)、x64 的 Windows,或使用 glibc 2.35 或更新版本的 x64 Linux(ldd --version)。不支援任何其他系統:請告知使用者並停止。
- 選擇對應的行:使用 Apple 晶片的 macOS(
| 系統 | zip | 位元組數 | SHA-256 | 瀏覽器檔案 |
|---|---|---|---|---|
| macOS arm64 | https://remotion.media/chromium-headless-shell-mac-arm64-157.0.8080.0.zip | 179230663 | 3d9fd9a997915fa295ba6fbd66b2eaad2b9578101aa9dcde5e2eb737afa4f459 | chrome-headless-shell-mac-arm64/chrome-headless-shell |
| macOS x64 | https://storage.googleapis.com/chrome-for-testing-public/157.0.8080.0/mac-x64/chrome-headless-shell-mac-x64.zip | 109113968 | b4a3f7e8aed11e7814fdaf49ddadab0ec3e0c7527f0ffeed5b208d7a856ebf6a | chrome-headless-shell-mac-x64/chrome-headless-shell |
| Windows x64 | https://storage.googleapis.com/chrome-for-testing-public/157.0.8080.0/win64/chrome-headless-shell-win64.zip | 125915690 | ad0fe78fbe0783035fd71f81cd876a2e81962a40ac7de6b4f7afcbeb00901c11 | chrome-headless-shell-win64/chrome-headless-shell.exe |
| Linux x64 | https://remotion.media/chromium-headless-shell-linux-x64-157.0.8080.0.zip | 103668996 | 7c4a2751b361aeb3cff3ed788fa18b7a0849371b983d478bb9205b6cc25a8c52 | chrome-headless-shell-linux64/chrome-headless-shell |
- 告知使用者這是個 100 到 180 MB 的下載,並等待他們的確認。在影片資料夾中建立一個新資料夾
.browser-download/(如果該資料夾已存在,或其路徑的任何部分是符號連結,請停止並詢問),並將 zip 檔逐位元組儲存到其中:curl -fL --proto '=https' -o '.browser-download/chrome.zip' '<zip>'(在 Windows 上使用curl.exe,Windows 10 和 11 隨附),其中<zip>完全從對應的行中複製。 - 檢查其檔案大小和 SHA-256 是否與該行相符。任何不符都應刪除
chrome.zip和該資料夾,不使用任何東西並停止。 - 僅在兩者都相符時,使用系統自帶的工具從
.browser-download/內部解壓縮:在 Linux 上使用unzip -q chrome.zip(如果缺少unzip,請要求使用者安裝);在 macOS 上使用ditto -x -k chrome.zip .;在 Windows 上使用 Windows 隨附的tar指令:C:\Windows\System32\tar.exe -xf chrome.zip(Git Bash 的tar無法讀取 zip 檔案)。然後刪除chrome.zip,確認該行的瀏覽器檔案是一個普通檔案,且其路徑的任何部分都不是符號連結,然後將.browser-download/重新命名為.browser/(一步完成;如果.browser/已存在,請停止並詢問)。 - 在
remotion.config.ts中指向它(第 5 步):Config.setBrowserExecutable(".browser/<browser file>")。設定完成後,Remotion 將啟動此檔案,且不會下載任何內容。如果某個指令曾輸出正在下載瀏覽器,則表示路徑錯誤:在渲染其他任何東西之前修正它。
- ffmpeg 和 ffprobe:僅使用 Remotion 隨附的副本,即
npx --no-install remotion ffmpeg ...與npx --no-install remotion ffprobe ...。該建置版本沒有tile、fps或drawtext濾鏡;下方每個指令僅使用其擁有的濾鏡。下方每個用於寫入檔案的 ffmpeg 指令,僅會寫入此專案自身的.renders/或out/檔案,並以-y開頭,以便重新渲染時能取代它們:沒有它,ffmpeg 會因檔案已存在而拒絕執行,但仍會以 0 退出。ffmpeg 不會自動建立資料夾,因此請先建立輸出資料夾,並在每個指令執行後檢查輸出是否存在且是新檔案。
2. 工作流程
按順序執行步驟。切勿跳過任何一步:每一步的成本都比它可能避免的錯誤來得低。
第 1 步:簡報
僅詢問一次,用一條簡短的訊息,只問你無法決定的事情:影片的用途與觀看對象;長度(預設 20 到 30 秒);格式(Reels/TikTok/Shorts 用 9:16 1080x1920,螢幕用 16:9 1920x1080,或兩者皆有);螢幕上顯示的文字(或由你撰寫);行動呼籲;品牌顏色與標誌檔案;參考資料(螢幕截圖或連結);由使用者擁有或已取得授權的音效與音樂檔案(如為音樂,也詢問他們是否知道節奏)。決定其他所有事項。編寫 docs/BRIEF.md。
此技能不會產生旁白或自訂音效:影片完全依賴螢幕上的文字、圖片以及使用者的音訊。如果使用者要求加入語音,請用一句話告知無法提供,然後繼續進行。
僅支援英文:字型模組僅載入其 latin 檔案。螢幕上的每個字元必須是可列印的拉丁字元(U+0020 至 U+007E 或 U+00A0 至 U+00FF,但 U+00AD 除外),或者是 U+2013、U+2014(破折號)、U+2018、U+2019、U+201C、U+201D(彎曲引號)、U+2026(省略號)和 U+20AC(歐元符號)中的一個;不得使用控制字元、零寬度字元或方向字元。在渲染第一個靜止影像之前,根據此規則檢查時間軸上的所有文字。如果使用者希望使用另一種語言或文字,請告知此技能僅支援英文並停止,而非使用後備字型進行渲染。
如果你需要撰寫文字:每行一個想法,3 到 8 個單詞,每行一個重音單詞。
第 2 步:主時鐘
一個檔案為整個影片設定時間,src/data/timeline.json:
{ "fps": 60, "duration": 24.0, "bpm": 120,
"lines": [ { "id": "hook", "text": "What if one file could do this?", "start": 0.3, "end": 2.4,
"accent": 1.1 } ] }
- 根據閱讀速度(約每秒 3 個單詞,每行至少 1.2 秒,行與行之間留 0.3 到 0.5 秒的空白)對齊時間,並將行的起始點對齊到節拍(60 / bpm 秒)。若無已知的節奏,則僅使用閱讀速度,並省略
bpm。 src/lib/time.ts匯出FPS、L(id)(該行)、F(n)(n 幀對應的秒數)、toFrame(s)和useTime()。場景中絕不硬編碼秒數或影格數:使用L("cta").start + F(6)、L("hook").accent。改變節奏只需重寫 timeline.json,整個影片的時序會自動重新計算。- 每個新行應對應一個新的視覺效果。重音單詞的視覺效果必須在其設定的時間點準確發生,誤差在 2 幀以內。
- 聲音提示位於
src/data/cues.json:{ "id": "whoosh-1", "file": "whoosh.wav", "t": 3.42, "syncAt": 0.31, "gainDb": -6 }。t是同步點在影片中的時間(秒),根據時間軸計算得出;syncAt是該同步點在音訊檔案內的位置(從檔案開頭算起,單位為秒,見第 8 步);file是public/audio/中的一個音訊檔案。場景中的所有運動若帶有聲音,都必須與同一個t對齊,以確保畫面和聲音不會不同步。 - 先將時間轉換為影格數,然後使用整數進行計算:如果一個區間結束於兩個影格之間,會產生一個影格的間隙,導致圖層消失。
第 3 步:分鏡:一個權威的鏡頭規劃
docs/STORYBOARD.md 是建構每個場景的唯一藍本。如果你嘗試了替代方案,請將最終選擇的方案合併到此檔案中;所有場景都必須遵循此檔案,別無其他。它應包含:
- 一個幕次表:行、影格、場景、主角、顏色、音樂;
- 物件鏈:每個主角如何轉變為下一個(一張卡片掉入螢幕,螢幕的光變成閃光)。轉場是物件和攝影機的運動,而非交叉淡變;
- 每行內容:時間與影格、一個主角、每個元素的入場方式、時機與出場方式、攝影機運動、螢幕上的確切文字、轉場方式、聲音提示;
- 每幕一個攝影機關鍵幀列表,作為一條連續的路徑;
- 動態模糊視窗(僅限快速運動時);
- 入場效果審計:每個元素及其入口類型;
- 每行的「完成條件」清單與驗證影格(每行起始點、重音點和轉場點)。
什麼會讓影片看起來昂貴,因此要為此進行規劃:一個場景,而非一個背景(天空、光線、深度、視差圖層);由一盞燈光照亮的真實 3D 物體;從第 0 幀開始的運動;精心設計的字體搭配;正在被操作(光標移動、打字、按壓)的 UI,而不僅僅是顯示出來;一個打破節奏的對比節拍(黑暗或寂靜的時刻);一個承載故事線索的重複出現的物體或角色;在節拍上進行剪輯;每個元素的出現都應有動機;使用者的效果能涵蓋的每個運動下方都應有聲音。
向使用者展示一個簡短版本(一個表格:時間、螢幕上顯示的內容、哪種聲音),並請求他們確認或提出修改。這是進行修改最經濟的時機。
第 4 步:設計聖經
docs/BIBLE.md 是所有場景編寫時必須遵守的契約:
- 格式。9:16 1
...
[因原始內容被截斷,此處省略部分內容]