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