4. 帧率概念:帧率定义、帧间隔、帧率抖动、帧率稳定性指标

在 Camera HAL 与 V4L2 驱动调优中,帧率(Frame Rate) 是最直观的用户体验指标,也是衡量系统实时性的核心参数。本章从基础定义出发,逐步深入到帧间隔、帧率抖动以及量化稳定性的数学指标,为后续的调优策略打下理论基础。

4.1 帧率定义

帧率 表示相机每秒采集或输出的图像帧数,单位是 fps(Frames Per Second)。在 V4L2 驱动中,帧率通常由 VIDIOC_S_PARM 或 VIDIOC_S_FMT 控制,并在 struct v4l2_streamparm 中设定。

公式: 帧率 (fps) = 1 / 帧间隔 (秒)

例如,30 fps 意味着每帧间隔约为 33.33 ms。在 HAL 层,帧率直接影响预览流畅度、录像比特率以及后处理管线的负载。

注意: 帧率分为 标称帧率(设定值)和 实际帧率(测量值)。调优的目标是让实际帧率尽可能接近标称帧率,并保持稳定。
帧率与帧间隔关系示意图 F1 F2 F3 F4 帧间隔 T 帧间隔 T 帧率 = 1 / T,T 越稳定,帧率抖动越小

4.2 帧间隔

帧间隔(Frame Interval) 是相邻两帧之间的时间差,通常以毫秒(ms)或微秒(μs)为单位。在 V4L2 驱动中,帧间隔由硬件 VSYNC 或定时器决定,并通过 struct v4l2_fract 表示:

struct v4l2_fract {
    __u32 numerator;   // 分子
    __u32 denominator; // 分母
};
// 帧间隔 = numerator / denominator (秒)
// 例如:numerator=1, denominator=30 → 帧间隔 ≈ 33.33 ms

帧间隔的测量通常通过 时间戳(Timestamp) 完成。在 HAL 层,每个 buffer 的 timestamp 字段记录了硬件捕获时刻,相邻时间戳的差值即为帧间隔。

标称帧率 (fps) 理论帧间隔 (ms) 常见应用场景
15 66.67 低功耗预览、监控
30 33.33 标准视频通话、录像
60 16.67 高帧率游戏、慢动作
120 8.33 超慢动作、专业摄影
常见问题: 帧间隔不均匀是帧率抖动的直接原因。例如,某帧间隔为 35 ms,下一帧为 31 ms,虽然平均帧率接近 30 fps,但视觉上会出现卡顿感。

4.3 帧率抖动

帧率抖动(Frame Rate Jitter) 是指实际帧间隔相对于理想帧间隔的波动。抖动通常由以下因素引起:

  • 驱动调度延迟: V4L2 中断处理或 DMA 传输延迟。
  • ISP 管线负载: 图像处理算法耗时波动。
  • 系统资源竞争: CPU/GPU 频率调整、内存带宽争抢。
  • 硬件时钟漂移: 传感器 VSYNC 信号不稳定。

帧率抖动的直观表现是 卡顿(Stutter) 或 跳帧(Frame Skip)。在 HAL 层,可以通过 VIDIOC_DQEVENT 获取帧完成事件的时间戳,并计算抖动幅度。

帧率抖动对比:稳定 vs 抖动 稳定帧间隔 间隔均匀 抖动帧间隔 间隔波动 抖动 抖动 帧率抖动的影响 • 视觉卡顿:帧间隔突然增大导致画面停顿 • 编码质量下降:码率波动影响视频压缩效率 • 同步失败:多摄像头帧率不同步导致拼接错位

4.4 帧率稳定性指标

为了量化帧率稳定性,工程上通常使用以下两个核心指标:标准差 和 最大抖动。

4.4.1 标准差(Standard Deviation)

标准差衡量帧间隔序列的离散程度,反映整体抖动幅度。计算公式如下:

设帧间隔序列为 T = [t1, t2, ..., tn]
平均帧间隔 μ = (1/n) * Σ ti
标准差 σ = sqrt( (1/n) * Σ (ti - μ)² )

在 HAL 调优中,通常采集 100~300 帧的连续时间戳,计算标准差。σ 越小,帧率越稳定。经验阈值:

场景 标准差阈值 (ms) 说明
普通预览 < 2.0 人眼基本无感知
视频录像 < 1.0 保证编码码率稳定
高帧率慢动作 < 0.5 避免慢动作回放抖动
多摄同步 < 0.3 保证拼接/融合对齐

4.4.2 最大抖动(Max Jitter)

最大抖动 定义为帧间隔与理论帧间隔的最大偏差绝对值:

Max Jitter = max( |ti - T_ideal| )

其中 T_ideal 为标称帧间隔。最大抖动反映了最坏情况下的帧率偏离,直接影响用户体验的“卡顿峰值”。

调优目标: 在 Camera HAL 中,通常要求最大抖动 < 1 个帧间隔的 10%。例如 30 fps 时,最大抖动应 < 3.33 ms。
帧率稳定性指标:标准差与最大抖动 帧间隔分布 (ms) 理想值 ±1σ 范围(约 68% 的帧落在此区间) 最大抖动 指标使用建议 • 标准差:反映整体稳定性,适合长期监控 • 最大抖动:反映最坏情况,适合卡顿问题定位 • 两者结合:标准差低 + 最大抖动小 = 高质量帧率

4.5 帧率稳定性测量方法

在 V4L2 + Camera HAL 环境中,推荐以下测量流程:

  1. 采集时间戳: 在 HAL 的 processCaptureRequest 或 bufferDone 回调中,记录每个 buffer 的 timestamp。
  2. 计算帧间隔: 相邻时间戳相减,得到帧间隔序列。
  3. 剔除异常值: 过滤掉因丢帧或重复帧导致的异常间隔(如 > 2 倍理论间隔)。
  4. 计算指标: 使用上述公式计算标准差和最大抖动。
  5. 可视化分析: 绘制帧间隔时序图,直观观察抖动模式。
工具推荐: 使用 v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=NV12 --stream-mmap --stream-count=300 采集原始帧,再通过 Python 脚本分析时间戳。