Communitygithub.com

MusicProWorkshop/remotion-to-resolve

將 Remotion 影片的程式碼轉換為可編輯的 DaVinci Resolve 時間軸,使用真實的檢視器關鍵幀來實現螢幕截圖的攝影機移動、Fusion 標題來處理字幕、卡片和重點標記,並保持相同的場景時間。最後逐幀比對渲染結果與 Remotion 的輸出。

remotion-to-resolve 是什麼?

此技能的核心作用是將 Remotion 專案中的逐幀渲染影片,重建為一個基於 DaVinci Resolve 工具(如靜態圖片、關鍵幀與 Fusion 合成)的可編輯時間軸。它並非像素級複製,而是透過讀取 Remotion 的場景資料,生成一個名為 `film.json` 的中介格式,再由配套的 `resolve-screen-tutorial` 技能將該格式轉換為實際的 Resolve 時間軸。 技能支援多種常見的 UI 元素映射,包括全螢幕截圖、攝影機移動、游標、圓環、字幕、標題卡和淡入淡出效果。對於不直接支援的元素(如圖表、粒子、3D 或逐字動畫的文字),技能會明確標示並告知使用者,若主要內容屬於此類,則建議放棄此方案。整個流程包含撰寫一個可重複執行的轉接器(adapter)、渲染參考影片、進行基於 SSIM 分數的逐幀比對,並產出詳細的差異報告,幫助使用者了解哪些部分被忠實重建、哪些被近似處理或遺失。

相容平台✓Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/MusicProWorkshop/davinci-resolve-skills/tree/HEAD/plugins/davinci-resolve-timelines/skills/remotion-to-resolve

在你喜歡的 AI 中提問

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

說明文件

Remotion 影片轉 Resolve 時間軸

讀取 Remotion 專案,撰寫一個小型轉接器,將其場景資料轉換為 resolve-screen-tutorial 技能所需的 film.json 格式,執行該建置流程,並將結果與 Remotion 的渲染輸出進行比對。

這是使用 Resolve 工具進行的重建,而非像素複製。React 可以繪製任何內容,而時間軸則使用圖片、關鍵幀和 Fusion 標題。因此,此工作的誠實部分是告訴使用者哪些內容能乾淨對應、哪些是近似結果,以及哪些無法轉換過來。

開始之前

  • resolve-screen-tutorial 應位於此技能資料夾的旁邊。請立即閱讀其 SKILL.md 和 references/film-format.md,因為你將撰寫該格式並遵循那些建置步驟。如果找不到,請告知使用者此技能需要該套件。
  • Remotion 專案需已安裝其依賴項。其原始碼維持不變:轉接器僅讀取其資料,不進行修改。

步驟

1. 讀取影片。 從 src/Root.tsx 開始,取得合成的 id、fps、width、height 和 durationInFrames,然後依序追蹤到場景元件及其資料。如果有多個合成且請求未指定,請詢問使用者。找出 public/ 下的所有素材。

2. 列出畫面內容並對應。 references/mapping.md 包含了從 Remotion 建構區塊到 film.json 的對照表。請立即閱讀。將每個元素歸類到以下三個群組之一:

  • 直接對應: 全螢幕截圖、攝影機移動、游標、圓環、字幕、標題卡、淡入淡出。
  • 近似處理: 其他緩動函數、其他轉場效果、未安裝的網頁字型、過於複雜的字幕樣式。
  • 無法轉換: 圖表、粒子特效、3D、Lottie 動畫、逐字母動畫的文字。

如果有重要元素屬於第三組,請在建置前告知使用者,並提供 references/mapping.md 中的選項。如果影片主要屬於該組,則表示此方法不適用,請直接告知,不要勉強建置一個品質低劣的副本。

3. 取得參考影片。 在 out/ 資料夾中尋找此合成的渲染輸出。最好它比合成本身的原始碼檔案更新,且具有正確的 durationInFrames 幀數(使用 ffprobe 檢查)。小型網頁編碼也可以接受,只會稍微降低比對分數。如果沒有,請使用合成本身的設定進行渲染:

npx remotion render <composition id> out/<composition id>.mp4

