Android直播开发之旅(10):AndroidUSBCamera,UVCCamera开发通用库(支持开启多路摄像头)[通俗易懂]

Android直播开发之旅(10):AndroidUSBCamera,UVCCamera开发通用库(支持开启多路摄像头)[通俗易懂]AndroidUSBCamera基于[saki4510t/UVCCamera](https://github.com/saki4510t/UVCCamera)开发,该项目对USBCamera(UVC设备)的使用和视频数据采集进行了高度封装,能够帮助开发者通过几个简单的API实现USBCamera设备的检测、连接、预览和音视频数据采集,最重要的是手机无需root,只需支持otg功能即可驱………

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

—————————————————————————————

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

注:3.0以下版本不再维护,有任何问题请在上述页面或掘金留言

—————————————————————————————-

    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

(9) 支持Android5.0,6.0,7.0,8.0,9.0

如何使用AndroidUSBCamera项目 
Android直播开发之旅(10):AndroidUSBCamera,UVCCamera开发通用库(支持开启多路摄像头)[通俗易懂]

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:

allprojects {
repositories {
...
maven { url 'http://raw.github.com/saki4510t/libcommon/master/repository/' }
maven { url 'https://jitpack.io' }
}
}

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

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

注:最新版为2,3,0

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

   private USBCameraManager.OnMyDevConnectListener listener = new USBCameraManager.OnMyDevConnectListener() {
        // 插入USB设备
        @Override
        public void onAttachDev(UsbDevice device) {
            if(mUSBManager == null || mUSBManager.getUsbDeviceCount() == 0){
                showShortMsg("未检测到USB摄像头设备");
                return;
            }
            // 请求打开摄像头
            if(! isRequest){
                isRequest = true;
                if(mUSBManager != null){
                    mUSBManager.requestPermission(0);
                }
            }
        }


        // 拔出USB设备
        @Override
        public void onDettachDev(UsbDevice device) {
            if(isRequest){
                // 关闭摄像头
                isRequest = false;
                mUSBManager.closeCamera();
                showShortMsg(device.getDeviceName()+"已拨出");
            }
        }


        // 连接USB设备成功
        @Override
        public void onConnectDev(UsbDevice device,boolean isConnected) {
            if(! isConnected) {
                showShortMsg("连接失败,请检查分辨率参数是否正确");
                isPreview = false;
            }else{
                isPreview = true;
            }
        }


        // 与USB设备断开连接
        @Override
        public void onDisConnectDev(UsbDevice device) {
            showShortMsg("连接失败");
        }
    };
    
    mUVCCameraView = (CameraViewInterface) mTextureView;
    mUVCCameraView.setCallback(new CameraViewInterface.Callback() {
        @Override
        public void onSurfaceCreated(CameraViewInterface view, Surface surface) {
            if(!isPreview && mUSBManager.isCameraOpened()) {
                 mUSBManager.startPreview(mUVCCameraView, new AbstractUVCCameraHandler.OnPreViewResultListener() {
                 @Override
                 public void onPreviewResult(boolean result) {


                 }
              });
              isPreview = true;
              }
         }
            @Override
            public void onSurfaceChanged(CameraViewInterface view, Surface surface, int width, int height) {


            }


            @Override
            public void onSurfaceDestroy(CameraViewInterface view, Surface surface) {
                if(isPreview && mUSBManager.isCameraOpened()) {
                    mUSBManager.stopPreview();
                    isPreview = false;
                }
            }
        });
        // 初始化引擎
        mUSBManager = USBCameraManager.getInstance();
        mUSBManager.initUSBMonitor(this,listener);
        mUSBManager.createUVCCamera(mUVCCameraView);

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

// 注册USB事件广播监听器
if(mUSBManager != null){
      mUSBManager.registerUSB();
}
// 恢复Camera预览
 if(mUVCCameraView != null){
      mUVCCameraView.onResume();
 }

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

// 注销USB事件广播监听器
 if(mUSBManager != null){
         mUSBManager.unregisterUSB();
  }
 // 暂停Camera预览
 if(mUVCCameraView != null){
         mUVCCameraView.onPause();
 }

 5. 图片抓拍
  Picture capturing

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

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

if(mUSBManager == null || ! mUSBManager.isCameraOpened()){
           showShortMsg("录制异常,摄像头未开启");
           return;
 }
if(! mUSBManager.isRecording()){
                    String videoPath = USBCameraManager.ROOT_PATH+System.currentTimeMillis();
                    FileUtils.createfile(FileUtils.ROOT_PATH+"test666.h264");
                    RecordParams params = new RecordParams();
                    params.setRecordPath(videoPath);
                    params.setRecordDuration(0);    // 设置为0,不分割保存
                    params.setVoiceClose(false);    // 不屏蔽声音
                    mUSBManager.startRecording(params, new AbstractUVCCameraHandler.OnEncodeResultListener() {
                        @Override
                        public void onEncodeResult(byte[] data, int offset, int length, long timestamp, int type) {
                            // type = 0,aac格式音频流
                            // type = 1,h264格式视频流
                            if(type == 1){
                                FileUtils.putFileStream(data,offset,length);
                            }
                        }


                        @Override
                        public void onRecordResult(String videoPath) {
                            showShortMsg(videoPath);
                        }
                    });
// 停止录制
mUSBManager.stopRecording();

7. 切换分辨率
  update Resulotion  
    

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

8. 释放引擎资源
  release resource  

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

9. 添加权限
  add permissions  
   

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

USBCameraManager  API (Other)

(1) void requestPermission(int index):请求授予开启USB摄像头权限;
(2) int getUsbDeviceCount():返回查询到的可用USB Camera数目;
(3) boolean isRecording():判断是否正在录制视频;
(4) boolean isCameraOpened():判断USB摄像头是否正常打开;
(5) void release():释放资源
(6) USBMonitor getUSBMonitor():返回USBMonitor实例;
(7) mUSBManager.setModelValue(USBCameraManager.MODE_CONTRAST,contrast++); 调整对比度
(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.3.0,更新时间为2019年6月17日,使用方法请移步Github项目

Android直播开发之旅(10):AndroidUSBCamera,UVCCamera开发通用库(支持开启多路摄像头)[通俗易懂]

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

Download APK

 In order to display the functions, I develop a simple released apk,which is based on version 2.3.1,and the build version is 28.0.3.Here is my configs and if you have any questions please issues to me ,I will follow it do my best.

ext {
    javaSourceCompatibility = JavaVersion.VERSION_1_8
    javaTargetCompatibility = JavaVersion.VERSION_1_8
    compileSdkVersion = 28
    buildToolsVersion = '28.0.3'
    minSdkVersion = 21
    targetSdkVersion = 28
    commonLibVersion= '2.12.4'
}

下载APP:  安装密码 12345678

Android直播开发之旅(10):AndroidUSBCamera,UVCCamera开发通用库(支持开启多路摄像头)[通俗易懂]

displaying:

Android直播开发之旅(10):AndroidUSBCamera,UVCCamera开发通用库(支持开启多路摄像头)[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170346.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SSDP协议的Android实现以及使用

    SSDP协议的Android实现以及使用

    2021年12月4日
    50
  • pycharm使用技巧及常用快捷键_键盘怎么自定义改键

    pycharm使用技巧及常用快捷键_键盘怎么自定义改键PyCharm自身提供了大量实用的快捷键,但是由于自己之前其他软件的快捷键使用习惯与此不同,这就需要在PyCharm量身DIY属于自己的快捷键了。快来按照下面的流程操作吧!!!1、File—&gt;Settings【Settings的快捷键大家看到了嘛!!!Ctrl+Alt+S】2、Keymap—&gt;齿轮状设置—&gt;Duplicate建议在设置快捷键之前…

    2022年8月25日
    5
  • 从零开始学GIMP:一.从基本图形开始

    从零开始学GIMP:一.从基本图形开始GIMP全名是GNUImageManipulationProgram,GNU意味着是开源,免费的.可以在GIMP官网下载到安装版,或者源代码.Linux用户(Ubuntu,Fedora等)也可以在商店直接下载到GIMP.废话不多说开始本节讲解1.1点击启动:1.2启动完成(默认为多窗口模式可以点击:窗口->单窗口模式来切换):2.1新建文件0

    2022年6月19日
    23
  • 怎么将多个ppt合并到一个ppt上_如何合并多个ppt文件

    怎么将多个ppt合并到一个ppt上_如何合并多个ppt文件在一个文件夹下面有a.ppt,b.ppt,c.ppt等PPT文件,如果把它们合并到一个新的PPT中?当PPT文件数量比较少的时候,我们还可以一个个打开,复制所有的幻灯片到新建的PPT中。当文件数量达

    2022年8月5日
    5
  • Mybatis中的resultType和resultMap

    一、概述MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对

    2022年4月6日
    35
  • java图书馆新地址_基于SSM的社区图书馆管理系统的设计与实现[通俗易懂]

    java图书馆新地址_基于SSM的社区图书馆管理系统的设计与实现[通俗易懂]好程序设计擅长JAVA(SSM,SSH,SPRINGBOOT)、PYTHON(DJANGO/FLASK)、THINKPHP、C#、安卓、微信小程序、MYSQL、SQLSERVER等,欢迎咨询在学习社区图书馆管理系统的设计与实现项目的时候,方便日后能及时查阅,在本平台中记录一下社区图书馆管理系统的设计与实现的开发流程。在学习时候的选用了SSM(MYECLIPSE),这个框架…

    2022年7月9日
    81

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号