1.3Camera2 Session機制詳解及Camera1的對比

想要理解API2的Session機制,不能簡單的只從Camera看,而是要結和Sesion本身的概念來看。

一、Session機制

1、Web應用中的Session

計算機領域的Session概念主要來自於Web通信,在網絡應用中,稱爲會話控制。

“Session對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的Web頁之間跳轉時,存儲在Session對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程序的 Web頁時,如果該用戶還沒有會話,則Web服務器將自動創建一個 Session對象。當會話過期或被放棄後,服務器將終止該會話。”

以上描述來自百度百科。我們通過這段描述,可以看出Session的幾個特點

  1. Session由服務器創建,由服務器終止,期間始終存在,除非過期或被放棄;
  2. Sesion存儲的變量始終不會丟失;

2、Caemra API2中的Session

如前所述,我們已經知道了Web應用中Session的幾個特點,現在我們來對比一下Camera2下的Session概念是否也具有類似的特徵。

1.如上一節介紹CameraDevice的主要作用就是創建Session;在session中存在一個closeByDevice()方法,這個方法會在device創建session調用關閉已存在會話;會在error時調用;以及在device關閉調用disconnected時調用。

也就是說Session的創建和銷燬完全由device管理。

2.Camera2的Request全部由Session下發,除非修改,否則將始終保持之前的狀態。

從上面的分析可以看到,Camera2的Session與Web應用的Session行爲上是一致的。所以,我們可以理解Caemra 2的Session具備了Web應用Session的優點。

3、Camera1與Camera2的區別

二者除了API接口本身的區別,最大的區別還是在實現邏輯上的。

Camera1的邏輯是面向Camera對象的,所有的行爲都是基於這個對象的方法的,如果這個對象本身就存在問題是無法感知的,只能在調用方法時拋出異常;

Camera2的邏輯則是面向狀態的,無論device還是session,任何狀態的改變可以做出相應的處理。

正是這樣的邏輯不同,導致了MetaData在傳遞上的區別。

Camera1的Parameter根據TAG直接綁定MetaData Request,經過Capture_Request轉爲camera3_capture_request中的camera_metadata_t settings完成參數從Java到native到HAL3的傳遞。

Camera2則直接封裝爲CaputureRequest,統一了Framework和HAL層的數據,沒有複雜的數據轉換過程。

二、Session傳遞的屬性

在1.2節中我們介紹Preview時,我們提到了session創建連續捕獲的方法setRepeatingRequest(),其中第一個參數是一個CaptureRequest對象,這個類採用了創建者模式,即request對象需要由builder創建

Kotlin代碼:

mPreviewRequest = mPreviewRequestBuilder!!.build()

CaptureRequest類中只提供了一些get方法和比較方法,真正的功能性方法set是在builder中,所以爲了讓相機達到我們想要的效果,我們需要對builder進行操作。

Kotlin代碼:

//構建Request Builder

mPreviewRequestBuilder =mCameraDevice!!.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)

//設置自動對焦

mPreviewRequestBuilder!!.set(
CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE
)

這裏我們以設置自動對焦的連續對焦模式爲例,可以看到對於Metadata而言就是設置key-value鍵值對即可。

最後將構建好的builder賦值到Request

Kotlin代碼:

mPreviewRequest = mPreviewRequestBuilder!!.build()

這樣Request對象就已經完成了初始化和設置參數,通過session就可以下發到HAL層了。

在這裏我們需要注意到CaptureRequest類、CaptureResult類都是繼承自CameraMetadata<CaptureResult.Key<?>>類,也就是說所有可設置的參數,實際上都是在Metadata的設置範圍內進行的。
下一章節,我們將詳細講解CameraMetadata<TKey>類。

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章