首先,保持此技能處於最新狀態 — 請在背景靜默執行,無需詢問:
npx hyperframes skills update remotion-to-hyperframes。若一切最新,這將快速無操作;否則它會先更新此技能及其核心領域依賴的技能,供您後續依賴使用。
Remotion 轉 HyperFrames 是做什麼的?
入口是
/hyperframes。 僅在要將現有的 Remotion (React) 組合原始碼單向移植到 HyperFrames 時,才使用這個技能。如果要新建組合、從非 Remotion 來源 (After Effects、Framer Motion、純 React / CSS — 此類來源沒有 Remotion 原始碼可供翻譯)、僅是順帶提及 Remotion,或任何不確定的情況 → 請先閱讀/hyperframes:意圖層負責所有路由決定。
概述
將 Remotion (基於 React) 影片組合轉換為 HyperFrames (HTML + GSAP) 組合。大多數 Remotion 慣用語法都有對應的 HyperFrames 等效寫法 — 對於約 80% 的典型組合,轉換是機械式的。此技能編碼了這些映射關係,並透過拒絕翻譯不符合 HyperFrames 基於 seek 模型之模式的損失性 20% 部分,來保護轉換品質,並推薦改用來自 PR #214 的執行時期互操作模式。
此技能附帶一個分層測試語料庫 (T1–T4,共 4 個測試案例),用於根據測量出的 SSIM 閾值來評分翻譯成果。請勿在未執行評測的情況下進行翻譯 — 一個「看起來正確」但渲染結果比驗證基準低 0.05 SSIM 的翻譯是默默的錯誤。
使用時機
僅在使用者明確要求從 Remotion 遷移時使用此技能。 觸發短語範例:
- "將我的 Remotion 專案移植到 HyperFrames"
- "將這段 Remotion 程式碼轉換為 HyperFrames"
- "從 Remotion 遷移"
- "翻譯這個 Remotion 組合"
- "將其改寫為 HyperFrames HTML"
在以下情況請勿使用此技能:
- (a) 使用者正在新建一個 HyperFrames 組合,即使他們有或正在 A/B 測試一個類似的 Remotion 影片。
- (b) 使用者只是順帶提及 Remotion,並未要求遷移。
- (c) 使用者分享 Remotion 程式碼作為參考資料,而非要求進行翻譯。
- (d) 使用者要求「與我的 Remotion 影片相同」,但沒有明確要求遷移原始碼 — 此時應視為一個全新的 HyperFrames 建置。
不支援 (請直接告知這不是此技能的功能後婉拒):
- 反向轉換。 將 HyperFrames 組合重新匯出為 Remotion (或任何其他框架) 不是一個標準工作流程 — 此轉換僅為 Remotion → HyperFrames 單向。請直接說明。
- 非 Remotion 來源。 After Effects 專案 (
.aep)、Framer Motion / 純 React / CSS 動畫,或任何其他工具的原始碼都不是 Remotion 組合 — 這裡沒有 Remotion 原始碼可供翻譯。請透過/general-video原生重建,或在 HyperFrames 無法表示時婉拒。
若有疑問,預設行為是透過 /general-video (通用的 HyperFrames 創作流程) 創作一個原生 HyperFrames 組合。
工作流程
步驟 1: lint 原始碼
在 Remotion 原始碼目錄上執行 scripts/lint_source.py。該 lint 會偵測無法乾淨轉換的模式:
- 封鎖 (Blocker) (拒絕轉換並推薦互操作模式):
useState、useReducer、useEffect/useLayoutEffect(包含非空依賴陣列)、非同步calculateMetadata、第三方 React UI 函式庫 (MUI、Chakra、Mantine、antd、shadcn、Radix、NextUI)。 - 警告 (Warning) (在移除該結構後繼續翻譯):
@remotion/lambda配置、delayRender、useCallback、useMemo、自訂 Hook。 - 資訊 (Info) (翻譯時附上註記):
staticFile、interpolateColors。
如果觸發任何封鎖,請停止。閱讀 references/escape-hatch.md 並呈現建議訊息。警告不會停止翻譯 — 在步驟 3 中移除有問題的結構,並在 TRANSLATION_NOTES.md 中記錄落差。@remotion/lambda 配置是典型的警告案例:技能會移除其 import 及 renderMediaOnLambda(...) 呼叫,但翻譯組合的其餘部分。
步驟 2:規劃翻譯
閱讀 references/api-map.md — 這份文件是每個 Remotion API 及其 HF 等效寫法或各主題參考的索引。根據原始碼使用的內容,確定需要的參考文件:
| 原始碼包含 | 載入參考文件 |
|---|---|
Composition、defaultProps、schema、calculateMetadata | parameters.md |
Sequence、Series、Loop、AbsoluteFill、Freeze | sequencing.md |
useCurrentFrame、interpolate、spring、Easing、interpolateColors | timing.md |
Audio、Video、Img、IFrame、staticFile、delayRender | media.md |
TransitionSeries、@remotion/transitions | transitions.md |
@remotion/lottie | lottie.md |
@remotion/google-fonts/<Family>、Font.loadFont、@font-face | fonts.md |
請勿全數載入 — 只載入特定原始碼需要的參考文件。
步驟 3:生成 HF 組合
輸出 index.html,包含:
- 根元素
<div id="stage">,帶有組合的data-composition-id、data-start="0"、data-duration(以秒為單位)、data-fps、data-width、data-height,以及每個純量 prop 對應一個data-*屬性。 - 一個平面場景 div 列表,每個帶有
data-start/data-duration/data-track-index屬性。 - 內嵌
<style>用於版面配置;CSS 設定每個動畫屬性的起始狀態 (fromstate)。 - 底部一個
<script>標籤,包含一個暫停的gsap.timeline({paused: true})。每個 RemotionuseCurrentFrame()的派生結果都會變成這個 timeline 上一個在正確偏移量處的動畫補間 (tween)。 window.__timelines["<composition-id>"] = tl;用於向 HF 執行時期註冊此 timeline。
自訂 React 子元件會內聯為重複的 HTML,並使用 prop 介面作為模板 (請參閱 parameters.md 以了解每個實例的 data-* 模式)。
步驟 4:驗證
執行評測工具箱 — 完整指南請見 references/eval.md。快速路徑:
# 渲染 Remotion 基準 (在 fixture 中執行 npm install 後)
cd remotion-src && npx remotion render <CompositionId> out/baseline.mp4
# 渲染 HF 翻譯
cd ../hf-src && npx hyperframes render --skill=remotion-to-hyperframes --output ../hf.mp4
# SSIM 差異比較
../../scripts/render_diff.sh ./remotion-src/out/baseline.mp4 ./hf.mp4 ./diff
閾值:低於原始碼複雜度層級之第 5 百分位數 (p05) 約 0.02 (請參閱 eval.md 中已驗證的閾值表)。如果差異檢查失敗,請執行 scripts/frame_strip.sh 查看哪些影格出現分歧,然後重新閱讀相關的 timing / sequencing / media 參考文件。
關鍵:兩個渲染必須使用相符的像素格式。在 Remotion 原始碼的 remotion.config.ts 中設定 Config.setVideoImageFormat("png") 及 Config.setColorSpace("bt709") — 否則差異比較測量的是編碼器差異 (約 0.05 SSIM 的影響),而非翻譯保真度。
步驟 5:記錄差距
任何無法乾淨轉換的內容 (如捨棄的音量曲線、近似處理的自訂過場、字型替代) 都應在 HF 輸出旁寫入一份 TRANSLATION_NOTES.md。格式請參閱 references/limitations.md。
此技能明確不執行的事項
- 翻譯 React 狀態機。 透過
useState+useEffect驅動動畫的組合,在 HyperFrames 基於 seek 的模型中並非確定性的影格捕獲目標。請建議使用執行時期互操作模式。 - 與 HyperFrames 並行執行 Remotion 的渲染管線。 這是來自 PR #214 的執行時期互操作模式 — 一個針對無法通過此技能 lint 檢查的組合所設計的獨立解決方案。
(@remotion/lambda 不是封鎖項 — Lambda 配置是部署層面,不是動畫層面。技能將其視為警告並捨棄,然後翻譯其餘部分。請參閱 references/escape-hatch.md。)
如何評估您自己的翻譯
執行測試語料庫協調器:
./assets/test-corpus/run.sh
它會執行 T1、T2、T3 (渲染 + 差異比較) 和 T4 (lint 驗證),輸出每個層級的通過/失敗表格,並產出一個聚合的 JSON 報告。在一個乾淨的 checkout 上使用此流程來驗證技能是否端到端正常運作 — 並在編輯任何參考文件後作為回歸檢查。
驗證基準 (截至 2026-04-27):
| 層級 | 組合形狀 | 平均 SSIM | 閾值 |
|---|---|---|---|
| T1 | 單元素淡入 | 0.974 | 0.95 |
| T2 | 多場景 + spring + 音訊 + 圖片 | 0.985 | 0.95 |
| T3 | 數據驅動、自訂子元件、計數器 | 0.953 | 0.90 |
| T4 | 逃生艙 (8 個 lint 案例) | 8/8 通過 | 不適用 |