Screen Studio:先录下操作,再决定观众看哪里
Screen Studio 是面向 Mac 的录屏与编辑工具,帮助制作产品演示和教程。它把点击生成的缩放、可调整的光标与剪辑放在同一流程里,让操作过程更容易被看懂。
先尝试拆解问题、设计和实现,再展开思路,检查状态、边界与取舍,并设计验证用例。思路提供分析路径,不给出完整实现。
01
代码思考进阶
剪辑后的时间怎样映射回原片?
练习场景
你在为自己的录屏编辑器设计时间查询模块。原片删去等待、加速输入后,成片第6秒未必对应原片第6秒。预览播放器必须找回正确的原片时间,才能同步显示画面与点击标记。本题只设计映射,不处理视频解码、音频、帧率或完整播放器。
输入与术语
- 只有一份原片。输入按成片播放顺序排列,最多100,000个片段;每个片段包含唯一非空字符串
id、原片起点start、终点end、速度speed。时间单位为毫秒,start/end是0到1,000,000,000之间的整数且start < end;speed只允许1、2、4。字段之外的数据不参与映射。 - 每段表示原片的半开区间
[start,end):包含起点,不包含终点。片段可以重排,也可以多次使用相同原片范围;列表顺序就是成片顺序,片段间没有额外空白。2倍速表示原片经过2毫秒,成片经过1毫秒。 - 查询输入是成片时间
t,用非负整数四分之一毫秒刻度表达。例如t=24,000表示成片6,000毫秒。所有算术都可使用精确整数,不要求浮点误差处理。成片每段的持续时间也用这个刻度表示。 - 输入结构、字段类型、数值范围、ID重复或非法速度任一错误,整体返回带片段下标/字段的错误,不建立部分可用索引。空列表合法,代表时长0。
需要满足的行为
- 有效查询返回
{segmentId, sourceTimeTicks},其中原片时间也以四分之一毫秒为单位。无效类型、负数或非整数查询返回参数错误;合法查询若达到或超过总时长,返回明确的结束/越界结果,不夹到最后一帧。 - 接缝时刻属于下一片段。反向查询不是本题要求:原片同一时刻可能被重复使用,不能假设原片时间到成片时间是一一对应。
- 设计一次预处理和多次查询的结构,解释前缀时长、边界查找与片段内换算。只给设计与验证思路,不写完整实现或逐行伪代码。
用这个小例子推演
片段按顺序为 A=[0,4000),1倍;B=[8000,12000),2倍;C=[1000,3000),4倍。先计算成片总时长,再查询 t=0、16,000、23,999、24,000、25,999、26,000;说明每次对应哪个片段或是否结束。C与A使用了部分相同原片,不能按原片起点重新排序。
需要交付什么
提交输入校验清单、索引含义、上述查询结果、至少三条不变量及边界测试。说明n个片段的预处理时间、空间和单次查询复杂度;把数学时间映射与真实播放器的取帧行为分开。
查看思路
- 先统一单位和验证边界。 四分之一毫秒使本题三种速度的持续时间都能精确表达:每段先将原片毫秒差乘4,再除以速度。先完整验证输入,再发布新索引;ID重复要报告原下标和字段,不能只保留最后一项。
- 保存成片顺序上的累计边界。 每段的成片起点来自此前片段的持续时间总和。原片区间可以重叠,不能拿原片start做排序或查找。正持续时间保证成片的累计终点严格递增,可用于二分定位。
- 让接缝只归属一次。 查找第一个累计终点严格大于t的片段。片段内成片偏移乘速度,再加该片段原片起点的四分之一毫秒刻度,得到原片时间。先处理空列表、参数错误与t达到总时长,避免越界时误落入末段。
- 手推有重叠的例子。 A、B、C持续时间分别为16,000、8,000、2,000刻度,总计26,000。给定查询依次为A/0、B/32,000、B/47,998、C/4,000、C/11,996、结束;斜线后为原片刻度。接缝24,000必须落在C,不能延续B,也不能因C原片起点较小而调序。
- 检查保证与成本。 对合法片段,映射原片时间始终落在该段半开范围;移动一个成片刻度,段内原片增加speed刻度。完整校验和建索引O(n)时间与O(n)空间,单次二分查询O(log n)。最大总刻度不超过4×10^14,仍在JS安全整数范围内;这不规定解码器怎样选帧或解决音画同步。