写在前面:
两年前(2019)任职的公司在rk3288板子5.1系统上搞过UVC多路摄像头,那时自己还年轻。。。可以看下这篇博客:Android-多路摄像头实现总结(Camera - UVC)_迷彩狼的博客-CSDN博客_android 多路摄像头
目的是获取多路摄像头数据流做AI的,但是那篇博客还是比较简单的,因为他是在工业板上搞的,而且还是5.1。。。大家都是Android开发,不说废话了。
本篇文章是在安全性更高的移动端手机、平板上搞的,先放图。(图我就不放了,做生物识别的,不太方便公开)
环境:小米平板4 晓龙660 2.2GHz
系统:MIUI10 android8.1
难度和板子不是一个量级,硬件性能提升好几倍(这句有点废话了,价格都差了很多。。。),并且是兼容板子的。
本来我们是打算用C++写V4L2开的,工业板都撸完了想进一步适配下移动端,可惜移动端太难了。(坑太多了,就不一一讲述了)
正文:
本篇文章是进阶的,不适合新程序员。
首先双手奉上参考资料,给大神前辈们跪了:
UVC C++底层库(手撸必备):https://github.com/libuvc/libuvc
经典的UVC-Camera库:https://github.com/saki4510t/UVCCamera
如果你实在看不懂的话,可以看下这位大神的代码:https://github.com/jiangdongguo/AndroidUSBCamera 这是他封装的SDK
Android直播开发之旅(10):AndroidUSBCamera,UVCCamera开发通用库_蒋东国的博客-CSDN博客_jiangdongguo 这是他的博客
网上有一款App叫UsbWebCamera是免费的,上面这个代码实现的效果跟这个一样。
我的项目也是因为他的代码受到的启发,最起码知道能做,进而在这个技术方向上做出来的。在这里感谢下。
上面三个git涵盖了NDK、SDK以及应用层的封装,都是针对UVC的,可以参考。网上的资源鱼龙混杂。。。
我开发用的serenegiant.usb源码,在此基础上改造的。
参考:Android中多USB摄像头解决方案——UVCCamera源码分析(一) - 简书
基本上代码排错之后,插普通的USB摄像头就可以用了。
如果报错-51,一般是因为设置的格式不对。原生Camera回调的图像是YUV420SP(其他的没试,但是YUV420肯定没问题),有的摄像头C++抓是灰度的,但是原生Camera还是YUV。。。
在UVCCamera.java里面有一个设置底层的参数:
格式选择:UVCCamera.PIXEL_FORMAT_YUV420SP
除此之外,在AbstractUVCCameraHandler.java里,要设置同样的视频格式:
有可能还会报视频格式错误,有的高清摄像头不支持640*420的,可以看下代码size的log,size不合适也是黑屏,但是报错能看明白。另外1080的明显比640带延迟,这块可以走内存优化去处理。
我就不放代码了,git上踩踩坑就能用,以此记录一下。放个图表示华为的干儿子也跑通了。。。