RxCamera, 一個RxJava風格的android camera封裝

jopen 8年前發布 | 13K 次閱讀 RxCamera Java開發

事實上這個庫寫了已經有一段時間了,由于最近工作上比較忙,所以現在才寫一篇文章來總結

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.

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!