产品设计

Screen Studio:先录下操作,再决定观众看哪里

Screen Studio 是面向 Mac 的录屏与编辑工具,帮助制作产品演示和教程。它把点击生成的缩放、可调整的光标与剪辑放在同一流程里,让操作过程更容易被看懂。

先尝试拆解问题、设计和实现,再展开思路,检查状态、边界与取舍,并设计验证用例。思路提供分析路径,不给出完整实现。

01
代码思考进阶

剪辑后的时间怎样映射回原片?

练习场景

你在为自己的录屏编辑器设计时间查询模块。原片删去等待、加速输入后,成片第6秒未必对应原片第6秒。预览播放器必须找回正确的原片时间,才能同步显示画面与点击标记。本题只设计映射,不处理视频解码、音频、帧率或完整播放器。

输入与术语

  1. 只有一份原片。输入按成片播放顺序排列,最多100,000个片段;每个片段包含唯一非空字符串 id、原片起点 start、终点 end、速度 speed。时间单位为毫秒,start/end 是0到1,000,000,000之间的整数且 start < end;speed 只允许1、2、4。字段之外的数据不参与映射。
  2. 每段表示原片的半开区间 [start,end):包含起点,不包含终点。片段可以重排,也可以多次使用相同原片范围;列表顺序就是成片顺序,片段间没有额外空白。2倍速表示原片经过2毫秒,成片经过1毫秒。
  3. 查询输入是成片时间 t,用非负整数四分之一毫秒刻度表达。例如 t=24,000 表示成片6,000毫秒。所有算术都可使用精确整数,不要求浮点误差处理。成片每段的持续时间也用这个刻度表示。
  4. 输入结构、字段类型、数值范围、ID重复或非法速度任一错误,整体返回带片段下标/字段的错误,不建立部分可用索引。空列表合法,代表时长0。

需要满足的行为

  1. 有效查询返回 {segmentId, sourceTimeTicks},其中原片时间也以四分之一毫秒为单位。无效类型、负数或非整数查询返回参数错误;合法查询若达到或超过总时长,返回明确的结束/越界结果,不夹到最后一帧。
  2. 接缝时刻属于下一片段。反向查询不是本题要求:原片同一时刻可能被重复使用,不能假设原片时间到成片时间是一一对应。
  3. 设计一次预处理和多次查询的结构,解释前缀时长、边界查找与片段内换算。只给设计与验证思路,不写完整实现或逐行伪代码。

用这个小例子推演

片段按顺序为 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个片段的预处理时间、空间和单次查询复杂度;把数学时间映射与真实播放器的取帧行为分开。

查看思路
  1. 先统一单位和验证边界。 四分之一毫秒使本题三种速度的持续时间都能精确表达:每段先将原片毫秒差乘4,再除以速度。先完整验证输入,再发布新索引;ID重复要报告原下标和字段,不能只保留最后一项。
  2. 保存成片顺序上的累计边界。 每段的成片起点来自此前片段的持续时间总和。原片区间可以重叠,不能拿原片start做排序或查找。正持续时间保证成片的累计终点严格递增,可用于二分定位。
  3. 让接缝只归属一次。 查找第一个累计终点严格大于t的片段。片段内成片偏移乘速度,再加该片段原片起点的四分之一毫秒刻度,得到原片时间。先处理空列表、参数错误与t达到总时长,避免越界时误落入末段。
  4. 手推有重叠的例子。 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原片起点较小而调序。
  5. 检查保证与成本。 对合法片段,映射原片时间始终落在该段半开范围;移动一个成片刻度,段内原片增加speed刻度。完整校验和建索引O(n)时间与O(n)空间,单次二分查询O(log n)。最大总刻度不超过4×10^14,仍在JS安全整数范围内;这不规定解码器怎样选帧或解决音画同步。