UVC for USBCamera in Android

基于UVC 协议,完成USBCamera 开发

文章目录

  • 一、目的:
  • 二、USBCamera 技术实现方案
    • 难点
  • 三、误区:
  • 四、基础补充、资源参考
    • 架构图了解
    • Camera相关专栏
    • 零散知识了解
    • 部分相机源码参考,学习API使用,梳理流程,偏应用层
    • Camera2 系统相关
  • 五)具体项目参考
  • 六) 核心源码逻辑说明
    • 权限、过滤器
    • 通过USBManager 获取服务 得到USB外设
      • 获取UsbManager 对象
      • 得到 detected devices
      • 得到过滤条件,加载xml 过滤器
      • 过滤得到所有的 有效的外设 USBDevice
      • 判断USBDevice 是否有权限
      • UVC 进行打开和预览操作


一、目的:

1)依托于以前公司项目中自己折腾出来的USBCamera 基于 UVC协议,特别有必要总结一次,总结核心内容和知识点。
2)对于需要USBCamera 项目需求的新手一些指导性 建议、思路,特别适用,并不是所有的人都能上手直接折腾出来的

二、USBCamera 技术实现方案

  • 基于UVC协议 来实现
  • 基于Android 体系下的SDK API来实现,底层就是Camera 或者 Camera2 框架下来实现

难点

UVC 协议相机开发,资料很少很少 还比较老旧,基于UVC协议开发USBCamera 解决了UVC协议 库文件 等基本库方法问题,还需要知晓USB通讯相关知识。

三、误区:

基本常识是 USBCamera 是无驱的,那么跟底层系统不相关,USB相机插着就能用,系统本身支持的想法其实是错误的。
大家可以自行查阅相关资料,这里重点说明的是:
1)使用UVC协议来实现USBCamera ,作为一个系统应用 具备系统签名,不用考虑各种权限,是没有问题的。
2)使用Android SDK 框架下的API来实现USBCamera 是不可取的,官方文档明确说明Camera2 是不支持的。但是我们在不同半导体平台下不一样,比如RK上面是支持Camera2 开发USBCamera,
但是在MTK上面 Camera2 是不支持USBCamera,就是打不开相机的。 所以,要想实现Camera2 API来写一个USBCamera 务必驱动层、framework层在芯片平台支持的情况下适配好才行。

四、基础补充、资源参考

对于相机开发,还是建议无论是UVC协议开发USBCamera,还是 Android SDK API框架下Camera api 来开发相机,都需要了解最基本的相关资料。UVC和Camera 架构体系是两套完全不同的体系,可分别参考。

相机整个模块确实太专业、复杂了。 无论从硬件外设、驱动【USBCamera免驱】、相机 都比较专业、覆盖面及广,针对思考中的问题 给出自己认为比较好相关博客,方便了解,助于梳理流程、提升认知。

对于上层应用或者Framework 系统应用开发者,只需要了解基本的架构、API、使用方法,当然这些也不简单的
下面提供部分资源,方便快速了解,充电

架构图了解

MTKCamera2相机架构
Camera2架构
Android Camera架构简析

Camera相关专栏

Camera Framework 专栏
小驰私房菜系列
小驰私房菜MTK系列
小驰Camera 开发系列
Camera 相机开发
展讯平台 Camera
官方文档:谷歌官方 API 描述

零散知识了解

MTK 相机UI介绍
Camera2 相机认知
Camera2学习笔记
camera2关于拍照预览方向旋转90度和拍照图片镜像功能实现
Camera2 预览集成、简单拍照:熟悉预览步骤流程比较有用
Camera镜像上下左右颠倒问题的解决办法
MTK相机成像质量差
Camera应用分析

部分相机源码参考,学习API使用,梳理流程,偏应用层

极客相机 Camera2 API
Camera2 API详解
极客相机源码
Camera2 相机Demo
Camera2 专业相机Demo
拍照、预览、录像Demo
使用Camera2 拍照

Camera2 系统相关

Camera2 Service 启动

五)具体项目参考

参考gitHub项目:
UVCCamera 原始项目 需要自己配置NDK,编译
USBCamera 自己就是通过这个开源代码进行修改,定制,实现自身USBCamera 业务
AndroidUSBCamera 比较好的,支持多个USBCamera 并行展示,功能齐全,但是分辨率无法全部加载、存在.so 崩溃导致无解。

