我基于uvccamera项目做了些改动,由于原作者不维护了,原项目暴露了很多问题,所以我基于作者的项目,做了修改并重建项目开源发布. 地址为:https://github.com/tsinglink/uvccamera
在维护过程中,我们小心翼翼地进行测试,但是也还是会遇到用户反馈的问题, 摄像头打不开,花屏,绿屏,摄像头不识别,没有视频帧… 这也从侧面说明这个东西的兼容性是比较难以搞定的.需要进行大量测试和适配.
问题1
摄像头A非常稳定,在小米,基于MTK的执法仪,三星三款设备上测试都没有啥问题(测试了一款华为手机不识别,估计是这个手机配置较低端,根本就不支持OTG);但是另一款摄像头B,在这些设备上都无法识别… 而用shenyao的程序却可以完美运行.
虽然很失落,但起码证明了跟摄像头没有关系,B摄像头理论上也是可以的. 于是跟进再跟进,发现B摄像头的格式为YUY2格式,之前我们为了适配A摄像头,删减了一部分看不懂的代码,把YUY2格式的逻辑给去掉了! 加回来果然可以识别了,出画面了.
问题2
问题1解决后,兴高采烈地试了试,发现MJPEG没有任何问题,但是YUY2的视频画面居然是不是搞个半边绿屏,如图所示: 再继续查,a thousand years later ,发现有个通路参数改小了,不一定严谨:可能是由于uvc多个通道进行传输,这个通道数过低后,就会导致数据丢失.现象就是半边绿屏, OK改大试试?
果然,改大后,在高通上面OK了.
问题3
远没有想象中那么简单, 问题2解决后,mtk平台一试,发现不仅YUY2的没有画面,而且MJPEG也不行了,也没有画面了.所以,这个值也不可以改的太大? 估计有些低端的设备,尤其是MTK的设备,把这个值设大后直接不工作了,收不到任何媒体数据?
再调小一些,测试,MTK也OK了.
所以很奇葩. 目前没有一个合适的值可设置,经验值是设置在8~16之间.后面看来需要把它作为参数导出了.
这个值就是:LIBUVC_NUM_TRANSFER_BUFS ,在libuvc_internal.h 文件定义.
最终成功: 项目地址: https://github.com/tsinglink/uvccamera 开发不易,如果对你有用,欢迎start!
|