輸出串流
相機子系統僅透過以 ANativeWindow 為基礎的管道運作,適用於所有解析度和輸出格式。您可以一次設定多個串流,將單一影格傳送至多個目標,例如 GPU、影片編碼器、RenderScript 或應用程式可見的緩衝區 (RAW Bayer、已處理的 YUV 緩衝區或 JPEG 編碼緩衝區)。
為進行最佳化,這些輸出串流必須預先設定,且一次只能存在有限數量。這樣一來,系統就能預先配置記憶體緩衝區並設定攝影機硬體,因此當提交的請求列出多個或不同的輸出管道時,系統不會延遲或延遲滿足請求。
如要進一步瞭解保證的串流輸出組合 (取決於支援的硬體層級),請參閱createCaptureSession()
。
裁剪
完整像素陣列的裁剪 (適用於數位變焦和其他需要較小視野的用途) 是透過 ANDROID_SCALER_CROP_REGION 設定傳達。這是依要求設定,且可依要求變更,這對實作流暢的數位變焦至關重要。
該區域定義為矩形 (x、y、寬度、高度),其中 (x、y) 描述矩形的左上角。矩形是在感應器有效像素陣列的座標系統上定義,(0,0) 是有效像素陣列的左上角像素。因此,寬度和高度不得大於 ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY 靜態資訊欄位中回報的尺寸。HAL 會透過 ANDROID_SCALER_MAX_DIGITAL_ZOOM 靜態資訊欄位回報允許的最小寬度和高度,該欄位會說明支援的最大縮放係數。因此,裁剪區域的最小寬度和高度為:
{width, height} = { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] / ANDROID_SCALER_MAX_DIGITAL_ZOOM), floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] / ANDROID_SCALER_MAX_DIGITAL_ZOOM) }
如果裁剪區域需要符合特定需求 (例如必須從偶數座標開始,且寬度/高度必須是偶數),HAL 必須進行必要的捨入,並在輸出結果中繼資料中寫入最終使用的裁剪區域。同樣地,如果 HAL 實作影片穩定功能,就必須調整結果裁剪區域,說明套用影片穩定功能後實際包含在輸出內容中的區域。一般來說,使用相機的應用程式必須能夠根據裁剪區域、影像感應器的尺寸和鏡頭焦距,判斷接收到的視野。
由於裁剪區域會套用至所有串流,而這些串流的長寬比可能與裁剪區域不同,因此每個串流使用的實際感應器區域可能小於裁剪區域。具體來說,每個串流都應維持正方形像素和顯示比例,方法是進一步裁剪定義的裁剪區域,但裁剪幅度不得過小。如果串流的顯示比例比裁剪區域寬,就應進一步垂直裁剪串流;如果串流的顯示比例比裁剪區域窄,就應進一步水平裁剪串流。
在所有情況下,串流裁剪區域都必須位於完整裁剪區域的中央,且每個串流只能相對於完整裁剪區域水平或垂直裁剪,絕不能同時裁剪。
舉例來說,如果定義了兩個串流 (640x480 串流 (4:3 比例) 和 1280x720 串流 (16:9 比例)),下圖會顯示假設感應器為 3 MP (2000 x 1500 像素陣列) 時,幾個範例裁剪區域的每個串流預期輸出區域。
裁剪區域:(500, 375, 1000, 750) (4:3 顯示比例)
640x480 串流裁剪:(500, 375, 1000, 750) (與裁剪區域相同)
1280x720 串流裁剪:(500, 469, 1000, 562)

圖 1. 顯示比例 4:3
裁剪區域:(500, 375, 1333, 750) (長寬比 16:9)
640x480 串流裁剪:(666, 375, 1000, 750)
1280x720 串流裁剪:(500, 375, 1333, 750) (與裁剪區域相同)

圖 2. 長寬比 16:9
裁剪區域:(500, 375, 750, 750) (長寬比 1:1)
640x480 串流裁剪:(500, 469, 750, 562)
1280x720 串流裁剪:(500, 543, 750, 414)

