UVC for USBCamera in Android

news2025/3/10 15:07:19

基于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:65366
	 classData:239   subClassData:2  productId:4867   vendorId1Id:10071
classData:0   subClassData:0  productId:61   vendorId1Id:65366
 classData: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 devices
					for (final DeviceFilter filter: filters) {
						if ((filter != null) && filter.matches(device) || (filter != null && filter.mSubclass == device.getDeviceSubclass())) {
							// when filter matches
							if (!filter.isExclude) {
								result.add(device);
							}
							break;
						} else {
						.....
						}
					}
				}
			}
		}

判断USBDevice 是否有权限

mUsbManager.hasPermission(device)

UVC 进行打开和预览操作

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


onConnect -> openCamera、startPreview


 openCamera(ctrlBlock);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        // wait for camera created
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        // start previewing
                        Log.d(TAG,"onConnect   mCamView:"+mCamView);
                        startPreview(mCamView);
                    }
                }).start();

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker 安装 Nacos 2.1.1(单机版)

一、拉取镜像 docker pull nacos/nacos-server:v2.1.1 二、新建数据库 官网上下载 对应版本的 nacos zip 包&#xff0c;在 nacos\conf 目录下有 mysql脚本&#xff1a; 新建一个数据库 nacos_config&#xff0c;在数据库中依次执行 nacos-mysql.sql、1.4.0-ipv6_support-up…

网络安全数据富化 网络数据安全处理规范

本文件规定了网络运营者开展网络数据收集、存储、使用、加工、传输、提供、公开等数据处理的安全 技术与管理要求。 本文件适用于网络运营者规范网络数据处理,以及监管部门、第三方评估机构对网络数据处理进行 监督管理和评估。 部分术语和定义 数据&#xff08;data&#x…

深入理解 C 语言函数的定义

在 C 语言的编程世界里&#xff0c;函数是构建复杂程序的基石。理解函数的定义与运用&#xff0c;对于编写高效、可维护的代码至关重要。​ 函数定义的基本概念​ 函数是一组执行特定任务的代码块。它将一个复杂的问题分解为一个个小的、可管理的部分&#xff0c;提高了代码的…

SQL注入练习场:PHPStudy+SQLI-LABS靶场搭建教程(零基础友好版)

注意&#xff1a;文中涉及演示均为模拟测试&#xff0c;切勿用于真实环境&#xff0c;任何未授权测试都是违法行为&#xff01; 一、环境准备 下载PHPStudy 官网下载地址&#xff1a;https://www.xp.cn/php-study&#xff08;选择Windows版&#xff09; 安装时建议选择自定…

WordPress报502错误问题解决-php-fpm-84.service loaded failed failed LSB: starts php-fpm

文章目录 问题描述问题排查问题解决 问题描述 服务器环境&#xff1a; php&#xff1a;8.4MySQL&#xff1a;8.0Nginx&#xff1a;1.26.2 在访问站点时&#xff0c;一直报502&#xff0c;而两天前还能正常访问。 问题排查 导致502的问题很多&#xff0c;比如站点访问量太大…

uniapp 微信小程序 升级 uniad插件版本号

问题描述&#xff1a; 每次提交代码升级的时候会弹窗提示&#xff1a;uniad插件版本太低… 解决办法 一、使用微信小程序开发工具点击右上角 查看到最新版本&#xff1a;1.3.4 二、在app.json中改为最新的版本即可 "uni-ad": {"version": "1.3.4&q…

使用Dockerfile打包java项目生成镜像部署到Linux_java项目打docker镜像的dockerfile

比起容器、镜像来说&#xff0c;Dockerfile 非常普通&#xff0c;它就是一个纯文本&#xff0c;里面记录了一系列的构建指令&#xff0c;比如选择基础镜像、拷贝文件、运行脚本等等&#xff0c;每个指令都会生成一个 Layer&#xff0c;而 Docker 顺序执行这个文件里的所有步骤&…

使用 Apache POI 实现 Excel 单元格合并

在日常工作中&#xff0c;Excel 是一个不可或缺的工具&#xff0c;尤其是在处理大量数据时。为了提升数据的可读性和美观性&#xff0c;我们经常需要对 Excel 中的单元格进行合并操作。本文将介绍如何使用 Apache POI 库在 Java 中实现 Excel 单元格的合并&#xff0c;并提供一…

