Communitygithub.com

MusicProWorkshop/remotion-to-resolve

将Remotion视频代码转换为可编辑的DaVinci Resolve时间线,使用真实的检查器关键帧实现截图摄像机运动、Fusion标题实现字幕/卡片/高亮,保持相同场景时序,并逐帧与Remotion渲染结果对比。

remotion-to-resolve 是什么?

此技能将Remotion项目转换为DaVinci Resolve可编辑的时间线,并非像素复制,而是用Resolve原生工具重建:截图对应全帧图像、摄像机运动通过检查器关键帧实现、字幕和卡片转为Fusion标题。它读取Remotion项目的`Root.tsx`及场景组件,生成一个适配器脚本,将场景数据映射为`film.json`(与`resolve-screen-tutorial`技能格式一致),然后执行构建并逐帧对比SSIM指标。 技能会清晰分类哪些元素直接映射(全帧截图、摄像机运动、光标、圆环、字幕、标题卡、淡入淡出),哪些只能近似(其他缓动、其他过渡、未安装的网络字体、复杂的字幕样式),哪些无法转换(图表、粒子、3D、Lottie动画、逐字动画文字)。构建前会如实告知用户局限性。 支持CLI执行,需要`resolve-screen-tutorial`技能并行安装,并在Remotion项目目录下工作。适配器写入`<project>/resolve/<composition id>/export-film.mjs`,导入真实数据确保后续代码变更时自动同步。最终输出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检查),那就很好。小尺寸的Web编码也可以,只会轻微降低评分。否则,使用合成自身的设置渲染一个:

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设置品牌。列出视频加载的所有字体,并逐一使用fonts_available检查。如果某个字体未安装,询问是安装它还是使用类似的已安装字体。同名的已安装字体可能与网络字体是不同的版本,宽度会略有不同。

5. 构建。 从resolve-screen-tutorial的SKILL.md中的构建部分,从步骤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之间。某个场景评分明显低于相邻场景,则说明存在真实差异,查看其最低帧:

你看到的常见原因
所有内容偏移或尺寸错误适配器中的缩放或变换原点
整个电影时间偏移场景起始或过渡重叠在适配器中
摄像机静止时正确,运动时错误缓动
圆环稍微偏大CSS边框位于盒子内部,参见film-format.md
仅文字不同字体:被替换,或同名但不同版本

有些差异是预期的,无需修复:

  • 高亮出现较晚,因为它等待摄像机停止运动。
  • 圆环发光会染色其内部,因为Fusion模糊向两侧扩散。
  • 字幕、光标和圆环在溶解中间结束,而不是保留在退出场景上。
  • 第一个卡片之后的卡片会延迟半个溶解。

修复适配器,再次运行,然后再次运行plan.py和build_film。当剩余的都是你能命名的差异时,停止。

7. 报告。 包含resolve-screen-tutorial结束部分的所有内容,再加上:

  • SSIM评分
  • 步骤6中的差异列表,每个差异附上原因
  • 任何属于“无法转换”组的内容以及你对此的处理
  • 适配器位置、如何再次运行,以及重建会替换时间线,丢失在其上进行的编辑

Individual skills in this repo

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

相关技能