4. 撰寫轉接器。 將其放在 <project>/resolve/<composition id>/export-film.mjs,並讓它在同一個資料夾中寫入 film.json。該資料夾即為建置流程的影片資料夾。僅當使用者希望將這些檔案保留在儲存庫中時,才將 build/ 加入專案的忽略清單,且除非使用者要求,否則不要提交。

轉接器應導入影片的真實資料,這樣當副本或時間發生變化時,重新執行轉接器即可自動同步更新。references/mapping.md 提供了骨架和算術邏輯。僅在數值深藏在 JSX 內部時才手動複製,並告知使用者哪些值是手動複製的,因為這些值將不會跟隨後續的程式碼變更。

根據程式碼的顏色、字型和 Logo 設定品牌(brand)。列出影片載入的每一個字型,並使用 fonts_available 檢查。如果某個字型未安裝,請詢問使用者是要安裝它還是使用一個相似的已安裝字型。即使名稱相同,已安裝的字型可能與網頁字型來自不同的字型版本,導致寬度略有不同。

5. 建置。 遵循 resolve-screen-tutorial 的 SKILL.md 中「Build」章節的步驟 1 到步驟 4,並將 WORK 設定為影片的資料夾。步驟 4 的 review_frames 是在渲染前進行的快速檢查。然後按照其步驟 5 進行渲染,因為比對需要完整的影片。跳過其 review.py 的呼叫,因為步驟 6 會使用參考影片執行相同的比對工作。比對完成後請移除你的渲染任務。其決策同樣適用於此:告知使用者此時間軸將放入哪個專案,且絕不取代你未建立的時間軸。將 fps 設為專案的影格率。film.json 中的時間使用秒為單位,因此即使與合成的影格率不同,時間點仍然正確。

6. 與 Remotion 渲染結果比對。 將參考影片傳遞給 review.py:

python "<resolve-screen-tutorial>/scripts/review.py" "<WORK>" "<WORK>/build/render/review.mp4" "<reference video>"

它會為整個影片和每個場景輸出 SSIM(結構相似性指數,1 表示完全相同),並顯示每個場景中最弱的影格。它會將並排比對結果寫入 build/review/ 資料夾(Resolve 在左側),以及 ssim-by-half-second.txt,此檔案可以揭露場景中最低分影格所隱藏的問題。開啟這些比對結果。如需更仔細查看,請加上 --at <seconds> 參數,以全尺寸顯示該時刻的並排比較(Resolve 在上方)。

作為參考,基於螢幕截圖且重建良好的影片,總分通常在 0.96 到 0.97 之間。如果某個場景的分數明顯低於相鄰場景,則表示存在實際差異,請查看其最低分影格:

你看到的畫面可能原因
所有元素都偏移或尺寸錯誤轉接器中的縮放或變形原點設定
整個影片在時間上偏移轉接器中的場景開始時間或轉場重疊計算錯誤
攝影機靜止時正確,移動時錯誤緩動函數(easing)
圓環稍微過大CSS 邊框(border)位於框內部,請參閱 film-format.md
僅文字不同字型:被替換,或相同名稱但不同字型版本

有些差異是預期中的,不需修正:

  • 重點標記出現得太晚,因為它要等到攝影機停止移動。
  • 圓環的發光效果會讓圓環內部也著色,因為 Fusion 的模糊效果會向內外擴散。
  • 字幕、游標和圓環在溶解轉場的中間就結束,而不是停留在轉出場景上。
  • 第一個之後的卡片會延遲半個溶解時間才開始動畫。

修正轉接器,重新執行,然後再次執行 plan.py 和 build_film。當剩下的差異都是你可以明確命名的類型時,即可停止。

7. 報告。 包含 resolve-screen-tutorial「Finish」章節的所有內容,再加上:

  • SSIM 分數
  • 步驟 6 中的差異列表,每個差異附帶其原因
  • 任何屬於「無法轉換」群組的項目,以及你如何處理它們
  • 轉接器的位置,如何重新執行,以及提醒使用者重建會取代現有的時間軸,導致在時間軸上所做的編輯遺失

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相關技能