项目参考优劣:

  • UVCCamera:基本功能,需要自己封装方法,编译,搭建环境。 项目太老,很难跑通,需要自己封装。
  • USBCamera:封装比较好,单个摄像头显示 基本功能都有的 预览、拍照、录像OK,USB检测,查找、注册流程 都有,方便熟悉 USBCamera 使用流程,USBCamera的思想。上层相关USBManager 相关api 参考,到底层 native层不用管他们。
  • AndroidUSBCamera:封装最好,功能特别齐全,也可以实现多个摄像头同时显示。 但是预览尺寸会显示不全、部分预览尺寸点击会崩溃。
    这个目前无解,需要源码重新编译.so,无解,仅供学习使用。

建议直接从 USBCamera、AndroidUSBCamera 两个开源项目选择其中一个,根据自己实际需求来选择适合自己的项目。 如果指定了分辨率,对分辨率无选择要求,可以选择AndroidUSBCamera 。
如果通用版本,强烈建议选择USBCamera项目,稳定性更强。

当然:两个项目都有崩溃,特别在定制自己应用,在各种复杂场景下,各种崩溃需要自己去解决 适配。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

六) 核心源码逻辑说明

权限、过滤器

 AndroidMenifest.xml 中<uses-permission android:name="android.permission.RECORD_AUDIO"/><uses-permission android:name="android.permission.CAMERA"tools:ignore="PermissionImpliesUnsupportedChromeOsHardware" /><uses-feature android:name="android.hardware.usb.host"/>res/xml/device_filter.xml 过滤usb 设备<usb><usb-device class="239" subclass="2" />	<!-- all device of UVC --><!-- a few android 9.0 --><usb-device class="14" subclass="9" /><usb-device class="2" subclass="0" /><usb-device class="6" subclass="-1" /><usb-device class="39" subclass="0" /><usb-device class="0" subclass="0" /><usb-device class="239" subclass="2" /><usb-device class="239" subclass="2" /><usb-device product-id="4836" vendor-id="9573" /><usb-device product-id="2229" vendor-id="1133" /><usb-device product-id="640" vendor-id="1409" /><usb-device product-id="258" vendor-id="9228" /><usb-device product-id="61" vendor-id="65366" /><usb-device product-id="4867" vendor-id="10071" /><usb-device product-id="7995" vendor-id="4130" /><!--classData:0   subClassData:0  productId:61   vendorId1Id:65366classData:239   subClassData:2  productId:4867   vendorId1Id:10071
classData:0   subClassData:0  productId:61   vendorId1Id:65366classData:0   subClassData:0  productId:61   vendorId1Id:65366-->
</usb>

通过USBManager 获取服务 得到USB外设

获取UsbManager 对象

mUsbManager = (UsbManager)context.getSystemService(Context.USB_SERVICE)

得到 detected devices

final HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList()

得到过滤条件,加载xml 过滤器

    List<DeviceFilter> deviceFilters = DeviceFilter.getDeviceFilters(mActivity.getApplicationContext(), R.xml.device_filter);

过滤得到所有的 有效的外设 USBDevice

