AndroidUSBCamera,UVCCamera开发通用库

转载自 裂缝中的阳光dg 的博客 http://blog.csdn.net/andrexpert/article/details/78324181

    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)支持调整对比度和亮度

如何使用AndroidUSBCamera项目 
AndroidUSBCamera,UVCCamera开发通用库_第1张图片


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:

[java] view plain copy
print ?
  1. allprojects {  
  2. repositories {  
  3. …  
  4. maven { url ’http://raw.github.com/saki4510t/libcommon/master/repository/’ }  
  5. maven { url ’https://jitpack.io’ }  
  6. }  
  7. }  
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  

[java] view plain copy
print ?
  1. dependencies {  
  2. compile ’com.github.jiangdongguo:AndroidUSBCamera:1.3.8’  
  3. }   
dependencies {
compile 'com.github.jiangdongguo:AndroidUSBCamera:1.3.8'
} 

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

[html] view plain copy
print ?
  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.   
  18.   
  19.      // 拔出USB设备  
  20.      @Override  
  21.      public void onDettachDev(UsbDevice device) {  
  22.          if(isRequest){  
  23.              // 关闭摄像头  
  24.              isRequest = false;  
  25.              mUSBManager.closeCamera();  
  26.              showShortMsg(device.getDeviceName()+”已拨出”);  
  27.          }  
  28.      }  
  29.   
  30.   
  31.      // 连接USB设备成功  
  32.      @Override  
  33.      public void onConnectDev(UsbDevice device,boolean isConnected) {  
  34.          if(! isConnected) {  
  35.              showShortMsg(“连接失败,请检查分辨率参数是否正确”);  
  36.              isPreview = false;  
  37.          }else{  
  38.              isPreview = true;  
  39.          }  
  40.      }  
  41.   
  42.   
  43.      // 与USB设备断开连接  
  44.      @Override  
  45.      public void onDisConnectDev(UsbDevice device) {  
  46.          showShortMsg(“连接失败”);  
  47.      }  
  48.  };  
  49.    
  50.  mUVCCameraView = (CameraViewInterface) mTextureView;  
  51.  mUVCCameraView.setCallback(new CameraViewInterface.Callback() {  
  52.      @Override  
  53.      public void onSurfaceCreated(CameraViewInterface view, Surface surface) {  
  54.          if(!isPreview && mUSBManager.isCameraOpened()) {  
  55.               mUSBManager.startPreview(mUVCCameraView, new AbstractUVCCameraHandler.OnPreViewResultListener() {  
  56.               @Override  
  57.               public void onPreviewResult(boolean result) {  
  58.   
  59.   
  60.               }  
  61.            });  
  62.            isPreview = true;  
  63.            }  
  64.       }  
  65.          @Override  
  66.          public void onSurfaceChanged(CameraViewInterface view, Surface surface, int width, int height) {  
  67.   
  68.   
  69.          }  
  70.   
  71.   
  72.          @Override  
  73.          public void onSurfaceDestroy(CameraViewInterface view, Surface surface) {  
  74.              if(isPreview && mUSBManager.isCameraOpened()) {  
  75.                  mUSBManager.stopPreview();  
  76.                  isPreview = false;  
  77.              }  
  78.          }  
  79.      });  
  80.      // 初始化引擎  
  81.      mUSBManager = USBCameraManager.getInstance();  
  82.      mUSBManager.initUSBMonitor(this,listener);  
  83.      mUSBManager.createUVCCamera(mUVCCameraView);  
   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

[java] view plain copy
print ?
  1. // 注册USB事件广播监听器  
  2. if(mUSBManager != null){  
  3.       mUSBManager.registerUSB();  
  4. }  
  5. // 恢复Camera预览  
  6.  if(mUVCCameraView != null){  
  7.       mUVCCameraView.onResume();  
  8.  }  
// 注册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

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

  5. 图片抓拍
  Picture capturing

[java] view plain copy
print ?
  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.  });  
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  
   

[java] view plain copy
print ?
  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.   
  22.   
  23.                         @Override  
  24.                         public void onRecordResult(String videoPath) {  
  25.                             showShortMsg(videoPath);  
  26.                         }  
  27.                     });  
  28. // 停止录制  
  29. mUSBManager.stopRecording();  
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  
    
[java] view plain copy
print ?
  1. mUSBManager.updateResolution(this, mUVCCameraView, 320240new 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 list = mUSBManager.getSupportedPreviewSizes();  
  13.  // Camera自动对焦    
  14.  mUSBManager.startCameraFoucs();  
mUSBManager.updateResolution(this, mUVCCameraView, 320, 240, new USBCameraManager.OnPreviewListener() {
             @Override
             public void onPreviewResult(boolean isSuccess) {
                    if(! isSuccess) {
                            showShortMsg("预览失败,不支持该分辨率");
                        }else {
                            showShortMsg("以切换到分辨率为320x240");
                        }
                    }
      });  
 // 获取Camera支持得分辨率  
 List list = mUSBManager.getSupportedPreviewSizes();
 // Camera自动对焦  
 mUSBManager.startCameraFoucs();

8. 释放引擎资源
  release resource  
[java] view plain copy
print ?
  1. // 释放资源  
  2. if(mUSBManager != null){  
  3.        mUSBManager.release();  
  4.  }  
// 释放资源
if(mUSBManager != null){
       mUSBManager.release();
 }
9. 添加权限
  add permissions  
   
[java] view plain copy
print ?
  1. “android.permission.WRITE_EXTERNAL_STORAGE” />  
  2. ”android.permission.RECORD_AUDIO” />  


USBCameraManager  API (Other)
[java] view plain copy
print ?
  1. (1void requestPermission(int index):请求授予开启USB摄像头权限;  
  2. (2int getUsbDeviceCount():返回查询到的可用USB Camera数目;  
  3. (3boolean isRecording():判断是否正在录制视频;  
  4. (4boolean isCameraOpened():判断USB摄像头是否正常打开;  
  5. (5void release():释放资源  
  6. (6) USBMonitor getUSBMonitor():返回USBMonitor实例;  
  7. (7) mUSBManager.setModelValue(USBCameraManager.MODE_CONTRAST,contrast++); 调整对比度  
  8. (8) mUSBManager.setModelValue(USBCameraManager.MODE_BRIGHTNESS,brightness++);调整亮度  
(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版本。(注:这里使用的是离线方式)


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


                

你可能感兴趣的:(Camera相关知识)