跳到主要内容

录制流程

录制页同时管理相机录制和打点采集,支持 BLE 蓝牙指环、手表和屏幕手势三种打点输入方式,录制结束后优先使用 rename 原子保存(<1ms),跨文件系统时退回 Isolate 后台拷贝。

用户旅程

首页 → 选择运动 → 录制页(预览)→ 开始录制 → 打点 → 停止录制 → 回放页

保存失败 → 降级保存(仅打点)

页面状态

预览模式
控制区: [方向] [翻转] [1080p] [30fps]
↓ 点击开始录制
录制模式
控制区: [方向] [蓝牙状态] [● 时长]
↓ 点击停止 / App 切后台
保存中
遮罩: "正在结束录制并保存..."
PopScope 禁止返回

跳转回放页

打点输入源

输入源标识触发方式
BLE 蓝牙指环ble_ring原生层 MethodChannel 回调
手表watchWatchCommunicationService
屏幕手势gesture页面滑动/点击
手动添加manual回放页添加(非录制时)

所有输入统一由 DotInputManager 管理。

录制保存流程

停止相机 → XFile(tempPath)

├── 检测视频方向 (FFprobe isPortraitVideo)
├── 构造 RecordingData → 保存 .blink 文件 (AES 加密)

├── File.rename (原子操作 <1ms)
│ ├── 成功 → copyComplete=true → 立即导航
│ └── 失败 → BackgroundCopyService (Isolate 拷贝)

├── 插入 DB → 导航到回放页

└── 异步后台: 生成缩略图 + 通知媒体库 + 云同步

异常保护

场景处理
App 切后台_autoSaveRecordingData()
蓝牙事件触发 lifecycle5 秒冷却期,跳过 autoSave
相机不可用_saveDotRecordsOnly() 降级(recordType=2)
dispose 兜底_saveDotRecordsOnly() fire-and-forget
停止按钮误打点_suppressNextDot 标志位屏蔽
保存中返回PopScope canPop 加 _isSaving 条件

分辨率和帧率

分辨率说明帧率
720pResolutionPreset.high30/60/24 fps
1080p (默认)ResolutionPreset.veryHigh循环切换
4KResolutionPreset.ultraHigh-

相关文档