制作视频
不要进行屏幕录制。录制会在盒子忙碌时出现卡顿,而且一旦修复后没人能重新运行它。请将影片编写为脚本。该工具包在虚拟时钟上运行页面,每 1/30 秒页面时间拍摄一帧,因此每个动画、定时器、滚动和按键都精确落在指定帧上。摄像头移动、光标和点击圆圈会在帧之后绘制。同一个脚本总是生成相同的影片。
工作流程
video new DIR写入一个起始文件DIR/film.mjs。将其指向一个包含伪造数据的临时服务器,绝不能指向真实账户。编写三到五个节拍,每个节拍有一个想法。heavy timeout 1800 video render DIR/film.mjs OUT/拍摄每个节拍,编码每个节拍并将节拍拼接成 MP4。首次渲染会先运行video check。如果屏幕上出现拒绝列表中的任何单词,渲染将失败。video sheet OUT/film.mp4 OUT/sheet.png 16,然后查看快照。大多数错误只在这里显现:从未滚动的列表、空面板、摄像头对准了错误对象。video stutters OUT/film.mp4必须报告 0 次卡顿。卡顿是指快速或跳动的运动。在内容本应切换(页面切换、消息到达)的地方出现卡顿是正常的;--allow A-B可跳过这些区间。video mp4 IN OUT.mp4制作 Web MP4(H.264, faststart)。video gif IN OUT.gif --max 3将宽度从 960 px 向下调整,直到 GIF 小于 3 MB。- 迭代脚本中的时间,切勿通过裁剪视频来调整。
节奏和完整导演 API 在 kit/KIT.md 中;在制作第一个影片前请阅读它。简要说明:总时长约 20 秒;目标 2 秒内完成主要操作;每个节拍一次摄像头移动(1.5-2x 放大,0.4-0.7 秒);结果至少保持 0.8 秒(d.show);打字速度约每秒 30 键。
如何实现流畅(来之不易的经验)
- 将仅用于影片的优化放在初始化脚本中,而不是在应用中。 让新项目以渐显动画方式出现(
animation: in .4s cubic-bezier(.16,1,.3,1),从 opacity 0 和 translateY 12px 开始),而不是突然弹出。对于跳转到末尾的列表,包装Element.prototype.scrollTop的 setter,使其在大约 500 毫秒内平滑滚动。hive-stars 演示影片是一个包含两者的完整示例。 - 使用
setTimeout驱动自己的运动。 影片的时钟精确运行定时器。时钟暂停时,requestAnimationFrame 回调可能不会触发。 - 查找页面的时间线。 如果应用依赖定时器(预定义回复在 0.7 秒、1.8 秒等),将每个节拍的
hold时间调整为与之匹配,以便节拍刚好在其展示的内容之后结束。 zoom和视口单位。 导演的zoom: 1.5以 1280x720 的布局拍摄 1920x1080 的画面。Chrome 不会将vh/dvh/vw除以根缩放值,因此工具包会重写同源样式表中的这些单位。如果不这样做,calc(100dvh - x)布局会变为 1.5 倍高,其滚动条永远不会滚动。跨域 CSS 不会被重写,因此请自行提供页面。- 修补
Date的应用。 工具包通过自身保存的Date读取时钟,因此包装了Date(如时间偏移、伪造的“现在”)的页面无法使pauseAt倒退。 - 拒绝列表: 主机名、用户名、Git 名称和电子邮件、真实项目名称。仅使用伪造数据。
3D 场景(Blender)
video blender SHOT.py OUT/ [--quality preview|final] 在 CPU 上渲染一个场景脚本。在作业限制器下运行(H2 上使用 heavy),并先运行 --quality preview,因为最终渲染每秒钟的影片可能需要几分钟。辅助工具(缓动、带有景深的摄像头、灯光架、从 KiCad 生成的 PCB、GDS 挤出、UI 平面、节点图)位于 kit/blender/README.md 中。使用工具包的 encodeFrames 或 ffmpeg 编码帧,然后使用 stitch 进行裁剪。
终端
kit/term.mjs 在沙盒中记录真实的 tmux/bash 会话(使用伪造的主目录和主机),然后在影片时钟上使用 xterm.js 重放。参见 kit/KIT.md。