低代码开发直聘管理系统

低代码 DeepSeek 组合的方式开发直聘管理系统&#xff0c;兼职是开挂的存在。整个管理后台系统 小程序端接口的输出&#xff0c;只花了两个星期不到。 一、技术栈 后端&#xff1a;SpringBoot mybatis MySQL Redis 前端&#xff1a;Vue elementui 二、整体效果 三、表结…

Android更新时区版本-ianaVersion

代码路径 源码路径system/timezone 目录结构&#xff1a; apex 包含与Android时区更新APEX文件相关的代码&#xff0c;用于在Android设备上更新时区规则。 debug_tools 包含调试Android设备时区问题的工具。 distro 包含与“分发包”&#xff08;distros&#xff09;相关…

利用python实现对Excel文件中数据元组的自定义排序

问题引入&#xff1a; 假设你是一个浙江省水果超市的老板&#xff0c;统筹11个下辖地市的水果产量。假设11个地市生产的水果包括&#xff1a;苹果、香蕉和西瓜。你如何快速得到某种水果产量突出&#xff08;排名前几&#xff09;的地市&#xff1f;产量落后&#xff08;排名后…

leetcode 0018 四数之和-medium

1 题目&#xff1a;四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#x…

时序数据库 InfluxDB 3.0 版本性能实测报告:写入吞吐量提升效果验证

亮点总结&#xff1a; TSBS 测试表明&#xff0c;对于少于 100 万台设备的数据集&#xff0c;InfluxDB OSS 3.0 的数据写入速度实际上比 InfluxDB OSS 1.8 更慢。 对于 100 万台及以上设备的数据集&#xff0c;InfluxDB OSS 3.0 的数据写入性能才开始超过 InfluxDB OSS 1.8。…

Pytest自动化框架

目录 Pytest简单介绍 第一章&#xff1a;Pytest console命令 1.pytest -v 参数 -h 参数 其他一些参数&#xff1a;仅供参考 第二章. mark标记 pytest.mark.skip pytest.mark.skipif pytest.mark.xfail ​编辑 pytest.mark.patametrize 单个参数 多个参数 直接…

ubuntu22.04安装RAGFlow配合DeepSeek搭建本地知识库

一、简介 RAGFlow 是一个基于对文档的深入理解的开源 RAG&#xff08;检索增强生成&#xff09;引擎。当与 LLM 集成时&#xff0c;它能够提供真实的问答功能&#xff0c;并以来自各种复杂格式数据的有根据的引用为后盾。 二、安装 1.环境要求 CPU ≥ 4 核 &#xff08;x86…

【银河麒麟高级服务器操作系统实例】虚拟机桥接网络问题分析及处理

更多银河麒麟操作系统产品及技术讨论&#xff0c;欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer…

springboot011基于springboot的课程作业管理系统(源码+包运行+LW+技术指导)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得难了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等&#xff0c;你想解决的问题&#xff0c;今天…

Android 屏幕适配 Tips

概念 屏幕尺寸&#xff1a;屏幕的对角线的长度屏幕分辨率&#xff1a;屏幕分辨率是指在横纵向上的像素点数&#xff0c;单位是px&#xff0c;1px1个像素点。一般以纵向像素x横向像素&#xff0c;如1960x1080屏幕像素密度&#xff1a;每英寸上的像素点数&#xff0c;单位是dpi …

使用 Arduino 的 WiFi 控制机器人

使用 Arduino 的 WiFi 控制机器人 这次我们将使用 Arduino 和 Blynk 应用程序制作一个 Wi-Fi 控制的机器人。这款基于 Arduino 的机器人可以使用任何支持 Wi-Fi 的 Android 智能手机进行无线控制。 为了演示 Wi-Fi 控制机器人,我们使用了一个名为“Blynk”的 Android 移动应…

使用 Deepseek + kimi 快速生成PPT

前言 最近看到好多文章和视频都在说&#xff0c;使用 Deepseek 和 kimi 能快速生成精美的 ppt&#xff0c;毕竟那都是别人说的&#xff0c;只有自己尝试一次才知道结果。 具体操作 第一步&#xff1a;访问 deepseek 我们访问 deepseek &#xff0c;把我们想要输入的内容告诉…