uvccamera 后台服务_安卓 USB摄像头 开源库 UVCCamera 教程

本文详细介绍了如何使用UVCCamera这个开源库在安卓系统上实现USB摄像头的后台服务操作。UVCCamera支持多种像素格式,通过USBMonitor监控设备连接,并通过CameraServer和CameraThread进行图像数据的获取与预览。服务与前台UI通过AIDL进行交互,但类之间的耦合度较高,增加新的操作需要多个步骤。
摘要由CSDN通过智能技术生成

UVCCamera 听名字就知道使用UVC( USB VEDIO CLASS) 协议的通用类库。linux原生支持,基本支持市面上所有免区USB摄像头。

此开源库包含JNI及android封装的类库。是目前最好用的安卓USB摄像头类库。

UVCCamera来控制、管理与外接设备的连接,

UVCCamera.setFrameCallback(final IFrameCallback callback, final int pixelFormat)获取每一帧数据; PIXEL_FORMAT_RAW = 0;

PIXEL_FORMAT_YUV = 1;

PIXEL_FORMAT_RGB565 = 2;

PIXEL_FORMAT_RGBX = 3;

PIXEL_FORMAT_YUV420SP = 4;

PIXEL_FORMAT_NV21 = 5;

UVCCameraTextureView控件进行图像的预览,

USBMonitor进行驱动的连接和断开

UVCCamera Test4 类的耦合性很差

Test4是在后台服务中操作摄像头,而后台服务与前台进程不是同一个进程名,所以通过aidl进行service的ibinder对象的定义,并通过aidl定义的接口,生产的ibinder对象来操作后台服务。而摄像头的操作又不直接在service中操作,service负责侦测USB的链接情况,在usb连接到设备后台,创建一个handler(cameraserver)来操作摄像头。

要增加一个摄像头的操作,要叠层好几层才能封装完毕。类与类之间的依赖很严重!!!觉得作者设计的有问题。为了增加一个摄像头操作,我一共要花8个步骤才能添加完整。

1.在CameraServer—>CameraThread 添加相关操作

注意:操作摄像头的实际的操作是CameraServer(handler类)-->CameraThread(类)。

互相引用关系:CameraServer的实例通过弱引用WeakReference引用期内部类CameraThread的实例;CaeraThread通过强引用即直接引用的方式引用其外部内CameraServer实例

2.在CameraServer(handler)类里添加handler处理,通过handler发送Message,调用CameraServer-->CameraThread类中的操作

1)在CameraServer类中添加发送Message时的MessageType常量

2)在CameraServer#handleMessage()方法里添加处理增加的MeassageType常量的处理方式,类似thread.xxxx()

3)添加相关操作方法,用于封装对应MeassageType常量,CameraServer#handleMessage()的方法。

3.在IUVCService.aidl中添加相关方法声明

注意:IUVCSerice.aidl定义的接口就是UVCService反馈的ibinder,因为服务于前台UI的进程名不一样,所以用AIDL定义的接口,引用UVCService的ibinder对象。用于客户端Cameraclient访问。

4.UVCService#mUSBMonitorUVCService#mBasicBinder4.在UVCService中对UVCService#mBasicBinder匿名类实例,overrid实现IUVCService.aidl中添加的方法声明。

注意:UVCService是控制USB设备的后台服务,通过UVCService#mUSBMonitor监控USB设备,UVCService#mOnDeviceConnectListener(UVCService#mUSBMonitor的回调)#onConnect()时初始化一个CameraServer实例并塞入UVCService#sCameraServers集合中。UVCService#mUSBMonitor所有所有操作都在UVCService主线程上。UVCService#sCameraServers#CameraServer是真正操作USB摄像头的Handler类,而客户端CameraCilent通过UVCService#mBasicBinder调用UVCService#sCameraServers#CameraServer,从而调用UVCService#sCameraServers#CameraServer#CameraThread操作摄像头.

5.在CameraClient#CameraHandler(handler类,CameraClient的静态内部类)#CameraTask(Thread类,CameraClient#CameraHandler的静态内部类)中添加调用IUVCSerice.aidl添加方法的方法。

注意:CameraClinet是对应前台UI的操作后台服务的类,CameraClient通过handler类发送message的方式让线程类CameraTask实际操作后台服务。

6.在CameraClient中添加对应操作服务的MessageType常量

7.在CameraClient#CameraHandler(handler类,CameraClient的静态内部类)#handleMessage()方法中添加处理CameraClient#MessageType常量的代码

8.在View中添加操作cameraClinet的相关代码

原文:http://www.cnblogs.com/edzjx/p/7093761.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值