RxCamera, 一個RxJava風格的android camera封裝
事實上這個庫寫了已經有一段時間了,由于最近工作上比較忙,所以現在才寫一篇文章來總結
What's this
正如標題所說, RxCamera 是一個基于RxJava而構建的一套 android.hardware.camera 封裝的庫。最初寫這個庫的目的是為了熟悉RxJava,并且而且也看到雖然在android開發已經有不少基于RxJava的庫,但是關于音視頻相關卻少之又少,于是就動手實現了一下。目前這個庫還處于非常早期的狀態,API比較簡陋,并且關于camera的設置還有很多沒有做
How to use
在 RxCamera 的README中已經有關于這個庫使用的比較詳細介紹了,我在這里再說明一下:
加入依賴
首先你需要在項目中加入對RxCamera項目的依賴:
repositories { jcenter() } dependencies { compile 'com.ragnarok.rxcamera:lib:0.0.1' }
基本的使用
- 配置camera的參數
android的原生camera api提供了不少的選項來配置打開攝像頭時候的參數,例如預覽的幀率,預覽的分辨率,自動對焦等,在RxCamera中主要是通過一個RxCameraConfig對象來管理這些對象,并通過RxCameraConfigChooser來配置對應參數:
RxCameraConfig config = RxCameraConfigChooser.obtain(). useBackCamera(). setAutoFocus(true). setPreferPreviewFrameRate(15, 30). setPreferPreviewSize(new Point(640, 480)). setHandleSurfaceEvent(true). get();
- 打開攝像頭并獲取數據
在設置好參數之后,就可以直接打開攝像頭了:
RxCamera.open(this, config).flatMap(new Func1<RxCamera, Observable<RxCamera>>() { @Override public Observable<RxCamera> call(RxCamera rxCamera) { return rxCamera.bindTexture(textureView); // or bind a SurfaceView: // rxCamera.bindSurface(SurfaceView) } }).flatMap(new Func1<RxCamera, Observable<RxCamera>>() { @Override public Observable<RxCamera> call(RxCamera rxCamera) { return rxCamera.startPreview(); } });
這里包括了設置用于預覽的Surface(這里是使用TextureView進行預覽),然后正式開始預覽。
只有預覽之后才能開始獲取攝像頭的數據:
camera.request().periodicDataRequest(1000).subscribe(new Action1<RxCameraData>() { @Override public void call(RxCameraData rxCameraData) { showLog("periodic request, cameraData.length: " + rxCameraData.cameraData.length); } });
獲取攝像頭的數據都通過request來獲取, RxCamera中封裝了幾種不同風格的cameraRequest,例如上面的是定時獲取攝像頭數據,每隔1000毫秒返回一次,另外還有連續返回數據,只返回一次數據等的request。這些request返回的Observable對象都會給訂閱者返回RxCameraData對象,其中包含兩個字段
byte[] cameraData Matrix rotateMatrix
目前的狀態
很明顯這個庫目前還處于非常早期的狀態,API還比較簡單,并且很多攝像頭的參數也沒有加入到進行設置,例如白平衡,閃光燈,測光等,后續這里將會逐漸完善豐富攝像頭的各種設置。另外,由于是完全基于RxJava來構建的庫,大部分接口都會直接返回Observable對象,這對于沒有熟悉RxJava的人來說可能還是會有點距離,因此這里后續對接口的封裝還是需要繼續改進,對外可能不再暴露Observable對象
About camera2
熟悉android開發的人估計都已經知道在Lollipop,Google新增一套 camera2 API用以取代之前的camera API,camera2提供了對攝像頭更加精細化的控制,相對來說比起老的API,對攝像頭的可控程度高了非常多。但我個人覺得新的API還不是特別好用,并且由于目前還是比較新,在使用新的camera2 API的時候, 還需要查詢手機上有哪些特性是有實現的 ,目前使用起來相當麻煩。所以RxCamera暫時還不打算支持camera2.