Android USBCamera,UVCCamera开发通用库,我试用了普通的USB摄像头没问题

2023-11-16

Android直播开发之旅(10):AndroidUSBCamera,UVCCamera开发通用库

    AndroidUSBCamera基于[saki4510t/UVCCamera](https://github.com/saki4510t/UVCCamera)开发,该项目对USB Camera(UVC设备)的使用和视频数据采集进行了高度封装,能够帮助开发者通过几个简单的API实现USB Camera设备的检测、连接、预览和音视频数据采集,最重要的是手机无需root,只需支持otg功能即可驱动。主要功能包括:  

(1)支持USB Camera设备检测,画面实时预览;  
(2)支持本地录制mp4格式视频,支持实时获取音视频数据流;  
(3)支持jpg格式图片抓拍;  
(4)支持获取camera支持的分辨率,和分辨率切换;  
(5)支持屏蔽声音,重启Camera; 
(6)支持相机自动对焦;  

(7)支持调整对比度和亮度

(8) 支持480P、720P、1080P and higher


如何使用AndroidUSBCamera项目 


1. 添加依赖到本地工程
  
第一步 添加JitPack仓库到工程gradle  
Step 1. Add the JitPack repository to your build file
Add it in your root build.gradle at the end of repositories:

 


    
    
  1. allprojects {
  2. repositories {
  3. maven { url ‘http://raw.github.com/saki4510t/libcommon/master/repository/’ }
  4. maven { url ‘https://jitpack.io’ }
  5. }
  6. }


第二步 添加依赖到app Module的gradle   
Step 2. Add the dependency  

 

 

 


    
    
  1. dependencies {
  2. compile 'com.github.jiangdongguo:AndroidUSBCamera:1.3.8'
  3. }

 

 

 

 2. 初始化引擎,注册USB设备事件监听器  
  Init AndroidUSBCamera engine,register the USB device event listener  
  


    
    
  1. private USBCameraManager.OnMyDevConnectListener listener = new USBCameraManager.OnMyDevConnectListener() {
  2. // 插入USB设备
  3. @Override
  4. public void onAttachDev(UsbDevice device) {
  5. if(mUSBManager == null || mUSBManager.getUsbDeviceCount() == 0){
  6. showShortMsg("未检测到USB摄像头设备");
  7. return;
  8. }
  9. // 请求打开摄像头
  10. if(! isRequest){
  11. isRequest = true;
  12. if(mUSBManager != null){
  13. mUSBManager.requestPermission(0);
  14. }
  15. }
  16. }
  17. // 拔出USB设备
  18. @Override
  19. public void onDettachDev(UsbDevice device) {
  20. if(isRequest){
  21. // 关闭摄像头
  22. isRequest = false;
  23. mUSBManager.closeCamera();
  24. showShortMsg(device.getDeviceName()+"已拨出");
  25. }
  26. }
  27. // 连接USB设备成功
  28. @Override
  29. public void onConnectDev(UsbDevice device,boolean isConnected) {
  30. if(! isConnected) {
  31. showShortMsg("连接失败,请检查分辨率参数是否正确");
  32. isPreview = false;
  33. }else{
  34. isPreview = true;
  35. }
  36. }
  37. // 与USB设备断开连接
  38. @Override
  39. public void onDisConnectDev(UsbDevice device) {
  40. showShortMsg("连接失败");
  41. }
  42. };
  43. mUVCCameraView = (CameraViewInterface) mTextureView;
  44. mUVCCameraView.setCallback(new CameraViewInterface.Callback() {
  45. @Override
  46. public void onSurfaceCreated(CameraViewInterface view, Surface surface) {
  47. if(!isPreview && mUSBManager.isCameraOpened()) {
  48. mUSBManager.startPreview(mUVCCameraView, new AbstractUVCCameraHandler.OnPreViewResultListener() {
  49. @Override
  50. public void onPreviewResult(boolean result) {
  51. }
  52. });
  53. isPreview = true;
  54. }
  55. }
  56. @Override
  57. public void onSurfaceChanged(CameraViewInterface view, Surface surface, int width, int height) {
  58. }
  59. @Override
  60. public void onSurfaceDestroy(CameraViewInterface view, Surface surface) {
  61. if(isPreview && mUSBManager.isCameraOpened()) {
  62. mUSBManager.stopPreview();
  63. isPreview = false;
  64. }
  65. }
  66. });
  67. // 初始化引擎
  68. mUSBManager = USBCameraManager.getInstance();
  69. mUSBManager.initUSBMonitor(this,listener);
  70. mUSBManager.createUVCCamera(mUVCCameraView);


3. 注册USB设备广播事件监听器,开始Camera预览  
  Register the USB device broadcast event listener and start the Camera Preview

 

 

 


    
    
  1. // 注册USB事件广播监听器
  2. if(mUSBManager != null){
  3. mUSBManager.registerUSB();
  4. }
  5. // 恢复Camera预览
  6. if(mUVCCameraView != null){
  7. mUVCCameraView.onResume();
  8. }

 


4. 注销USB设备广播事件监听器,停止Camera预览  
  Unregister the USB device broadcast event listener and stop the Camera Preview

 

 

 

 


    
    
  1. // 注销USB事件广播监听器
  2. if(mUSBManager != null){
  3. mUSBManager.unregisterUSB();
  4. }
  5. // 暂停Camera预览
  6. if(mUVCCameraView != null){
  7. mUVCCameraView.onPause();
  8. }

 


 5. 图片抓拍
  Picture capturing

 

 

 

 


    
    
  1. if(mUSBManager == null || ! mUSBManager.isCameraOpened()){
  2. showShortMsg( "抓拍异常,摄像头未开启");
  3. return;
  4. }
  5. mUSBManager.capturePicture(picPath, new AbstractUVCCameraHandler.OnCaptureListener() {
  6. @Override
  7. public void onCaptureResult(String path) {
  8. showShortMsg( "保存路径:"+path);
  9. }
  10. });

 


6. 本地录制(可实时获取音视频数据流)
   recoring mp4,and get media real-stream  
   

 

 

 


    
    
  1. if(mUSBManager == null || ! mUSBManager.isCameraOpened()){
  2. showShortMsg( "录制异常,摄像头未开启");
  3. return;
  4. }
  5. if(! mUSBManager.isRecording()){
  6. String videoPath = USBCameraManager.ROOT_PATH+System.currentTimeMillis();
  7. FileUtils.createfile(FileUtils.ROOT_PATH+ "test666.h264");
  8. RecordParams params = new RecordParams();
  9. params.setRecordPath(videoPath);
  10. params.setRecordDuration( 0); // 设置为0,不分割保存
  11. params.setVoiceClose( false); // 不屏蔽声音
  12. mUSBManager.startRecording(params, new AbstractUVCCameraHandler.OnEncodeResultListener() {
  13. @Override
  14. public void onEncodeResult(byte[] data, int offset, int length, long timestamp, int type) {
  15. // type = 0,aac格式音频流
  16. // type = 1,h264格式视频流
  17. if(type == 1){
  18. FileUtils.putFileStream(data,offset,length);
  19. }
  20. }
  21. @Override
  22. public void onRecordResult(String videoPath) {
  23. showShortMsg(videoPath);
  24. }
  25. });
  26. // 停止录制
  27. mUSBManager.stopRecording();


7. 切换分辨率
  update Resulotion  
    

 


    
    
  1. mUSBManager.updateResolution( this, mUVCCameraView, 320, 240, new USBCameraManager.OnPreviewListener() {
  2. @Override
  3. public void onPreviewResult(boolean isSuccess) {
  4. if(! isSuccess) {
  5. showShortMsg( "预览失败,不支持该分辨率");
  6. } else {
  7. showShortMsg( "以切换到分辨率为320x240");
  8. }
  9. }
  10. });
  11. // 获取Camera支持得分辨率
  12. List<Size> list = mUSBManager.getSupportedPreviewSizes();
  13. // Camera自动对焦
  14. mUSBManager.startCameraFoucs();


8. 释放引擎资源
  release resource  

 


    
    
  1. // 释放资源
  2. if(mUSBManager != null){
  3. mUSBManager.release();
  4. }

9. 添加权限
  add permissions  
   


    
    
  1. <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" />
  2. <uses-permission android:name= "android.permission.RECORD_AUDIO" />


USBCameraManager  API (Other)

 


    
    
  1. ( 1) void requestPermission(int index):请求授予开启USB摄像头权限;
  2. (2) int getUsbDeviceCount ():返回查询到的可用USB Camera数目;
  3. (3) boolean isRecording ():判断是否正在录制视频;
  4. (4) boolean isCameraOpened ():判断USB摄像头是否正常打开;
  5. (5) void release ():释放资源
  6. (6) USBMonitor getUSBMonitor ():返回USBMonitor实例;
  7. (7) mUSBManager. setModelValue (USBCameraManager.MODE_CONTRAST,contrast++); 调整对比度
  8. ( 8) mUSBManager.setModelValue(USBCameraManager.MODE_BRIGHTNESS,brightness++);调整亮度

 

 

 

 

 

注:在使用Android Studio移植UVCCamera时,很多朋友可能会遇到”open(“/dev/bus/usb/001/002”, O_RDWR, 0),报错,Permission denied”问题,这是由于Android Studio使用的ndk版本所致,建议使用ndk-r14即可。解决方法:local.properties–>指定ndk.dir版本。(注:这里使用的是离线方式)

 

最新版为2.1.0,使用方法请移步Github项目

 

 

GitHub源码地址:https://github.com/jiangdongguo/AndroidUSBCamera(如果对您有用,欢迎star&fork以表支持~谢谢^_^!)

上面是原博主的下载地址,有可能下载后无法运行,我调试好后上传了一份新的
https://download.csdn.net/download/qq_31939617/10642906

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android USBCamera,UVCCamera开发通用库,我试用了普通的USB摄像头没问题 的相关文章

  • Android 上的多处理

    我一直在 Android 上执行一些测试 以验证并行化算法 如 FFT 的性能可以提高多少 我通过使用带有 JNI FFTW 的 pthread 和 Java 线程 来自 JTransforms 来实现这些算法 我没有像预期那样通过使用线程
  • 如何检测手机一整圈(360 度)?

    由于我在网络上搜索没有找到任何相关答案 因此我发布了有关检测的问题360度转弯使用加速度计绕其轴的 Android 设备 例如 在横向模式下围绕 y 轴 假设在起始位置 y 值为 0 设备平坦于地面 当手机向前旋转 90 度时y 10 18
  • Android Studio 模拟器无法加载 Windows 10

    我在 Windows 10 上全新安装了 android studio 其中包含 android api 22 的所有软件包 当我运行模拟器时 我收到以下消息 C Users admin AppData Local Android sdk
  • 将 React Native 应用程序嵌入到现有的 ios/android 应用程序中

    我需要知道是否可以在现有的 ios android 应用程序中 嵌入 一个 React Native 应用程序 而不共享 React Native 应用程序代码 我们目前有一个 React Native 应用程序 它使用一些插件依赖项 并被
  • Android 套接字和 HTTP 响应标头

    有趣的是 我可能无意中找到了解决方案是否可以使用普通套接字连接发送 HTTP 请求并接收没有标头的响应 https stackoverflow com questions 8320574 我希望我忽略了一些东西 无论如何 我正在连接到 We
  • openFileOutput 在单例类中无法正常工作 - 想法/解决方法?

    作为一名 Android 开发新手 我遇到了一些奇怪的问题 我想创建一个类 它方法其他类 活动 任何可以用于以某种特殊方式处理文件的类 假设为了简单起见 我们将记录一些内容 如果我在活动中执行以下操作 例如在 OnClick 侦听器中 则一
  • Ionic4 电容器 android livereload?

    是否有可能在带有 livereload 的 Android 设备上运行带有电容器的 ionic 4 应用程序 我已经找了几个小时的答案了 但没有成功 请帮忙 如果使用最新版本 ionic cli 现在有一个命令ionic capacitor
  • Android 信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR) libwebviewchromium.so

    对于 android 4 4 我多次收到 Native crash at system lib libwebviewchromium so 错误 以下是设备包括 Xperia Z1 SO 01F 16 30 2 Galaxy Tab4 7
  • 视图随软键盘移动,遮挡其他 UI 对象

    我有一个容器视图 我希望它始终位于视图底部 位于 ScrollView 下方 ScrollView 有一些 UI 对象 其中一个是 EditText 对象 目前 当用户点击 EditText 对象内部时 android softkeyboa
  • 如何在我的谷歌上嵌入转弯导航

    我想在我的 Android 应用程序中嵌入逐段导航 请给我一个教程或如何执行此操作的想法 提前致谢 如果您不固定使用谷歌地图 您可以使用基于 OpenStreetMap 地图的维基百科版本 的 SDK 有几个不错的 SDK 提供商 skob
  • android gradle插件-离线安装

    我必须在离线电脑上安装 android gradle 插件 通过谷歌搜索 我了解到我可以通过本地 Maven 存储库来做到这一点 但从不成功的尝试和所有关于这个问题的质量保证中我知道这并不简单 我从来没有和maven一起工作过 有经验的人可
  • 如何让 Mockito 在 androidTest 中工作

    在我的测试中 我如何模拟我编写的课程 这是我的测试代码 import android support test runner AndroidJUnit4 import org junit Before import org junit Te
  • React Native v0.71.8 React-native-vector-icons 你看不到的图标

    我在用react native版本v0 71 8 我安装了react native vector icons库 但图标未显示 似乎链接在最新版本的 React Native 中不再起作用 所以我按照说明进行操作 但它不再编译 出现以下错误
  • 什么是版本代码主要?和versionCode有什么区别?

    我刚刚发现PackageInfo versionCode https developer android com reference android content pm PackageInfo html versionCode在 Andr
  • 突出显示菜单抽屉/滑动菜单中的所选项目

    使用的库 https github com SimonVT android menudrawer https github com SimonVT android menudrawer https github com JakeWharto
  • 手动添加带有依赖pom/iml文件的aar

    由于我无法使用私人 Maven 来共享我的库 因此我正在考虑共享 aar 并导入到另一个项目中 当 aar 和 jar 文件不包含任何依赖项时 就会出现问题 因此 一旦我在android studio中手动导入aar 使用Import JA
  • Android IntentService无法实例化类;没有空构造函数

    我有一个MainActivity需要访问在线 API 从而使用网络资源 的类 这需要我在单独的文件中创建的后台线程HttpRequestService java MainActivity java public class MainActi
  • 如何像UCBrowser一样使用webview打开url

    我是安卓新手 我正在尝试制作一个示例应用程序来在 webview 中打开网站 问题是 网站以桌面模式打开 如何才能像UC浏览器 手机模式 一样打开网站 尝试这个 它应该有效 webview1 getSettings setJavaScrip
  • 无法 ACTION_VIEW 外部存储上的文件

    我的 Android 手机的外部存储中有一个文件 在本例中是模拟的 知道通往它的路径和 或拥有File代表它的对象 我如何使用Intent在适当的应用程序中打开它 我尝试的第一件事是 startActivity new Intent Int
  • Android:通过查找带有标签而不是 ID 的容器来添加片段

    我正在使用 for 循环创建片段的多个实例 在每个片段中 我需要添加另一组子片段 为此 我需要找到正确的容器 如果我使用容器的 ID 所有子片段都会添加到第一个父片段 而不是它们自己的父片段 在我的主要片段中 for ParentFragm

随机推荐

  • map遍历的4种方式

    map遍历的方式有4种 1 使用for循环遍历map 2 使用迭代器遍历map 3 使用keySet迭代遍历map 4 使用entrySet遍历map 创建一个Map集合 Map
  • 使用Java8的Stream进行多字段排序以及剔除非空字段排序

    使用 Stream的sort 方法 并结合 Comparator 类 进行排序 主要解决以下两个问题 一 当某个字段为空时 怎么进行排序 使用 Comparator nullsFirst 或者 Comparator nullsLast 进行
  • 出现"/var/lib/mysql/mysql.sock“不存在的解决方法

    出现 var lib mysql mysql sock 不存在的解决方法 SQLSTATE HY000 2002 Can t connect to local MySQL server through socket var lib mysq
  • gRPC运行过程与流量控制机制

    文章目录 gRPC运行过程与流量控制 gRPC中的流量控制 讲解思路 BDP采样流量控制 结构分析 过程分析 Connection Level 流量控制 结构分析 过程分析 Stream level流量控制 结构分析 过程分析 总结 参考
  • 入门必看~~~~~群智能算法之鲸鱼优化算法(WOA)

    前言 鲸鱼优化算法 WOA 也是一种元启发式优化算法 一种新的模拟座头鲸狩猎行为的元启发式优化算法 鲸鱼优化算法 WOA 目前的工作与其他群优化算法相比的主要区别在于 采用随机或最佳搜索代理来模拟捕猎行为 并使用螺旋来模拟座头鲸的泡泡网攻击
  • A*算法 解决(有环图)第k短路径长度(C++)

    算法竞赛 file author jUicE g2R qq 3406291309 彬 bin 必应 一个某双流一大学通信与信息专业大二在读 brief 一直在算法竞赛学习的路上 copyright 2023 9 COPYRIGHT 原创技术
  • 11g降到10g方法

    Oracle11g数据库导入Oracle10g数据库 EXPDP方法 EXPDP要注意的是 导出的文件是在服务器端的 DATA PUMP DIR目录里 11g备份 导入10g的时候会抛错 直接阻止导入 一 在11g服务器上 使用expdp命
  • 【计算机网络】网络故障排查的基本思路

    网络故障排查的基本思路 1 检查物理链路是否有问题 2 查看本机IP地址 DNS 路由的设置是否有问题 3 测试网关或路由器的通畅情况 先测试网关再测试路由器 一级一级的测试 4 测试ping公网ip的通畅情况 平时多记几个外部IP 5 测
  • 随机颜色生成

    脚本挂在游戏物体上 并且物体要有材质 using UnityEngine using System Collections public class RandomColor MonoBehaviour Use this for initia
  • python二维数组切片举例

    python二维数组切片举例 案例数据 data 为下面的二维数组 1 2 3 4 5 6 7 8 9 说明 逗号 分隔各个维度 表示各个维度内的切片 只有 表示取这个维度的全部值 若没有逗号 则默认是对行进行切片 类似于二维数组 data
  • 力扣:乘积最大子数组

    给你一个整数数组 nums 请你找出数组中乘积最大的非空连续子数组 该子数组中至少包含一个数字 并返回该子数组所对应的乘积 测试用例的答案是一个 32 位 整数 class Solution public int maxProduct in
  • GB28181控制、传输流程和协议接口之注册

    注册和注销基本要求 SIP客户端 网关 SIP设备 联网系统等 SIP代理 SIP UA 使用IETFRFC3261中定义的方法 15 GB T28181 2016Register进行注册和注销 注册和注销时应进行认证 认证方式应支持数字摘
  • CSS怎么将DIV中的a标签改颜色

    标签默认文字是蓝色 点过后是文字是紫色 想改变标签文字颜色设置方法如下 a color black 设置默认颜色 a link color blue 未访问颜色 a visited color gray 已访问颜色 a hover colo
  • 2023华为od机试 Java【最长公共后缀】

    题目 我们现在要实现一个功能找到字符串数组 中的最长公共后缀如果不存在公共后缀 abc bbc c 输出描述 c 示例1 输入 abc bbc c 输出 c 说明 返回公共后缀 c 示例2 输入 aa bb cc 输出 Zero 说明 不存
  • 计算机软件工程毕设推荐 40个高质量信息管理专业毕设项目分享【源码+论文】(六)

    文章目录 前言 题目1 基于SSM的在线教学视频点播系统 br 题目2 基于SSM的考研信息查询系统 br 题目3 基于SSM与垃圾分类的信息管理系统 br 题目4 基于SSM的留学生交流平台系统 br 题目5 基于SSM的企业销售培训系统
  • Java Script 日期类的定义和常用方法的使用

    一 定义日期对象 1 说明 1 与日期相关的运算被封装在Date类中 使用该类的方法和属性可以获取客户端操作系统的日期和时间值 2 要调用Date类的方法 注 Date类没有自己的属性 首先必须使用构造器创建一个Dete类的实例 2 定义方
  • SOLIDWORKS螺纹显示处理方法

    在SOLIDWORKS中 使用螺纹孔向导生成螺纹孔非常方便 如下图 生成后的螺纹孔 在旋转一定角度后 会在遮挡的面上有一个虚线圆 当螺纹孔较多时 会使得界面比较凌乱 如何隐藏这些螺纹线呢 在零件的设计树中 在 注解 上右键 选择 细节 将
  • Python学习-----模块1.0(模块的简介、定义与使用)

    目录 前言 1 什么是模块 2 模块的分类 1 内置模块 2 第三方模块 3 自定义模块 3 模块的使用 4 自定义模块 5 模块和执行文件的判断 前言 今天就开始讲Python中的模块篇了 模块是Python的重要组成部分 Python之
  • 深入了解Unity的Physics类:一份详细的技术指南(七)(上篇)

    前言 Unity的Physics类是Unity物理系统的核心 提供了一套用于处理和控制物理模拟的API 这个类提供了用于控制物理系统的全局属性和方法 以及检测和施加力到游戏对象 处理碰撞和触发器事件等 为了让开发者都能更好理解这个Physi
  • Android USBCamera,UVCCamera开发通用库,我试用了普通的USB摄像头没问题

    转自 https blog csdn net AndrExpert article details 78324181 Android直播开发之旅 10 AndroidUSBCamera UVCCamera开发通用库 AndroidUSBCa