在 Resolve 时间线上创建屏幕教程
将教程描述(film.json)及其截图转变成编辑者可以继续处理的时间线。剪辑片段具有普通的 Inspector 关键帧,标题是具有 Inspector 控件的 Fusion 标题,场景已标记。此过程不会添加音频,旁白和音乐将在之后添加。
Resolve API 无法设置关键帧或标题时长,因此构建过程会将这些内容写入时间线文件并导入。references/how-it-works.md 对此进行了说明,并列出了已知问题。如果某个步骤失败或 Resolve 版本高于 21.2,请阅读该文档。
开始之前
- Resolve Studio 正在运行且已打开一个项目。使用
get_resolve_status检查,并调用一次get_whats_new(since设置为21.0),因为 Resolve 服务器有此要求。 - 在 Resolve 之外:安装有 Python 及
pillow库,并且 ffmpeg 已加入 PATH。 - 项目的时间线格式必须为 1920x1080。
preflight会检查此项。
与用户决定
尽量从对话中确定以下事项,仅针对缺失的部分向用户提问:
- 项目。时间线将放入已打开的项目中。向用户说明项目名称。切换项目可能会丢失用户的未保存工作,因此如果是错误的项目,请让用户手动切换。
- 截图。截图由用户提供,或者您自己捕获。使用 Playwright 时,请使用 1920×1080 视口并设置
deviceScaleFactor: 2:图片将以 3840×2160 输出,getBoundingClientRect给出的坐标已经适用于film.json。检查每张提供的图片,使用适合目标受众的图片,并告知用户您省略了哪些。 - 品牌。颜色、字体、标志以及任何标签(例如“主持人”或“管理员”)。首先查看用户的代码或已有的标题。Text+ 只能看到已安装的字体,未经允许不要安装新字体。
- 时间线的名称。选择一个未使用的名称。切勿替换您未构建的时间线。
编写 film
创建一个用于存放电影的文件夹,并在其中写入 film.json。references/film-format.md 包含了格式说明。请立即阅读该文档。
一些可读性好的时间设置:
- 每个场景显示 6 到 10 秒,说明栏保持足够长的时间以便阅读两遍,大约每 8 个字符 1 秒。
- 摄像机运动大约持续 1 秒,并在光标移动或高亮显示之前让其稳定下来。
- 光标移动大约持续 0.8 秒,点击大约在光标到达后 0.3 秒发生。
- 如果新镜头的布局在当前缩放比例下对齐,则点击后立即以新镜头显示结果。如果页面完全改变,则在点击后立即结束场景,让叠化过渡到下一个场景。
- 为了在叠化期间保持光标静止,请将下一个场景的光标起始位置设置为帧上相同的位置,使用公式
x' = tx + x * zoom。 - 在开头和结尾各使用约 3 秒的卡片。
说明栏应仅表述截图中显示的内容或用户告知的内容,您推断出的任何内容都应放在报告中。
高亮区域未对准按钮是此格式最明显的错误,因此请测量而非估算。图片的显示比例可能与实际大小不同,因此不要直接从图片上读取坐标:
python "<SKILL>/scripts/measure.py" grid shot.png grid.png
打开 grid.png(带有帧坐标标记)以大致找到按钮填充区域上的点。然后获取其精确矩形,并检查结果:
python "<SKILL>/scripts/measure.py" at shot.png 1250 470
python "<SKILL>/scripts/measure.py" show shot.png check.png 1200,450,180,40
边框颜色与附近颜色相似的按钮可能会泄漏,因此请阅读警告,如果矩形看起来太大,请降低容差。
构建
SKILL 是此技能的文件夹,WORK 是电影文件夹。Shell 步骤可在任何位置运行。Resolve 步骤通过 run_script_unsafe 执行。每次调用时传递 timeout: 60,因为该工具的默认超时时间是 10 秒,而这些步骤可能需要更长时间。每个步骤都以以下内容开始:
SKILL = r'<this skill folder>'; WORK = r'<film folder>'
exec(open(SKILL + r'\scripts\resolve_steps.py', encoding='utf8').read())
在 film.json 存在之前,project_format(project) 提供项目的大小、帧速率和时间线列表,fonts_available('Lato', ...) 提供已安装的字体及其样式。除非有理由不这样做,否则将 fps 设置为项目的帧速率。
1. 检查项目。 在继续之前修复 problems 中的任何问题,对于需要用户决定的问题请询问用户,并传递任何 notes。此步骤不会更改任何内容。
result = preflight(project, WORK)
2. 规划并安装标题。 阅读警告并在 film.json 中修复重要问题。此步骤将标题安装到 Resolve 的 Templates 文件夹中(属于该品牌),并替换同名的任何内容,因此请告知用户。
python "<SKILL>/scripts/plan.py" "<WORK>"
python "<SKILL>/scripts/templates.py" "<WORK>" --install
3. 构建时间线。 此步骤导出构建块、写入时间线文件、导入时间线、应用 API 可设置的设置、检查结果并移除本次构建的两个临时时间线。它仅替换由这个文件夹构建的时间线,因此如果用户可能编辑过该时间线,请先询问,因为编辑内容会丢失。
result = build_film(project, WORK)
verify.problems 应为空。如果 done 为 false,则重复执行 result = finish_batch(project, WORK) 直到其为 true,然后运行 result = dict(verify=verify(project, WORK), cleanup=cleanup(project, WORK))。Resolve 可能需要几秒钟才能识别新安装的标题,因此 build_film 会等待它们。如果仍然无法插入标题,请要求用户在保存工作后重启 Resolve。
不要删除素材箱,无论是此处还是清理时:剪辑可能从一个素材箱链接到其他位置的时间线(请参阅 references/how-it-works.md)。
4. 查看效果。 此步骤直接从时间线导出带有标签的帧表:每个场景、每个高亮的中间位置以及每次点击之后的位置。这需要几秒钟,无需渲染,因此渲染设置不会更改。在 build/review/ 中打开这些帧表。
result = review_frames(project, WORK)
检查高亮是否位于元素上、光标是否落在预期位置、涟漪是否可见、说明栏是否合适以及没有任何黑帧。如需更仔细地检查,review_frames(project, WORK, seconds=[10.5, 20.2]) 将以全尺寸显示这些时间点(以时间线秒为单位)。plan.py 会打印每个场景的开始时间,用于从场景时间进行转换。
这些帧与同一帧的渲染结果匹配(在 Resolve 21.2 上测试通过)。review_frames 需要 21.2 版本的帧导出 API。在旧版 Resolve 上,它会引发错误,此时使用下面的渲染方法:在没有参考帧的情况下运行 review.py 以获得相同的帧表。
5. 需要文件时进行渲染。 渲染以向用户提供视频,或用于 remotion-to-resolve 的比较。start_render 会更改项目的渲染设置,因此请告知用户。
result = start_render(project, WORK, 'review')
result = wait_render(project, '<job id>', 50) # 重复直到状态为 Complete
python "<SKILL>/scripts/review.py" "<WORK>" "<WORK>/build/render/review.mp4"
删除您的作业,并且只删除您的,因为渲染队列中可能包含用户的作业:
result = remove_job(project, '<job id>')
要更改某些内容,请编辑 film.json,运行 plan.py,然后再次调用 build_film,接着再次查看。如果您已渲染,请先移除该作业。如果品牌或 fps 发生变化,也请再次运行 templates.py。如果用户已手动编辑时间线,请先询问是否重新构建,或者手动在时间线上进行更改。
完成
除非用户要求,否则将保存操作留给用户,因为保存也会提交他们打开的其他未保存编辑。报告以下内容:
- 时间线、素材箱以及轨道
- 标题安装的位置
- 新的时间线现在是当前时间线,指明
preflight发现打开的时间线名称,并且如果您已渲染,则说明渲染设置已更改 - 您推断出的任何说明栏措辞,以及截图中与需求冲突的任何内容
- 您检查了哪些内容,以及未检查哪些内容。帧显示了画面,但未显示运动或 Inspector 和时间线在 Resolve 中的外观。
- 任何近似值以及以下限制:无音频、仅静态图片、以及高亮在摄像机运动期间保持在帧上
剪辑来自磁盘上的文件,因此移动电影文件夹或截图会导致剪辑脱机。同时保留 build/assets/ 文件夹,因为光标和背景画面位于其中。
要从效果库中移除某个品牌的标题,请运行 templates.py "<WORK>" --uninstall。它只会移除该品牌的四个文件。已构建的时间线会保留它们自己的副本:移除后渲染的结果仍完全相同。