zoukankan      html  css  js  c++  java
  • 安卓 USB摄像头 开源库 UVCCamera 教程

    https://github.com/saki4510t/UVCCamera

    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的相关代码

  • 相关阅读:
    Smart Client Architecture and Design Guide
    Duwamish密码分析篇, Part 3
    庆贺发文100篇
    .Net Distributed Application Design Guide
    New Introduction to ASP.NET 2.0 Web Parts Framework
    SPS toplevel Site Collection Administrators and Owners
    来自Ingo Rammer先生的Email关于《Advanced .Net Remoting》
    The newsletter published by Ingo Rammer
    深度探索.Net Remoting基础架构
    信道、接收器、接收链和信道接受提供程序
  • 原文地址:https://www.cnblogs.com/edzjx/p/7093761.html
Copyright © 2011-2022 走看看