1.4Metadata與Characteristics

在上一節我們已經學習過Camera的參數通過Session下發到HAL層,這一節我們將詳細探索CameraMetadata。

在公開的SDK中,除了CameraMetadata類之外,還存在三個繼承它的子類,分別是CameraCharacteristicsCaptureRequestCaptureResult類。
通過名字,我們可以輕易地分析出看出CameraCharacteristics類是描述Camera特徵的,所以這個類中的鍵值在Camera open之前就可以獲得;
CaptureRequestCaptureResult兩個類很明顯是Capture過程下發值和返回的結果。這裏的Capture不是指拍照,而是指相機捕捉畫面、可以是預覽、拍照或錄像。

一、CameraCharacteristics

初始化

Kotli代碼:

cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId)

在這個類中(Android 9.0)有key值110項(含已廢棄),這些值中有一些是比較常用的,我將整理在這裏。

1. SCALER_STREAM_CONFIGURATION_MAP

這個值應該是Camera開發必用到的一個值,用於獲取Camera配置的分辨率列表。

val map = 
characteristics.get( CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP
) ?: return

通過這個map就可以選擇我們希望的分辨率,例如拍照時4:3 800萬像素一般就是3264*2448分辨率,錄像時1080P就是1920*1080像素。

2. SCALER_AVAILABLE_MAX_DIGITAL_ZOOM

一般相機應用都有會數字變焦,相機能設置的最大ZOOM就是通過這個值確定。Zoom分爲IPS和Sensor兩種形式,一般採用ISP的方式也就是我們通常意義的數字變焦的效果。這裏的最大值是在底層配置的,但是在APP開發時,這個最大值是可以被突破的。

例如獲取的max zoom是8,但是在設置時設置爲32,實際效果會出現32倍的效果。也即是這個值並非ISP所需要的,而實Android System的設置,但是系統並沒有做過多的限制。

這個情況也許根據不同廠商、高通MTK平臺不同會有不同現象,未驗證。

3. CONTROL_AE_AVAILABLE_MODES

自動曝光模式列表,有OFF、ON、AUTO FLASH、ALWAYS FLASH、AUTO FLASH REDEYE、EXTERNAL FLASH六個可選值。在Session中發Request時,通過這個key值得到設備支持的模式列表就是能夠傳的值。

Android要求

  1. 所有相機設備都支持ON,所有帶有flash單元的相機設備都支持ON_AUTO_FLASH和ON_ALWAYS_FLASH。
  2. 全模式相機設備始終支持OFF模式,這使得應用程序可以控制相機的曝光時間、靈敏度和幀持續時間。
  3. LEGACY模式的相機設備不支持OFF模式。如果LITIMED模式設備支持MANUAL_SENSOR功能,則它們將支持OFF模式。

由於現在一般Android設備都支持閃光燈,所以理論上ON、AUTO FLASH、ALWAYS FLASH三種模式是所有設備都支持的。

4. CONTROL_AF_AVAILABLE_MODES

自動對焦模式,有OFF、AUTO、MACRO、CONTINUOUS VIDEO、CONTINUOUS PICTURE、EDOF六中模式,對應0到5。但是筆者在部分高通平臺的機器上發現返回的列表中出現了兩次0,查看HAL層的定義,多出了一個FIXED的選項,推測是定焦模式,MTK平臺無此現象。由於平臺baseline不同,此處需要稍加註意。

5. CONTROL_AWB_AVAILABLE_MODES
白平衡模式,SDK支持OFFAUTOINCANDESCENTFLUORESCENTWARM_FLUORESCENTDAYLIGHTCLOUDY_DAYLIGHTTWILIGHTSHADE9種模式。大部分機器都是全支持,或者僅僅不支持OFF模式。
白平衡模式是不同於場景模式的,白平衡模式只是修改了白平衡的值,場景模式則涉及到對焦方式、gama、白平衡等多項參數。
6. SENSOR_INFO_PIXEL_ARRAY_SIZE

這個值實際上就是相機最大Size組成,當需要獲取最大size時,可以直接獲取。

7. SENSOR_ORIENTATION

這個值也是非常常用的,這個值就是用於修正屏幕與相機sensor之間夾角的,以便圖片與設備顯示方向一致。

Kotlin代碼:

private fun getOrientation(rotation: Int): Int {

return (ORIENTATIONS.get(rotation) + mSensorOrientation + 270) % 360

}

這段代碼是Google給的Camera2Demo上的方法,但是這個方法理論上並不是能完全cover所有情況,在Android源碼Framework的編譯doc中有給出全場景cover的公式,在Framework部分會再具體講。

8. INFO_SUPPORTED_HARDWARE_LEVEL

這個值就是當前設備對API2的支持情況,一般在使用API2時需要首選判斷支持級別,在Android P開始,google要求所有的Android設備都必須支持API2,並滿足相關測試纔可以上市,所以對於P和Q而言基本都是支持的。

 

以上8個值基本上就是CameraCharacteristics類最常用到的8Key值。

二、CaptureRequest和CaptureResult

在前面的介紹中,我們已經知道這兩個類request用於設定,result用於查詢結果,二者都是在session中存在的。

Characteristics類中,我們獲取了大量設備支持的元數據的列表和信息,這些信息就是我們針對這個設備的取值範圍。

例如,設備的可用AF模式爲123,那麼在構建requestbuilder時,就只能從這三個值中選擇。

Kotlin代碼

captureBuilder.set(

    CaptureRequest.CONTROL_AF_MODE,

CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE

)

在設置下發後,可以在CameraCaptureSession.CaptureCallback()回調中查詢結果,驗證是否設置成功。

val afMode = result.get(CaptureResult.CONTROL_AF_MODE)


 
session中,除了三A之外,對焦狀態也是非常需要關注的,

CONTROL_AF_STATE,它的狀態是繪製對焦框、實現手動和自動對焦的主要參數。

FPS在Request是無法直接獲得的,需要開發者自行計算,具體的實現方式可以參考Android源碼中的DevCamera部分。

 

結語:

至此,第一部分Camera APP開發實際上就已經結束了,在這部分介紹了SDK層面perview的實現邏輯,不同類之間的關係和相關用法。關於拍照和錄像功能實際上邏輯與預覽是一致的,就不在此贅述。

筆者無意做一個代碼搬運工,所以沒有過多的貼出源代碼,相關源代碼實現將會在整個系列結束時放到github上。

下一部分將進行Framework的邏輯分析和代碼分析。

 

 

 

 

 

 

 

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