Android UVC 同时打开多路摄像头

  • 前言
  • 硬件环境
  • 效果图
  • 注意问题
  • 代码分析(摄像头的打开步骤)
    • 1.找到摄像头设备
    • 打开摄像头
  • 项目地址

前言

做项目用到了多路摄像头,但是原生固件最多支持两路同时打开(cameraID 0和1),又不想对固件修改,所以打算采用uvc方式打开多路USB摄像头。找了几篇博客,以及github上的项目,down下来发现存在各种各样的问题(编译问题,打开多路问题)。从这个角度出发,打算把自己的过程以及代码分享出来。

硬件环境

硬件环境:
rk3399,rk3288,展讯9853
Logitech摄像头两个,WCH双目摄像头两个,一共六个镜头

效果图

六路,厉害了haha

注意问题

ndk版本一定要注意,否者会出现打不开的问题,笔者之前配置的android-ndk-r16b,怎么搞也不行,结果改成android-ndk-r14b就ok了,这点要注意一下

代码分析(摄像头的打开步骤)

1.找到摄像头设备

USBMonitor/usb设备控制类
主要的能力:usb设备节点(设备信息)的获取,对USB设备操作的广播监听(设备的连接与断开,usb权限请求的监听)
当我们点击demo中视频预览区域会弹出当前camera设备的列表,列表数据就是由它得来,需要注意得地方是dialog这里做了一个Camera设备的筛选

