輸出串流
相機子系統只會在所有解析度和輸出格式的 ANativeWindow 管道上運作。您可以一次設定多個串流,將單一影格傳送至多個目標,例如 GPU、影片編碼器、RenderScript 或應用程式可見的緩衝區 (RAW Bayer、經處理的 YUV 緩衝區或 JPEG 編碼緩衝區)。
為了進行最佳化,這些輸出串流必須事先設定,且一次只能存在有限的串流。這可讓您預先配置記憶體緩衝區和相機硬體設定,因此在提交請求時,即使列出多個或不同的輸出管道,也不會延遲或延遲滿足要求。
如要進一步瞭解依據支援的硬體等級而提供的保證串流輸出組合,請參閱 createCaptureSession()
。
裁剪
透過 ANDROID_SCALER_CROP_REGION 設定,可傳達全像素陣列裁剪資訊 (適用於數位變焦和其他需要較小 FOV 的用途)。這是個別要求設定,可依個別要求變更,這對於實作流暢的數位縮放功能至關重要。
區域定義為矩形 (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)
![crop-region-43-ratio](https://source.android.google.cn/static/docs/core/camera/images/crop-region-43-ratio.png?authuser=1&hl=zh-tw)
圖 1. 顯示比例 4:3
裁剪區域:(500, 375, 1333, 750) (16:9 顯示比例)
640x480 串流裁剪:(666, 375, 1000, 750)
1280x720 串流裁剪:(500, 375, 1333, 750) (等於裁剪區域)
![crop-region-169-ratio](https://source.android.google.cn/static/docs/core/camera/images/crop-region-169-ratio.png?authuser=1&hl=zh-tw)
圖 2. 顯示比例 16:9
裁剪區域:(500, 375, 750, 750) (1:1 顯示比例)
640x480 串流裁剪:(500, 469, 750, 562)
1280x720 串流裁剪:(500, 543, 750, 414)
![crop-region-11-ratio](https://source.android.google.cn/static/docs/core/camera/images/crop-region-11-ratio.png?authuser=1&hl=zh-tw)
圖 3. 顯示比例 1:1
最後一個範例是 1024x1024 正方形顯示比例串流,而不是 480p 串流:
裁剪區域:(500, 375, 1000, 750) (4:3 顯示比例)
1024x1024 串流裁剪:(625, 375, 750, 750)
1280x720 串流裁剪:(500, 469, 1000, 562)
![crop-region-43-square-ratio](https://source.android.google.cn/static/docs/core/camera/images/crop-region-43-square-ratio.png?authuser=1&hl=zh-tw)
圖 4. 4:3 顯示比例,正方形
重新處理
針對 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)
![zoom-ratio-2-crop-43](https://source.android.google.cn/static/docs/core/camera/images/zoom-ratio-2-crop-43.png?authuser=1&hl=zh-tw)
圖 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) (等於裁剪區域)
![zoom-ratio-2-crop-169](https://source.android.google.cn/static/docs/core/camera/images/zoom-ratio-2-crop-169.png?authuser=1&hl=zh-tw)
圖 6. 2.0 倍縮放、16:9 顯示比例
變焦倍率:0.5;原始視野的 4 倍 (從廣角鏡頭切換為超廣角鏡頭)
裁剪區域:(250, 0, 1500, 1500) (1:1 顯示比例)
640x480 串流裁剪:(250, 187, 1500, 1125) (上下黑邊)
1280x720 串流裁剪:(250, 328, 1500, 844) (上下黑邊)
![images/zoom-ratio-0.5-crop-11](https://source.android.google.cn/static/docs/core/camera/images/zoom-ratio-0.5-crop-11.png?authuser=1&hl=zh-tw)
圖 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
設為 1.0
的 android.control.zoomRatio
的 (500, 375, 1000, 750)
等同區域。