4. 帧率概念:帧率定义、帧间隔、帧率抖动、帧率稳定性指标
在 Camera HAL 与 V4L2 驱动调优中,帧率(Frame Rate) 是最直观的用户体验指标,也是衡量系统实时性的核心参数。本章从基础定义出发,逐步深入到帧间隔、帧率抖动以及量化稳定性的数学指标,为后续的调优策略打下理论基础。
4.1 帧率定义
帧率 表示相机每秒采集或输出的图像帧数,单位是 fps(Frames Per Second)。在 V4L2 驱动中,帧率通常由 VIDIOC_S_PARM 或 VIDIOC_S_FMT 控制,并在 struct v4l2_streamparm 中设定。
例如,30 fps 意味着每帧间隔约为 33.33 ms。在 HAL 层,帧率直接影响预览流畅度、录像比特率以及后处理管线的负载。
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 | 超慢动作、专业摄影 |
4.3 帧率抖动
帧率抖动(Frame Rate Jitter) 是指实际帧间隔相对于理想帧间隔的波动。抖动通常由以下因素引起:
- 驱动调度延迟: V4L2 中断处理或 DMA 传输延迟。
- ISP 管线负载: 图像处理算法耗时波动。
- 系统资源竞争: CPU/GPU 频率调整、内存带宽争抢。
- 硬件时钟漂移: 传感器 VSYNC 信号不稳定。
帧率抖动的直观表现是 卡顿(Stutter) 或 跳帧(Frame Skip)。在 HAL 层,可以通过 VIDIOC_DQEVENT 获取帧完成事件的时间戳,并计算抖动幅度。
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 为标称帧间隔。最大抖动反映了最坏情况下的帧率偏离,直接影响用户体验的“卡顿峰值”。
4.5 帧率稳定性测量方法
在 V4L2 + Camera HAL 环境中,推荐以下测量流程:
- 采集时间戳: 在 HAL 的
processCaptureRequest或bufferDone回调中,记录每个 buffer 的timestamp。 - 计算帧间隔: 相邻时间戳相减,得到帧间隔序列。
- 剔除异常值: 过滤掉因丢帧或重复帧导致的异常间隔(如 > 2 倍理论间隔)。
- 计算指标: 使用上述公式计算标准差和最大抖动。
- 可视化分析: 绘制帧间隔时序图,直观观察抖动模式。
v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=NV12 --stream-mmap --stream-count=300 采集原始帧,再通过 Python 脚本分析时间戳。