public void updateDevices() {
//      mUSBMonitor.dumpDevices();final List<DeviceFilter> filter = DeviceFilter.getDeviceFilters(getActivity(), R.xml.device_filter);mDeviceListAdapter = new DeviceListAdapter(getActivity(), mUSBMonitor.getDeviceList(filter.get(0)));mSpinner.setAdapter(mDeviceListAdapter);}

mUSBMonitor对象就是在MainActivity中初始化的那个,根据device_filter(class = 239)生成一个筛选器,至于为什么根据这个筛选我也不是很清楚,不过debug看来,确实camera数据的class = 239

这样就筛选出了想要的Camera数据

打开摄像头

关键类 AbstractUVCCameraHandler,UVCCamera
UVCCamera负责jni驱动的调用,可以看作是android APi 的“Camera”类,具有打开,释放,调焦等功能
AbstractUVCCameraHandler负责控制UVCCamera,一些状态回调,数据回调,录制视频文件的编码等
它有一个内部线程类“CameraThread”很重要,主要方法都在这里面,但是蛋疼的是并没有看懂异步处理的核心用意,还是菜啊,望指正
打开逻辑很简单的,具体流程如下:
1.点击想要打开的设备节点,进行权限检查

if (item instanceof UsbDevice) {mUSBMonitor.requestPermission((UsbDevice)item);//获取设备信息,并检查打开此设备的权限((CameraDialogParent)getActivity()).onDialogResult(false);}

2.这个设备是否有打开权限,有的话直接打开,没有的话去请求,请求成功了直接打开

if (mUsbManager.hasPermission(device)) {// 如果应用已经拥有权限,请调用onConnectprocessConnect(device);} else {try {//未经许可请求mUsbManager.requestPermission(device, mPermissionIntent);} catch (final Exception e) {// 它似乎在Android 5.1.x的GALAXY系统中生成一个名为android.permission.sec.MDM_APP_MGMT的未知异常Log.w(TAG, e);processCancel(device);result = true;}}

3.假设已经有权限了,直接进到打开摄像头方法里面

private final void processConnect(final UsbDevice device) {if (destroyed) return;updatePermission(device, true);mAsyncHandler.post(new Runnable() {@Overridepublic void run() {if (DEBUG) Log.v(TAG, "processConnect:device=" + device);UsbControlBlock ctrlBlock;final boolean createNew;ctrlBlock = mCtrlBlocks.get(device);if (ctrlBlock == null) {ctrlBlock = new UsbControlBlock(USBMonitor.this, device);//封装了一个模块数据mCtrlBlocks.put(device, ctrlBlock);createNew = true;} else {createNew = false;}if (mOnDeviceConnectListener != null) {mOnDeviceConnectListener.onConnect(device, ctrlBlock, createNew);}}});}

主要就是封装了一个UsbControlBlock(设备数据),还有一些是第一次打开还是反复打开的逻辑,缓存逻辑

4.回调给了MainActivity,记得前面说的“AbstractUVCCameraHandler负责控制UVCCamera”,没错,就是要用mHandlerFirst来控制打开camera

 mHandlerFirst.open(ctrlBlock);//打开摄像机final SurfaceTexture st = mUVCCameraViewFirst.getSurfaceTexture();mHandlerFirst.startPreview(new Surface(st));runOnUiThread(new Runnable() {@Overridepublic void run() {mCaptureButtonFirst.setVisibility(View.VISIBLE);}});

最终调用到了UVCCamera内的nativeConnect 方法,调用jni连接摄像头

到这里相机就打开了,要注意的是数据回调这部分我对源码修改了一下。

嗯,就是这些,还是挺简单的,代码会后续优化

项目地址

原项目地址(是真的牛,不过我下载编译后有些问题):
https://github.com/saki4510t/UVCCamera
我做了一些修改的项目地址:
https://github.com/yyfd2013zy/UvcCameraDemo

Android UCV 同时打开多路摄像头相关推荐

  1. AUSBC3.0, 震撼来袭!(UVC Camera,支持开启多路摄像头)

     Android灵活实用的Android平台UVC摄像头引擎,无需任何系统权限即可轻松打开您的uvc摄像头(支持多路摄像头). 您唯一应该做的就是确认您的 Android 设备必须支持 OTG 功能. ...

  2. android平台多路摄像头实现方式的简析

    采用Camera API2 HAL3架构,android P和Q的初始化预览流程无异. 流程大概为CameraManager.openCamera打开摄像头设备回调onOpened方法得到Camera ...

  3. unity android屏幕自适应,Android应用开发之unity打开移动摄像头,并自适应屏幕显示摄像头数据。兼容android和ios...

    本文将带你了解Android应用开发之unity打开移动摄像头,并自适应屏幕显示摄像头数据.兼容android和ios,希望本文对大家学Android有所帮助. 跨平台并自适应显示摄像头数据新建工程并 ...

  4. android 打开外置摄像头驱动程序,嵌入式er日常系列!终于搞定android驱动USB摄像头了!...

    原标题:嵌入式er日常系列!终于搞定android驱动USB摄像头了! 感谢网上的大神分享经验,终于解决了让我头疼好久的USB摄像头问题,讨论的前提是你的USB摄像头是UVC兼容的(如今大部分摄像头兼 ...

  5. android html 打开摄像头,在android上,用WEB页面打开手机摄像头

    今天看到一个人提问,怎么在android上用web页面打开手机摄像头.刚好我们之前也做过类似的工程,刚好把想法写一下: 1.基本原理: 页面上做一个按钮,如打开摄像头,它做的事情就是将页面链接到一个特 ...

  6. android打开前置摄像头和后置摄像头

    android打开前置摄像头和后置摄像头 前言: 我的android设备是原道N70双擎pad.这个平板电脑没有后置摄像头,只有前置摄像头,当我安装一些程序的时候,会出现"xxxx.apk已 ...

  7. android打开前置摄像头和后置摄像头 .

    android打开前置摄像头和后置摄像头 前言: 我的android设备是原道N70双擎pad.这个平板电脑没有后置摄像头,只有前置摄像头,当我安装一些程序的时候,会出现"xxxx.apk已 ...

  8. 震撼来袭!(USB Camera,支持同时开启多路摄像头,支持旋转、镜像)

    [醍醐灌顶]我研究的ANDROID UVC CAMERA 技术,太实战了,经多款不同类型设备测试,运行稳定,具备通用性. Android灵活实用的Android平台UVC摄像头实例,无需任何系统权限即 ...

  9. 31全志r58平台Android4.4.2下打开USB摄像头

    31全志r58平台Android4.4.2下打开USB摄像头 2018/10/26 16:00 版本:V1.0 开发板:SC5806 1.系统编译:(略) 2.需要修改的文件: W:\r58_andr ...

最新文章

  1. 转 理论联系实践较好的JVM的理解
  2. 「NLP」ALBERT:更轻更快的NLP预训练模型
  3. 【计算机网络】网络层 : IPv4 地址 ( IP 地址分类 | 特殊 IP 地址 | 私有 IP 地址 | A 类、B 类、C 类 IP 地址网络号主机号数量 )★
  4. java.lang.String 的 + 号操作,这个谜终于要解开了!
  5. 阅读“CodeIgniter中国》文档首页》常规主题》安全”之抄录
  6. Scala与Java差异(一)之基础语法
  7. easyswoole数据库连接池_如何在 Swoole 中优雅的实现 MySQL 连接池
  8. Go-项目结构和代码组织
  9. 职校学计算机对口高考可以考幼师吗,幼师专业对口高考考那些
  10. python内置的集成开发工具是什么_python内置的集成开发工具是什么_后端开发
  11. echarts柱形图x轴y轴互换_数控机床在加工零件时,突然出现X、Y、Z轴失控?如何处理...
  12. 全民直播,半年“用云量”暴涨五倍
  13. spring中需要掌握的25个常用注解
  14. 基于Jupyter Notebook---卷积神经网络的图像分类(keras对猫狗图像数据集进行分类)
  15. Delphi 小知识汇总
  16. 这5款功能强大、堪称最良心的浏览器,简直好用极了!
  17. 计算机单词 硬件类、软件类、网络类、其他
  18. YUI 3:Node
  19. python解决八数码问题_python八数码
  20. 超声延时聚焦原理及算法仿真

热门文章

  1. JavaScript - Echarts经典教程-李游Leo-专题视频课程
  2. 菊厂程序员每天轻松跟练刘畊宏健身操,到底怎么做到的?
  3. 好的台灯和差的台灯的区别?推荐几款质量好、颜值抗打的台灯
  4. SQLYog常用快捷键
  5. 华为交换机配置SNMP
  6. Java几种生成synthetic方法的情况
  7. VMware后台运行的虚拟机打不开
  8. ndp邻居发现协议使用
  9. 个人网络上翻译计算机教程,计算机翻译教程
  10. web请求获取的Unicode编码\u转化为中文汉字