3. 双摄同步机制:主副帧同步策略
双摄虚化效果的核心前提是主摄与副摄在同一时刻捕获场景信息。若两路图像存在帧级时间偏差,会导致视差计算错误、虚化边缘重影甚至主体错位。本章深入分析硬件同步(HW SYNC)与软件同步(SW SYNC)两种主流方案,并给出时间戳对齐的工程实践。
3.1 帧同步的核心挑战
双摄模组在物理上独立,各自拥有独立的传感器、ISP 管道和驱动时序。帧同步需要解决以下三个层面的不一致:
- 曝光起始时刻不一致:主副摄的 VSYNC 信号相位差导致曝光窗口错开。
- 帧传输延迟差异:MIPI 通道数、时钟频率不同造成数据到达时间不同。
- ISP 处理流水线深度不同:主摄可能开启多帧融合或 HDR,副摄可能直出,导致输出时间戳偏移。
工程经验: 在 HAL 层调试初期,建议先通过示波器抓取主副摄的 VSYNC 与 XSHUTDOWN 信号,确认硬件层面的帧起始偏差是否在 1 行时间以内。若偏差超过 1 帧,则软件同步几乎无法补偿。
3.2 硬件同步(HW SYNC)方案
硬件同步通过物理信号线将主摄的帧同步信号(如 VSYNC、TRIGGER)直接连接到副摄的同步输入引脚,使副摄严格跟随主摄的曝光节奏。该方案延迟最低、确定性最强。
HW SYNC 典型连接拓扑:
主摄 Sensor —— VSYNC_OUT ——→ 副摄 Sensor SYNC_IN
主摄 Sensor —— XSHUTDOWN ——→ 副摄 Sensor TRIGGER
副摄 Sensor 内部 PLL 锁定主摄帧率,误差 < 1 μs
3.2.1 HW SYNC 关键参数
| 参数 | 典型值 | 说明 |
|---|---|---|
| 同步信号类型 | VSYNC / TRIGGER | VSYNC 用于帧起始同步,TRIGGER 用于精确曝光控制 |
| 同步延迟 | < 1 μs | 信号传播延迟 + 副摄 PLL 锁定时间 |
| 帧率锁定范围 | ±0.01% | 主副摄帧率完全一致,无累积漂移 |
| 适用场景 | 高端旗舰机 | 要求模组厂商提供同步引脚支持 |
3.3 软件同步(SW SYNC)方案
当硬件不支持同步引脚时,只能通过软件策略对齐帧流。软件同步依赖时间戳匹配和缓冲区队列管理,延迟较大但灵活性高。
SW SYNC 核心流程:
- 主摄帧到达 HAL 层时记录硬件时间戳 T_master。
- 副摄帧到达时记录 T_slave。
- HAL 层维护一个滑动窗口(通常 2~3 帧深度),寻找 |T_master - T_slave| 最小的帧对。
- 丢弃无法匹配的孤帧,将匹配帧对送入虚化算法模块。
3.3.1 SW SYNC 关键参数
| 参数 | 典型值 | 说明 |
|---|---|---|
| 帧匹配窗口 | 2~3 帧 | 窗口越大匹配成功率越高,但延迟增加 |
| 时间戳精度 | ≥ 1 ms | 依赖 CLOCK_MONOTONIC 或硬件时间戳 |
| 帧率偏差容忍 | ±1% | 超过此范围会导致频繁丢帧 |
| 额外延迟 | 1~2 帧周期 | 等待匹配帧对造成的流水线延迟 |
3.4 HW SYNC 与 SW SYNC 对比
| 对比维度 | HW SYNC | SW SYNC |
|---|---|---|
| 同步精度 | < 1 μs | 1~10 ms |
| 帧率锁定 | 硬件强制锁定 | 软件统计匹配 |
| 延迟增加 | 无 | 1~2 帧 |
| 硬件要求 | 需要同步引脚 | 无特殊要求 |
| 模组选型 | 受限 | 灵活 |
| 功耗影响 | 低 | 中(CPU 轮询) |
| 适用产品 | 旗舰机 | 中低端机 / 多供应商 |
选型建议: 如果模组供应商支持 HW SYNC,优先使用 HW SYNC。SW SYNC 仅作为降级方案,且必须在 HAL 层实现动态切换逻辑:当检测到副摄帧率漂移超过阈值时,自动回退到 SW SYNC 模式并增大匹配窗口。
3.5 时间戳对齐工程实践
无论采用哪种同步方案,最终都需要将主副摄帧的时间戳对齐到统一的参考时钟域。以下是 HAL 层时间戳对齐的标准流程:
- 统一时间基准:所有时间戳统一使用
CLOCK_MONOTONIC,避免系统时间跳变影响。 - 硬件时间戳捕获:在 sensor 驱动中,于 VSYNC 中断服务函数内调用
ktime_get_ns()记录帧起始时间。 - ISP 管道延迟补偿:统计从 sensor 输出到 HAL 层接收到 buffer 的平均延迟 ΔT,在时间戳中减去 ΔT 得到真实曝光时刻。
- 帧对匹配与输出:HAL 层维护一个有序队列,按时间戳差值最小原则匹配帧对,匹配成功后输出包含
master_ts和slave_ts的元数据。
HAL 层时间戳对齐伪代码:
// 帧到达 HAL 层回调
void onFrameArrived(int camera_id, buffer_handle_t buf, int64_t hw_ts) {
// 补偿 ISP 管道延迟
int64_t adjusted_ts = hw_ts - isp_pipeline_delay_ns[camera_id];
if (camera_id == MASTER_CAM) {
master_queue.push({adjusted_ts, buf});
} else {
slave_queue.push({adjusted_ts, buf});
}
// 尝试匹配
while (!master_queue.empty() && !slave_queue.empty()) {
auto &m = master_queue.front();
auto &s = slave_queue.front();
int64_t diff = abs(m.ts - s.ts);
if (diff < SYNC_THRESHOLD_NS) {
// 匹配成功,输出帧对
outputFramePair(m.buf, s.buf, m.ts, s.ts);
master_queue.pop();
slave_queue.pop();
} else if (m.ts < s.ts) {
// 主摄帧超前,丢弃主摄帧
dropFrame(m.buf);
master_queue.pop();
} else {
// 副摄帧超前,丢弃副摄帧
dropFrame(s.buf);
slave_queue.pop();
}
}
}
3.5.1 时间戳对齐验证方法
| 验证手段 | 操作方式 | 通过标准 |
|---|---|---|
| 示波器测量 | 同时抓取主副摄 VSYNC 与 HAL 层输出时间戳 | 时间戳偏差 < 1 行时间 |
| 运动场景回放 | 拍摄快速移动的 LED 点阵,检查双摄图像中 LED 位置 | 位置偏差 < 1 pixel |
| 帧对一致性统计 | 连续采集 1000 帧,统计时间戳差值分布 | 差值标准差 < 0.5 ms |
工程避坑: 部分 sensor 驱动在 MIPI CSI 错误恢复后会重置时间戳计数器,导致时间戳跳变。HAL 层必须检测时间戳单调性,若发现回退或跳变超过 2 帧周期,立即清空匹配队列并重新开始同步。
3.6 本章小结
- 双摄帧同步是虚化效果的基础,HW SYNC 提供微秒级精度,SW SYNC 提供毫秒级精度。
- HW SYNC 依赖硬件走线,适用于旗舰产品;SW SYNC 通过时间戳匹配实现,适用于中低端产品。
- 时间戳对齐必须统一时钟源、补偿 ISP 延迟、并实现鲁棒的帧对匹配与孤帧丢弃逻辑。
- 验证阶段需结合示波器、运动场景和统计方法,确保同步精度满足虚化算法要求。