Android UCV 同时打开多路摄像头
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 同时打开多路摄像头相关推荐
- AUSBC3.0, 震撼来袭!(UVC Camera,支持开启多路摄像头)
Android灵活实用的Android平台UVC摄像头引擎,无需任何系统权限即可轻松打开您的uvc摄像头(支持多路摄像头). 您唯一应该做的就是确认您的 Android 设备必须支持 OTG 功能. ...
- android平台多路摄像头实现方式的简析
采用Camera API2 HAL3架构,android P和Q的初始化预览流程无异. 流程大概为CameraManager.openCamera打开摄像头设备回调onOpened方法得到Camera ...
- unity android屏幕自适应,Android应用开发之unity打开移动摄像头,并自适应屏幕显示摄像头数据。兼容android和ios...
本文将带你了解Android应用开发之unity打开移动摄像头,并自适应屏幕显示摄像头数据.兼容android和ios,希望本文对大家学Android有所帮助. 跨平台并自适应显示摄像头数据新建工程并 ...
- android 打开外置摄像头驱动程序,嵌入式er日常系列!终于搞定android驱动USB摄像头了!...
原标题:嵌入式er日常系列!终于搞定android驱动USB摄像头了! 感谢网上的大神分享经验,终于解决了让我头疼好久的USB摄像头问题,讨论的前提是你的USB摄像头是UVC兼容的(如今大部分摄像头兼 ...
- android html 打开摄像头,在android上,用WEB页面打开手机摄像头
今天看到一个人提问,怎么在android上用web页面打开手机摄像头.刚好我们之前也做过类似的工程,刚好把想法写一下: 1.基本原理: 页面上做一个按钮,如打开摄像头,它做的事情就是将页面链接到一个特 ...
- android打开前置摄像头和后置摄像头
android打开前置摄像头和后置摄像头 前言: 我的android设备是原道N70双擎pad.这个平板电脑没有后置摄像头,只有前置摄像头,当我安装一些程序的时候,会出现"xxxx.apk已 ...
- android打开前置摄像头和后置摄像头 .
android打开前置摄像头和后置摄像头 前言: 我的android设备是原道N70双擎pad.这个平板电脑没有后置摄像头,只有前置摄像头,当我安装一些程序的时候,会出现"xxxx.apk已 ...
- 震撼来袭!(USB Camera,支持同时开启多路摄像头,支持旋转、镜像)
[醍醐灌顶]我研究的ANDROID UVC CAMERA 技术,太实战了,经多款不同类型设备测试,运行稳定,具备通用性. Android灵活实用的Android平台UVC摄像头实例,无需任何系统权限即 ...
- 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 ...
最新文章
- 转 理论联系实践较好的JVM的理解
- 「NLP」ALBERT:更轻更快的NLP预训练模型
- 【计算机网络】网络层 : IPv4 地址 ( IP 地址分类 | 特殊 IP 地址 | 私有 IP 地址 | A 类、B 类、C 类 IP 地址网络号主机号数量 )★
- java.lang.String 的 + 号操作,这个谜终于要解开了!
- 阅读“CodeIgniter中国》文档首页》常规主题》安全”之抄录
- Scala与Java差异(一)之基础语法
- easyswoole数据库连接池_如何在 Swoole 中优雅的实现 MySQL 连接池
- Go-项目结构和代码组织
- 职校学计算机对口高考可以考幼师吗,幼师专业对口高考考那些
- python内置的集成开发工具是什么_python内置的集成开发工具是什么_后端开发
- echarts柱形图x轴y轴互换_数控机床在加工零件时,突然出现X、Y、Z轴失控?如何处理...
- 全民直播,半年“用云量”暴涨五倍
- spring中需要掌握的25个常用注解
- 基于Jupyter Notebook---卷积神经网络的图像分类(keras对猫狗图像数据集进行分类)
- Delphi 小知识汇总
- 这5款功能强大、堪称最良心的浏览器,简直好用极了!
- 计算机单词 硬件类、软件类、网络类、其他
- YUI 3:Node
- python解决八数码问题_python八数码
- 超声延时聚焦原理及算法仿真