UVCCamera是基于安卓的一个USB外接摄像头调用项目,该项目允许安卓设备在不需要root的情况下打开外接USB摄像头进行预览,获取视频帧.
最近在基于UVCCamera适配一款设备的时候出现了问题:该设备始终无法打开一款摄像头(项目必须要适配这款摄像头),作为对比,我的安卓手机就没有任何问题.作为一个负责任的开发人员,我只好硬着头皮肝下去.并最终解决了这个问题.
经过研究,发现UVCCamera项目确实有这些缺点:
- 兼容性不是太好,经常出现不同的手机,或者不同摄像头上面表现不一致的问题;
- 停止预览(stopPreview)时,偶尔会阻死,接口无法返回;
- native层线程较多,比较杂乱.感觉并不需要这么多线程呀,这也是上一条阻死的原因;
- 视频采集和显示具有强耦合,发现如果不设置surface,则不会启动预览线程,从而无法采集;
- 视频格式转换时效率较低;
我在UVCCamera基础上,修改了上面的问题.修改方法如下:
- 优化了libusb调用方法,提高了兼容性,在那个原先有故障的设备上测试通过,故障排除;
- 解决了stopPreview阻死的问题;
- native层使用轮询模式(之前是回调模式),一方面减少了线程数,一方面可以根据业务逻辑动态调节帧率;
- 去掉采集对surface的依赖;
- 使用libyuv进行格式转换,提高了效率.
目前项目处于内测阶段,先把apk附上.如果你也遇到usb摄像头无法正常工作,可以先装一下apk进行测试.apk可从github上下载最新的release版,下载地址:
https://github.com/tsinglink/uvccamera/releases
2022年1月10号更新
项目已经开源,地址:
https://github.com/tsinglink/uvccamera