final List<UsbDevice> result = new ArrayList<UsbDevice>();if (deviceList != null) {if ((filters == null) || filters.isEmpty()) {result.addAll(deviceList.values());} else {for (final UsbDevice device: deviceList.values() ) {// match devicesfor (final DeviceFilter filter: filters) {if ((filter != null) && filter.matches(device) || (filter != null && filter.mSubclass == device.getDeviceSubclass())) {// when filter matchesif (!filter.isExclude) {result.add(device);}break;} else {.....}}}}}

判断USBDevice 是否有权限

mUsbManager.hasPermission(device)

UVC 进行打开和预览操作

打开设备: 在有了权限之后开始打开设备,进行设备连接. 后面就是通过UVC协议进行Camera 的打开和预览操作了


onConnect -> openCamera、startPreviewopenCamera(ctrlBlock);new Thread(new Runnable() {@Overridepublic void run() {// wait for camera createdtry {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// start previewingLog.d(TAG,"onConnect   mCamView:"+mCamView);startPreview(mCamView);}}).start();

实际对camera 的处理,预览、拍照、录像 都是通过UVC协议编译的.so 文件来处理的,上面只是简单介绍了上层的USBManager 查找、检测、过滤 找到USB Camera 设备,之后的Camera 都通过封装好的 方法,最终通过native 方法实现。

实际项目效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/29759.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧社区解决方案介绍

1. 应用背景 智慧社区作为新经济时代的产物&#xff0c;利用互联网和物联网技术&#xff0c;改变了人们的生活方式&#xff0c;成为信息化、虚拟化新城市的重要组成部分。智慧社区的商业价值在于利用大数据技术对消费者进行细分&#xff0c;提供高附加值服务&#xff0c;预计零…

鸿蒙生态日日新,鸿蒙原生版支付宝下载量突破230万

鸿蒙生态日日新PLOG&#xff1a;鸿蒙原生版支付宝下载量突破230万&#xff0c;持续迭代性能提升15%&#xff0c;越来越好用&#xff1b;掌上生活、美柚等多款应用功能更新。

深度学习PyTorch之13种模型精度评估公式及调用方法

深度学习pytorch之22种损失函数数学公式和代码定义 深度学习pytorch之19种优化算法&#xff08;optimizer&#xff09;解析 深度学习pytorch之4种归一化方法&#xff08;Normalization&#xff09;原理公式解析和参数使用 深度学习pytorch之简单方法自定义9类卷积即插即用 实时…

显示器长时间黑屏

现象 电脑启动后,进入登录界面前会随机黑屏,有时候十几秒,有时候几分钟 进入桌面后,长时间不操作电脑黑屏,移动鼠标,点击键盘后尝试点亮屏幕,也会消耗较长时间 尝试 重装系统,或者重新安装显卡,都能够恢复,但过段时间以后又出现黑屏情况 集成显卡,独立显卡都出现过 操作系统…

网络编程之应用层协议(http)

HTTP: 1.url(统一资源定位符) 2.http:浏览器与服务器之间的通信标准 端口号&#xff1a;80&#xff1b; 传输层协议&#xff1a;TCP; 3.http工作流程&#xff1a; 4.http的报文格式&#xff1a; 5.HTTP请求报文的方法 6.回应报文&#xff1a;状态码 注意&#xff1a;

数据结构——顺序表与链表

1. 基础介绍 1、线性结构&#xff1a; 如果一个数据元素序列满足&#xff1a; &#xff08;1&#xff09;除第一个和最后一个数据元素外&#xff0c;每个数据元素只有一个前驱数据元素和一个后继数据元素&#xff1b; &#xff08;2&#xff09;第一个数据元素没有前驱数据…

苦瓜书盘官网,免费pdf/mobi电子书下载网站

苦瓜书盘&#xff08;kgbook&#xff09;是一个专注于提供6英寸PDF和MOBI格式电子书的免费下载平台&#xff0c;专为电子阅读器用户设计。该平台为用户提供了丰富的电子书资源&#xff0c;涵盖文学、历史、科学、技术等多个领域&#xff0c;旨在打造一个全面的电子书资源库。用…

PPT 小黑第20套

对应大猫21 Word转PPT 图片也得复制 题目要求两套PPT母板&#xff0c;应用不同版式&#xff08;版式那就可以选&#xff09; 竖排文字

第六课:数据库集成:MongoDB与Mongoose技术应用

本文详细介绍了如何在Node.js应用程序中集成MongoDB数据库&#xff0c;并使用Mongoose库进行数据操作。我们将涵盖MongoDB在Ubuntu 20系统中的安装、Bash命令的CRUD操作、Mongoose数据建模&#xff08;Schema/Model&#xff09;、关联查询与聚合管道&#xff0c;以及实战案例—…

蓝桥云客 卡牌

2.卡牌 - 蓝桥云课 卡牌 问题描述 这天&#xff0c;小明在整理他的卡牌。 他一共有n种卡牌&#xff0c;第i种卡牌上印有正整数i(i∈[1,n])&#xff0c;且第i种卡牌现有a_i张。 而如果有n张卡牌&#xff0c;其中每种卡牌各一张&#xff0c;那么这n张卡牌可以被称为一套牌。小…

【Linux】——初识操作系统

文章目录 冯-诺依曼体系结构操作系统shell 冯-诺依曼体系结构 我们现在所使用的计算机就是冯-诺依曼体系结构。 存储器就是内存。 由下图可知&#xff0c;寄存器最快&#xff0c;为啥不用寄存器呢&#xff1f; 因为越快价格就最贵&#xff0c;冯诺依曼体系结构的诞生&#xf…

坐标变换介绍与机器人九点标定的原理

【备注】本文的C#代码在下面链接中可以下载:Opencv的C#九点标定代码资源-CSDN文库 https://download.csdn.net/download/qq_34047402/90452336 一、坐标变换的介绍 1.绕原点旋转的坐标变换 一个点(x,y)绕原点旋转u度,其旋转后的坐标(x1,y1)如何计算? 2.绕任意点的坐标变…

恶劣天候三维目标检测论文列表整理

恶劣天候三维目标检测论文列表 图摘自Kradar &#x1f3e0; 介绍 Hi&#xff0c;这是有关恶劣天气下三维目标检测的论文列表。主要是来源于近3年研究过程中认为有意义的文章。希望能为新入门的研究者提供一些帮助。 可能比较简陋&#xff0c;存在一定的遗漏&#xff0c;欢迎…

掌握Kubernetes Network Policy,构建安全的容器网络

在 Kubernetes 集群中&#xff0c;默认情况下&#xff0c;所有 Pod 之间都是可以相互通信的&#xff0c;这在某些场景下可能会带来安全隐患。为了实现更精细的网络访问控制&#xff0c;Kubernetes 提供了 Network Policy 机制。Network Policy 允许我们定义一组规则&#xff0c…

Mybatis集合嵌套查询,三级嵌套

三个表&#xff1a;房间 玩家 玩家信息 知识点&#xff1a;Mybatis中级联有关联&#xff08;association&#xff09;、集合&#xff08;collection&#xff09;、鉴别器&#xff08;discriminator&#xff09;三种。其中&#xff0c;association对应一对一关系、collectio…

字典树(trie树)详解

【本文概要】本文主要介绍了字典树的概念&#xff0c;字典树的一般算法&#xff0c;包括初始化&#xff0c;插入&#xff0c;查找等&#xff0c;最后举了比较典型的案例以及算法比赛中常见的“01树”来辅助理解字典树这种特殊的数据结构。 1、什么是字典树 字典树&#xff0c;是…

【html期末作业网页设计】

html期末作业网页设计 作者有话说项目功能介绍 网站结构完整代码网站样图 作者有话说 目前&#xff0c;我们的项目已经搭建了各页面的基本框架&#xff0c;但内容填充还不完善&#xff0c;各页面之间的跳转逻辑也还需要进一步优化。 我们深知&#xff0c;一个好的项目需要不断…

数据安全VS创作自由:ChatGPT与国产AI工具隐私管理对比——论文党程序员必看的避坑指南

文章目录 数据安全VS创作自由&#xff1a;ChatGPT与国产AI工具隐私管理对比——论文党程序员必看的避坑指南ChatGPTKimi腾讯元宝DeepSeek 数据安全VS创作自由&#xff1a;ChatGPT与国产AI工具隐私管理对比——论文党程序员必看的避坑指南 产品隐私设置操作路径隐私协议ChatGPT…

C语言实现贪吃蛇

贪吃蛇小游戏的实现 讲解1.Win32 API介绍1.1控制台程序(system())1.2控制台屏幕上的坐标CDDRD1.3 GetStdHandle1.4 GetConsoleCursorInfo1.5 SetConsoleCursorInfo1.6 SetConsoleCursorPostion1.7 GetAsyncKeyState 2.游戏设计2.1地图2.2蛇身和食物2.3数据结构设计2.4游戏流程设…

游戏引擎学习第142天

今天的计划 欢迎来到这个游戏开发项目&#xff0c;我们将从零开始编写一个完整的游戏&#xff0c;并且不会使用任何现成的库或引擎。整个开发过程中涉及的所有代码都会被完整展示&#xff0c;包括游戏运行所需的每一个细节。无论是哪款游戏&#xff0c;最终都需要有人编写底层…