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

三、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以表支持~谢谢^_^!)

来源:网络


智能推荐

OpenWRT下使用UVC摄像头

        准备在OpenWRT系统使用UVC免驱摄像头采集图像,编译的系统使用默认的配置。使用程序对摄像头进行数据采集的时候发现程序只能进行支持的格式读取,不能进行格式设置、缓冲区分配和图像采集,一开始怀疑是摄像头不支持Linux系统,后来使用OrangePi进行测试的时候发现OrangePi是可以正常读取图像数据的,说明摄像头没有问题,但是奇怪的是用...

海思hi3519 uvc 海思uvc摄像头 透传

平台 hi3519v101  版本 40  sensor imx290  uvc出图 看下面  h264  mjpeg yuv输出   音视频一起的搞定   http://www.iqiyi.com/w_19s9ay5035.html  看效果哈。可以双摄,单射,画中画 ,融合...

ffmpeg开发之旅(7):Android视频直播核心技术(架构)详解

ffmpeg开发之旅(7):Android视频直播核心技术(架构)详解 (原文链接:http://blog.csdn.net/andrexpert/article/details/76919535) 一、直播架构解析      目前主流的直播架构中主要有两种方案,即流媒体转发、P2P。流媒体转发,是一种在视频直播中以流的方式将连续的音、视频数据经编码压缩后传输到流媒体...

ROS教程之使用UVC摄像头

ROS版本:indigo Ubuntu14.04   1.明确摄像头型号。 在终端输入 lsusb 我的摄像头为HYC-D200(很菜的摄像头哈,只是拿来做实验)。免驱摄像头,即为UVC。 2.安装UVC摄像头驱动。 注明:我的已经安装过了。   3.将驱动source到ros路径中。 4.显示图片   参考:http://blog.csdn.net/jasmine_...

基于UVC协议的摄像头知识学习

1.UVC的概念 UVC全称USB VIDEO  CLASS,标准协议可以从 usb.org下载.,这个网址有好多协议,什么USB啊之类的,我们需要的是下面这个协议https://www.usb.org/document-library/video-class-v15-document-set。USB_Video_Class_1_5.zip这个压缩包中包含着所以官方的参考资料。...

猜你喜欢

二叉树(C++模板实现)

一、实验要求    <1>打印出二叉树的三种遍历序。     <2>设计算法按中序次序输出二叉树中各结点的值及其所对应的层次数。     <3>求二叉树的高度。     <4>求二叉树的结点数。     <5>...

语音识别学习记录 [TDNN时延神经网络]

最近了解了卷积神经网络(CNN),CNN是受语音信号处理中时延神经网络(TDNN)影响而发明的。本篇的大部分内容都来自关于TDNN原始文献Waibel A, Hanazawa T, Hinton G, et al. Phoneme recognition using time-delay neural networks[J] (TDNN的原始论文)的理解和整理。该文写与1989年,在识别"...

教你快速推广微信公总号

随着互联网科技的飞速发展,自媒体平台正在发挥着越来越大的影响力,企业进行互联网的品牌建设,一定会通过网络媒体,推广自己在网络中的知名度以及品牌内容,从而形成公众认识的企业品牌形象。同事个人自媒体也在发光发热,多少人在自媒体这个行业里赚到了人生的第一桶金。公总号作为自媒体的代表,自然也吸引了不少人的加入,导致现在的微信公总号也是越来越难做了。现在微信公总号的粉丝价格已经涨到了2-3元一个粉丝的地步。...

VMware+ubuntu安装以及使用问题总结 (蓝屏,屏幕小,无法操作鼠标)

前言 需要使用VMware来创建ubuntu虚拟机。 安装VMware 我是参考伪万能的洋桑 安装的VMware。 但是一定要去官网去下载最新的VMware,如果使用旧版的在打开创建好的虚拟机会出现蓝屏问题。 关于**问题,直接搜最新的***即可。 安装ubuntu 参考悠悠happy安装ubuntu。 这里需要下载iso文件。几个G的那种,不要下载错了。 这里想要图形化界面,下载ubuntu-1...

老外写的一个测试用例

Test case example:   Test Case ID: CUST.01   Function: Add a new Customer   Data Assumptions: Customer database has been restored   General Description:   Add a new customer, via the Customer Add...

问答精选

How to get the hostname in Google App Engine?

I'm developing an app with Python on Google App Engine at http://shs1509-grc.appspot.com/ And since I am in China, appspot is blocked, and my users have to use the hostname http://shs1509-grc.appsp0t....

SessionNotCreatedException in Eclipse "Appium" code

My Code to execute a simple click button automation is given below , I am very new to appium so I am just trying to get my app and click one button , as i have given my exception down it is stopping m...

Get the count of checkboxes checked in a List using Javascript

I have a multiple Input Checkbox List and I want to create a JS function that when the user selects more than specified count items in the checkbox list, it will reject the action but if they have few...

Deleting index from Solr using solrj as a client

I am using solrj as client for indexing documents on the solr server. I am having problem while deleting the indexes by 'id' from the solr server. I am using following code to delete the indexes: Afte...

BATCH Scripting - Swapping array subscript values

I'd like to start this off by saying batch scripting is something I ever do, and it's for an assignment in my class, so please bear with me. I am trying to take an array index and swap one of the indi...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答