青春须早为,岂能长少年。这篇文章主要讲述安卓 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)获取每一帧数据;
UVCCameraTextureView控件进行图像的预览,PIXEL_FORMAT_RAW = 0;
PIXEL_FORMAT_YUV = 1;
PIXEL_FORMAT_RGB565 = 2;
PIXEL_FORMAT_RGBX = 3;
PIXEL_FORMAT_YUV420SP = 4;
PIXEL_FORMAT_NV21 = 5;
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常量3.在IUVCService.aidl中添加相关方法声明
2)在CameraServer#handleMessage()方法里添加处理增加的MeassageType常量的处理方式,类似thread.xxxx()
3)添加相关操作方法,用于封装对应MeassageType常量,CameraServer#handleMessage()的方法。
注意: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常量
【安卓 USB摄像头 开源库 UVCCamera 教程】7.在CameraClient#CameraHandler(handler类,CameraClient的静态内部类)#handleMessage()方法中添加处理CameraClient#MessageType常量的代码
8.在View中添加操作cameraClinet的相关代码
推荐阅读
- Android使用URL Scheme唤起APP
- 《Android源代码设计模式解析与实战》读书笔记
- HTML5 开发APP(MUI的一些特性)
- eclipse转Android studio遇到的那些坑
- 解决Ubuntu 16.04 上Android Studio2.3上面运行APP时提示DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs的
- 改变函数中的 this 指向——神奇的call,apply和bind及其应用
- APP为什么签名,使用keytool jarsigner进行签名
- 从高考填志愿APP泛滥看,蹭热点捞金有多可恶
- Android开发自学笔记(Android Studio)—4.5 ProgressBar及其子类