圖 3. 顯示比例 1:1
最後一個例子,是 1024x1024 正方形顯示比例的串流,而非 480p 串流:
裁剪區域:(500, 375, 1000, 750) (4:3 顯示比例)
1024x1024 串流裁剪:(625, 375, 750, 750)
1280x720 串流裁剪:(500, 469, 1000, 562)

圖 4. 顯示比例 4:3,正方形
重新處理
透過 RAW Bayer 資料的重新處理支援功能,提供對原始圖片檔案的額外支援。這項支援功能可讓相機管道處理先前擷取的 RAW 緩衝區和中繼資料 (先前錄製的整個影格),以產生新的 YUV 或 JPEG 輸出內容。
Zoom
如果裝置搭載 Android 11 以上版本,應用程式可以透過 ANDROID_CONTROL_ZOOM_RATIO
設定使用相機的變焦功能 (數位和光學)。
變焦比例定義為浮點因數。應用程式可以改用 ANDROID_CONTROL_ZOOM_RATIO
控制縮放等級,並使用 ANDROID_SCALER_CROP_REGION
進行水平和垂直裁剪,以取得與原生相機感應器不同的長寬比,而不使用 ANDROID_SCALER_CROP_REGION
進行裁剪和縮放。
多鏡頭系統可能包含多個焦距不同的鏡頭,使用者可以切換鏡頭來使用光學變焦功能。在下列情況下使用 ANDROID_CONTROL_ZOOM_RATIO
有許多優點:
- 從廣角鏡頭放大到望遠鏡頭:與
ANDROID_SCALER_CROP_REGION
的整數值相比,浮點比例可提供更精確的結果。 - 從廣角鏡頭縮小到超廣角鏡頭:
ANDROID_CONTROL_ZOOM_RATIO
支援縮小 (小於 1.0f),但ANDROID_SCALER_CROP_REGION
不支援。
縮放比例:2.0;原始視野的 1/4
裁剪區域:(0, 0, 2000, 1500) (4:3 顯示比例)
640x480 串流裁剪:(0, 0, 2000, 1500) (等於裁剪區域)
1280x720 串流裁剪:(0, 187, 2000, 1125)

圖 5. 2.0 倍變焦,顯示比例 4:3
縮放比例:2.0;原始視野的 1/4
裁剪區域:(0, 187, 2000, 1125) (16:9 顯示比例)
640x480 串流裁剪:(250, 187, 1500, 1125) (直向黑邊)
1280x720 串流裁剪:(0, 187, 2000, 1125) (與裁剪區域相同)

圖 6. 2.0 倍變焦,顯示比例 16:9
縮放比例:0.5;原始視野的 4 倍 (從廣角鏡頭切換至超廣角鏡頭)
裁剪區域:(250, 0, 1500, 1500) (1:1 顯示比例)
640x480 串流裁剪:(250, 187, 1500, 1125) (上下黑邊)
1280x720 串流裁剪:(250, 328, 1500, 844) (上下黑邊)

圖 7. 0.5 倍變焦,顯示比例 1:1
如上圖所示,裁剪區域的座標系統會變更為縮放後有效的視野,並以具有下列尺寸的矩形表示:(0
、0
、activeArrayWith
、activeArrayHeight
)。AE/AWB/AF 區域和臉部也適用相同情況。這項座標系統變更不適用於 RAW 擷取和相關中繼資料,例如 intrinsicCalibration
和 lensShadingMap
。
以上述假設範例為例,並假設輸出串流 #1 (640x480) 是觀景窗串流,則可透過下列兩種方式達成 2.0 倍變焦:
zoomRatio = 2.0
、scaler.cropRegion = (0, 0, 2000, 1500)
zoomRatio = 1.0
(預設)、scaler.cropRegion = (500, 375, 1000, 750)
如要讓應用程式將 android.control.aeRegions
設為觀景窗視野的左上四分之一,請將 android.control.aeRegions
設為 (0, 0, 1000, 750)
,並將 android.control.zoomRatio
設為 2.0
。或者,應用程式可以將 android.control.aeRegions
設為 (500, 375, 1000, 750)
的對等區域,以用於 android.control.zoomRatio
的 1.0
。