视频继续播放,旁边的配速、心率、海拔和路线也在实时变化。

这些数字看起来只是几个简单的图形。

真正开始做以后,我们才发现,问题远没有“把几个数字放到视频上”这么简单。

因为运动设备记录的是数据,而 DaVinci Resolve 处理的是时间轴。

如何让两者准确地对应起来,才是整个产品真正需要解决的问题。

一切从 FIT 文件开始

Garmin、COROS 等运动设备记录一次活动时,通常会保存大量结构化运动数据。

FIT 是其中非常重要的一种格式。

一份 FIT 文件里可能包含:

  • 时间
  • GPS 坐标
  • 心率
  • 速度
  • 距离
  • 步频
  • 功率
  • 海拔
  • 圈段
  • 设备信息

以及大量与具体运动类型有关的数据。

从信息量来说,它非常丰富。

但对于视频创作者来说,这些数据还不能直接使用。

因为视频软件并不知道:

某个 FIT 数据点应该出现在视频的哪一帧。

这成为整个问题的起点。

两条完全不同的时间线

运动手表和摄像机是两个独立设备。

手表可能在 06:31:18 开始记录。

相机可能在几分钟以后才开始拍摄。

中间可能暂停录像、重新开机、切换镜头,甚至同时使用几台不同的设备。

于是我们面对的是两条完全不同的时间线:

运动数据时间线

视频时间线

只有把两条时间线对齐,运动数据才真正有意义。

假设视频中的某一帧对应运动记录里的第 1,427 秒,那么这一刻应该显示的心率、配速、位置和海拔,都必须来自这一时间附近的数据。

偏差几秒,有时候就足以让画面变得明显不自然。

尤其是在快速跑、骑行、爬坡或者比赛中。

数据不是连续的

另一个问题是,FIT 文件并不是视频。

视频可能是 30fps 或 60fps,每一秒都有几十帧。

运动设备的数据采样却可能以完全不同的频率出现。

因此不能简单地理解成:

“一帧视频对应一个 FIT 数据点。”

我们需要先把 FIT 中的记录解析成一条运动数据时间序列,再根据视频当前所处的时间,找到这一时刻应该呈现的状态。

这其中会遇到很多现实问题:

数据缺失怎么办?

GPS 短暂漂移怎么办?

速度突然跳变怎么办?

两个数据点之间应该如何过渡?

暂停运动以后时间轴应该如何处理?

这些细节决定了最后的浮层看起来是“一个会变化的数字”,还是一个真正可以用于视频制作的工具。

从数据变成视觉

解决时间同步以后,下一步才是大家最终看到的部分:

Gauge。

速度表、心率、路线、海拔、距离、计时器……

每一种 Gauge 本质上都是同一份运动数据的不同表达方式。

但好的运动数据浮层不能只是把数字直接显示出来。

例如配速从 4:01/km 变成 3:59/km,如果数字每次变化都会造成整个组件左右抖动,视频里的体验会非常差。

路线图需要考虑 GPS 坐标如何映射。

速度表需要考虑数值变化时动画是否自然。

海拔图需要考虑当前进度与整条路线之间的关系。

组件还必须能够适应不同的视频比例、分辨率和视觉风格。

到了这里,产品已经不再只是一个 FIT Parser。

它开始变成一个完整的运动数据视觉系统。

为什么最后选择 DaVinci Resolve

我们希望这些数据最终进入真正的视频制作流程。

而不是先生成一个固定的视频,再让创作者把它叠到自己的素材上。

对于创作者来说,更自然的方式应该是:

在剪辑过程中决定什么时候显示数据、显示什么数据、放在哪里,以及它应该是什么样子。

这也是 Resolve Telemetry Overlay 最终围绕 DaVinci Resolve 工作流设计的原因。

运动数据不应该是剪辑完成之后额外贴上去的一层东西。

它应该成为视频设计本身的一部分。

看起来简单的功能,背后通常并不简单

这也是我们开发这类工具时很有意思的一点。

最终用户看到的可能只是:

一个心率数字。

一条路线。

一个速度表。

但它们背后经历的是:

FIT 文件 → 数据解析 → 时间序列 → 时间轴同步 → 数据处理 → Gauge → 视频画面

任何一个环节出现问题,最后都会直接反映在画面里。

而真正好的工具,应该把这些复杂性藏起来。

用户不需要知道 FIT 文件内部是如何组织的,也不需要理解时间序列如何映射到视频。

他只需要选择自己的运动记录,然后开始创作。

从自己的需求开始

Resolve Telemetry Overlay 的起点其实很简单。

我们自己制作运动内容,也希望在视频里更自然地使用运动数据。

当现有工作流不能很好地解决这个问题时,我们决定自己做一个工具。

这也是 LIGHTOUCH 很多产品共同的起点。

先遇到一个真实的问题。

把它解决。

然后再看看,这个解决方案是不是也能帮助其他遇到同样问题的人。

从一份 FIT 文件,到最终出现在 DaVinci Resolve 时间线上的一个实时心率数字,中间经过了很多用户不会看到的步骤。

而我们认为,这恰恰是软件应该做的事情:

把复杂的过程留给工具,把简单的体验留给使用它的人。