1、问题背景:
按项目需求调试 sc5239 这款 sensor,申请的 sensor setting 是30fps,但最后输出帧率却只有 15fps。实际项目调试过程中遇到帧率输出不满帧的情况很多,本文主要总结下 Sensor 驱动部分导致的帧率输出异常的排查过程。
2、问题分析:
a、首先我们要看到问题,也就是怎么知道输出帧率不对,最直观的就直接看视频流,一般帧率在 25fps 以上人眼就分辨不出了。但这次是15fps,明显能看到对着运动物体,看实时预览不怎么流畅。也可以录一段视频流,用VLC去看视频流的帧率是多少(时间不能太短,否则会统计不准确)。
调试中一般最常用的方法就是在出流的地方加打印,以此来统计输出的帧率是否正确。也可以捂住镜头,使曝光行走满,通过调试工具看到或计算最大曝光时间是多少,30fps 对应的最大曝光时间就是33ms。关于曝光时间的计算可查看这篇文章:CMOS sensor 基本原理
看画面流畅不流畅,及录制的视频流帧率是否是对的,这里看的是最后应用层的输出,没办法排除是底层驱动的问题,还是后处理的问题(比如Camera hal、编码、app),可以通过在不同模块的输出后面来加打印来区分是哪里的问题。
看最大曝光时间是否正确,也能判断出是否是 sensor 驱动的问题。
b、目前看到的情况是,画面不流畅、录制的视频流看是15fps、sensor 输出的打印看是15fps、但最大曝光时间却是33ms。
由于sensor 输出的打印是15fps,那就肯定是 sensor 输出的问题,但最大曝光时间却是33ms,这是有点奇怪的地方。但可以肯定要么就是本身 sensor setting 的问题,要么就是驱动部分配置的有问题。
在 sensor 驱动中注释掉所有关于 sensor 寄存器的修改,直接用默认的 setting 出图,判断是否是 sensor 厂给的 setting 就是15fps的,这么试了,sensor 输出的打印是30fps, 录制的视频流也是30fps了,画面也流畅了,那就不是 sensor setting 问题。
接着就是排查 sensor 驱动了,影响帧率的一般就是帧长,一般驱动中都有设置帧长的函数(也就是修改如下 0x320e,0x320f 寄存器),用于改变帧率。
后面查了确实是这里的问题,如下sensor datasheet中,帧长是寄存器内的值乘以2。
但后面配置 0x320e,0x320f 时(也就是设置帧长的函数里面),我是直接用前面得到的帧长来计算的,没有除以2,所有实际写入寄存器的值就增大了1倍,导致帧率就从30fps 降到了15fps。
怎么通过设置帧长,修改帧率,可查看这篇文章:如何修改 sensor 输出帧率
我之前以为都是要应用去设置帧率以后,才会调用这里的设置帧长的函数,但后面加打印看了,设备开机启动做初始化的时候,就会被调用一次,所有默认出图就变成 15fps 了。
c、关于最大曝光时间是正常的 33ms,而不是变成 66ms,因为目前在驱动中一开始就定义好了帧长的值,他不是通过去读 sensor 寄存器得到的,所以按这个固定的帧长配置好最大曝光时间后,他就不会变了。所以最大曝光时间对的,并不能作为帧率正常的证明。
3、问题小结:
a、通过观看视频是否流畅、录制视频流查看帧率,判断最后输出的图像是否有不满帧的问题。
b、加 sensor 输出的打印、看最大曝光时间,来判断是否是底层输出导致的帧率异常。
c、注释掉 sensor 驱动中的所有寄存器的修改,只用 sensor 厂给的 sensor setting 出图,看帧率是否满足要求。
d、检查 sensor 驱动中关于帧长的设置,看是否满足 datasheet 要求。
e、最大曝光时间是对的,并不能作为帧率正常的证明。
网友评论