关于Android支持USB摄像头的帖子网上是有一些的,虽然内容都是转载过来的,前一段时间因为工作需要,必须实现在Android上实现USB摄像头和主摄像头同时录像,便自己动手尝试实现了一下,最终实现的效果是两个摄像头同时预览,最近还是看到一些人提问实现USB摄像头的问题,所以在这说说是如何实现的,部分内容摘自http://blog.csdn.net/sukhoi27smk/article/details/18269097,希望能对自己和他人有所帮助。

         讨论的前提是你的USB摄像头是UVC兼容的(如今大部分摄像头兼容)
         默认Android不提供访问外部摄像头的API,所以你要考虑写一个内核到Android应用层通信的中间件。
         当你给设备接入了USB摄像头,首先要检查一下几点:
        1)你的设备是否支持USB-OTG?
        2)是否在/dev目录创建了设备?如果创建了就那么一切就很简单了。shell 执行 ls -l /dev/v*,你将会看到video0或者video1。
        3)如果/dev没有创建设备,你需要写一个固件(UVC)跟硬件通信!

一条一条的解释上面的内容,想要实现USB摄像头,需要摄像头UVC兼容,其实这是因为Linux驱动中有包含UVC的驱动,对于那些有Android源代码的可以在Linux目录下敲入命令

make ARCH=arm menuconfig

依次展开

Device Drivers  --->

           <*> Multimedia support  --->

                         [*]   Video capture adapters  --->
                                          [*]   V4L USB devices  --->

可以看到UVC摄像头的驱动就是在这里添加的,当然如果你已知USB摄像头的型号可以选择这个选项里有的对应的驱动

所以有源代码的必须保证在这里Linux是有对UVC摄像头进行支持的,这是第一步,如果无法看到我所说的这些选项,有可能是其余某些依赖没有打开,还有就是不一定打开了上述选项USB摄像头一定会被识别,某些平台可能会有自己的一套框架,同样需要被选定,这些都要根据具体情况来进行分析。

        接下来就是OTG功能了,其实准确的说就是需要在USB摄像头插入的时候Android USB能充当主机,我们都知道USB设备在传输的时候也是有主机和从机之分的,比如说电脑上的USB基本上我们会用来当HOST,U盘总是SLAVE,目前来说我用过的Android手机都是支持OTG的,当然有代码的也可以menuconfig检查一下,也可以拿一个U盘测试以下OTG是否工作,如果都没问题那么可以测试一下第二条:是否在/dev目录创建了设备?如果创建了就那么一切就很简单了。shell 执行 ls -l /dev/v*,你将会看到video0或者video1。准确的说是video1或者video0会随着你插拔USB摄像头而出现消失,如果无法出现该现象而OTG确实能正常工作,那么需要写一个摄像头驱动,这个过程会很困难,可以准备寻求驱动工程师支持或者检查是不是别的原因导致的。

       好了,如果以上都不存在问题,那就意味着Linux已经可以操作USB摄像头了,如果在Linux上开发就可以直接写APP了,但是我们现在Android上,Android不提供USB摄像头API,我们需要自己去实现,这里有一份代码,是国外的一个网站的,也是从参考博客中找到的这个地址https://bitbucket.org/neuralassembly/simplewebcam/src,我们想用这份代码需要我们的需求适当修改一些内容,导入工程到eclips打开jni下面的Image_Proc.c可以看到如下部分。

// /dev/videox (x=cameraId+cameraBase) is used.// In some omap devices, system uses /dev/video[0-3],// so users must use /dev/video[4-].// In such a case, try cameraId=0 and cameraBase=4private int cameraId=0;private int cameraBase=0;// This definition also exists in ImageProc.h.// Webcam must support the resolution 640x480 with YUYV format. static final int IMG_WIDTH=640;static final int IMG_HEIGHT=480;
       首先是cameraId,我们之前尝试了插拔USB摄像头会有一个video0或者video1出现或者消失,而这个cameraId的值应该是0对应video0,1对应video1,以此类推,之后是IMG_WIDTH和IMG_HEIGHT,首先我们要确定我们这个USB摄像头支持那一些格式,如果不确定那就尝试几次,比如说上面指的是VGA640*480分辨率,有些720p的USB摄像头就需要改变一下这个参数,应该是1280*720,同样定义在ImageProc.h中的定义也要改,上面注释有写,这个我没有去测试过,修改完成之后编译运行,看看USB摄像头是不是出现图像了?我本人当时是已经出现图像了的,但是看参考博客上说需要修改video0或者video1的权限,因为我这边默认的权限就是666所以不需要修改,如果不是的话就改一下,命令是chmod 666 /dev/videoX,好了应该是大功告成了

更多相关文章

  1. 深入探索 Android(安卓)包体积优化(匠心制作二)
  2. Android(安卓)studio 下的aidl编程实现Android的夸进程间通信
  3. Android中WebView的使用指南:
  4. 利用Android(安卓)Studio、MAT对Android进行内存泄漏检测
  5. 【Android】实现登录、注册、数据库操作(极复杂)
  6. Gradle 依赖库下载
  7. Android(安卓)怎么样使用shape
  8. android 打开蓝牙设备 显示已经配对的蓝牙设备 ,并将已配对的蓝牙
  9. Android画图之抗锯齿(转)

随机推荐

  1. Android事件处理--读书笔记
  2. Android robotium自动化测试
  3. 10个经典的Android开源项目(附源码包)
  4. Android TV 智能电视/盒子 APP 开发焦点
  5. Android简单自定义布局介绍
  6. Android RIL使用详解
  7. 声波通信原理及源代码
  8. Android快速启动要点总结
  9. Android系统和linux内核的关系详解
  10. AndroidMediaRecorder架构详解