ffmpeg开发之旅(8):Android UVC Camera(USB摄像头)开发核心技术详解

来源:互联网 发布:电路的y参数矩阵 编辑:程序博客网 时间:2024/04/29 15:16
三、AndroidUSBCamera开源项目
    AndroidUSBCamera基于saki4510t/UVCCamera开发,该项目对USB Camera(UVC设备)的使用和视频数据采集进行了高度封装,能够帮助开发者通过几个简单的API实现USB Camera设备的检测、连接、预览和音视频数据采集,最重要的是手机无需root,只需支持otg功能即可驱动。主要功能包括:
  (1) 支持USB Camera设备检测,画面实时预览;
  (2) 支持本地录制mp4格式视频,支持实时获取音视频数据流;
  (3) 支持jpg格式图片抓拍;  
  (4) 支持获取支持的分辨率类型,和分辨率切换;

  (5) 支持屏蔽声音;

  (6)支持自动对焦

如何使用AndroidUSBCamera项目  


1.添加依赖到本地工程
第一步 添加JitPack仓库到工程gradle  :
[java] view plain copy
  1. allprojects {  
  2.         repositories {  
  3.             ...  
  4.             maven { url 'http://raw.github.com/saki4510t/libcommon/master/repository/' }  
  5.             maven { url 'https://jitpack.io' }  
  6.         }  
  7.     }  
第二步 添加依赖到app Module的gradle   
[java] view plain copy
  1. dependencies {  
  2.      compile 'com.github.jiangdongguo:AndroidUSBCamera:v1.2.2'  
  3. }   
2.初始化引擎,注册USB设备事件监听器  
[java] view plain copy
  1. USBCameraManager mUSBManager = USBCameraManager.getInstance();  
  2. // mTextureView为UVCCameraTextureView实例,继承于TextureView  
  3. // 用于渲染图像,需要在xml文件中定义  
  4. CameraViewInterface mUVCCameraView = (CameraViewInterface) mTextureView;  
  5. // 初始化引擎,注册事件监听器  
  6. mUSBManager.init(this, mUVCCameraView, new USBCameraManager.OnMyDevConnectListener() {  
  7.         // 插入USB设备  
  8.         @Override  
  9.         public void onAttachDev(UsbDevice device) {  
  10.             if(mUSBManager == null || mUSBManager.getUsbDeviceCount() == 0){  
  11.                 showShortMsg("未检测到USB摄像头设备");  
  12.                 return;  
  13.             }  
  14.             // 请求打开摄像头  
  15.             if(! isRequest){  
  16.                 isRequest = true;  
  17.                 if(mUSBManager != null){  
  18.                     mUSBManager.requestPermission(0);  
  19.                 }  
  20.             }  
  21.         }  
  22.   
  23.   
  24.         // 拔出USB设备  
  25.         @Override  
  26.         public void onDettachDev(UsbDevice device) {  
  27.             if(isRequest){  
  28.                 // 关闭摄像头  
  29.                 isRequest = false;  
  30.                 mUSBManager.closeCamera();  
  31.                 showShortMsg(device.getDeviceName()+"已拨出");  
  32.             }  
  33.         }  
  34.   
  35.   
  36.         // 连接USB设备成功  
  37.         @Override  
  38.         public void onConnectDev(UsbDevice device,boolean isConnected) {  
  39.             if(! isConnected) {  
  40.                 showShortMsg("连接失败,请检查分辨率参数是否正确");  
  41.             }  
  42.         }  
  43.   
  44.   
  45.         // 与USB设备断开连接  
  46.         @Override  
  47.         public void onDisConnectDev(UsbDevice device) {  
  48.   
  49.   
  50.         }  
  51.     };  

3. 注册USB设备广播事件监听器

[java] view plain copy
  1. // 注册USB事件广播监听器  
  2. if(mUSBManager != null){  
  3.         mUSBManager.registerUSB();  
  4. }  
4. 注销USB设备广播事件监听器
[java] view plain copy
  1. // 注销USB事件广播监听器  
  2.  if(mUSBManager != null){  
  3.          mUSBManager.unregisterUSB();  
  4.   }  
5. 图片抓拍
[java] view plain copy
  1. if(mUSBManager == null || ! mUSBManager.isCameraOpened()){  
  2.           showShortMsg("抓拍异常,摄像头未开启");  
  3.           return;  
  4.  }  
  5. mUSBManager.capturePicture(picPath);  
6. 本地录制(可实时获取音视频数据流)
[java] view plain copy
  1. if(mUSBManager == null || ! mUSBManager.isCameraOpened()){  
  2.            showShortMsg("录制异常,摄像头未开启");  
  3.            return;  
  4.  }  
  5. // 开始录制  
  6. if( !mUSBManager.isRecording()){  
  7. mUSBManager.startRecording(videoPath, new AbstractUVCCameraHandler.OnEncodeResultListener() {  
  8.         @Override  
  9.         public void onEncodeResult(byte[] data, int offset, int length, long timestamp, int type) {  
  10.               // type=0为音频流,type=1为视频流  
  11.         });  
  12. }  
  13. // 停止录制  
  14. mUSBManager.stopRecording();  
7. 切换分辨率
[java] view plain copy
  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.       });     
[java] view plain copy
  1. // 获取Camera支持得分辨率    
[java] view plain copy
  1.  List<Size> list = mUSBManager.getSupportedPreviewSizes();  
  2.  // Camera自动对焦    
  3.  mUSBManager.startCameraFoucs();  
8. 释放引擎资源
[java] view plain copy
  1. // 释放资源  
  2. if(mUSBManager != null){  
  3.        mUSBManager.release();  
  4.  }  
9. 其他API
[java] view plain copy
  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实例;  


注:在使用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以表支持~谢谢^_^!)

阅读全文
0 0
原创粉丝点击