Openwrt接UVC摄像头,使用mjpg-streamer,此处默认已经移植成功。这里以Skylab的SKW99为例进行说明,SKW99为高通QCA9531的方案,CPU的频率为650MHz。最近在应用过程中,需求完成后,发现视频码流下降了,相同时间内,对应数据量减少了。由于摄像头的工作模式为MJPG,每一帧对应一张完整的图像,在接收端保存一帧数据,发现一帧数据的大小并没有明显的变化,因此此处判断,数据量减少为丢帧。下面是丢帧前后码流的对比图:
分析原因:与模组性能有关系,做的工作包括:
1.清理缓存,清理后码流会瞬时降低,并不是此处的解决方案
echo 3 > /proc/sys/vm/drop_caches
2.使用sched_setscheduler控制程序的优先级,如下所示:
struct sched_param sched;
sched_getparam(0, &sched);
sched.sched_priority = 80; //值越大优先级越高
sched_setscheduler(0, SCHED_RR, &sched);
这样控制后,使用网口有线连接,码流有显著提高,但是wifi连接时,仍存在丢帧问题。
3.修改wifi的工作信道
扫描周围wifi集中情况,设置一个干净的信道后,有所改善,但依然较低;
4.修改ddr的速率
当分析到3时,用户提出,启动时,DDR的速率有所下降。不同的uboot对应DDR的速率不同,高速率DDR时,对应的码流要高一些,如下图所示。对比发现,高速率DDR是5年前老版本的QSDK打包对应的uboot。
使用老版本SDK重新打包SDK,加入对应GPIO控制,客户测试后,反馈码流可以达到对应值。
总结,WIFI模组对应UVC摄像头时,自身性能对码流有较大影响,使用高性能模组更适合此应用场景。