https://github.com/saki4510t/UVCCamera UVCCamera 聽名字就知道使用UVC( USB VEDIO CLASS) 協議的通用類庫。linux原生支持,基本支持市面上所有免區USB攝像頭。 此開源庫包含JNI及android封裝的類庫。是目前最好用的安卓US... ...
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的相關代碼