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
硬件同步(HW SYNC)架构图 主摄 Sensor MASTER 副摄 Sensor SLAVE 主摄 ISP 副摄 ISP Camera HAL 层 VSYNC / TRIGGER 硬连线 优势:帧级偏差 < 1 行时间 | 劣势:需要硬件走线,模组选型受限

3.2.1 HW SYNC 关键参数

参数 典型值 说明
同步信号类型 VSYNC / TRIGGER VSYNC 用于帧起始同步,TRIGGER 用于精确曝光控制
同步延迟 < 1 μs 信号传播延迟 + 副摄 PLL 锁定时间
帧率锁定范围 ±0.01% 主副摄帧率完全一致,无累积漂移
适用场景 高端旗舰机 要求模组厂商提供同步引脚支持

3.3 软件同步(SW SYNC)方案

当硬件不支持同步引脚时,只能通过软件策略对齐帧流。软件同步依赖时间戳匹配和缓冲区队列管理,延迟较大但灵活性高。

SW SYNC 核心流程:
  1. 主摄帧到达 HAL 层时记录硬件时间戳 T_master。
  2. 副摄帧到达时记录 T_slave。
  3. HAL 层维护一个滑动窗口(通常 2~3 帧深度),寻找 |T_master - T_slave| 最小的帧对。
  4. 丢弃无法匹配的孤帧,将匹配帧对送入虚化算法模块。
软件同步(SW SYNC)帧匹配流程 主摄帧流(FPS=30) M0 M1 M2 M3 M4 副摄帧流(FPS=30,相位偏移) S0 S1 S2 S3 匹配策略:选择时间戳差值最小的帧对,如 M0↔S0、M1↔S1 孤帧处理:M4 无匹配副摄帧,直接丢弃

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 层时间戳对齐的标准流程:

  1. 统一时间基准:所有时间戳统一使用 CLOCK_MONOTONIC,避免系统时间跳变影响。
  2. 硬件时间戳捕获:在 sensor 驱动中,于 VSYNC 中断服务函数内调用 ktime_get_ns() 记录帧起始时间。
  3. ISP 管道延迟补偿:统计从 sensor 输出到 HAL 层接收到 buffer 的平均延迟 ΔT,在时间戳中减去 ΔT 得到真实曝光时刻。
  4. 帧对匹配与输出: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 延迟、并实现鲁棒的帧对匹配与孤帧丢弃逻辑。
  • 验证阶段需结合示波器、运动场景和统计方法,确保同步精度满足虚化算法要求。