一、術語 路由(route): 在 Flutter 中,屏 (screen) 和 頁面 (page) 都叫做 路由 (route)。 在 Android 開發中,Activity 相當於“路由”,在 iOS 開發中,ViewController 相當於“路由”。在 Flutter 中,“路由”也是一 ...
最近忙於開發一款基於Camera2 API的相機應用,部分功能涉及到廣角鏡頭,因此踩了不少坑,在此與大家分享下以作記錄交流...
經過查閱資料發現在安卓上所謂的廣角鏡頭切換其實是用一個邏輯攝像頭包含多個物理攝像頭實現的,在zoom縮放的時候根據不同的縮放值切換不同的物理攝像頭。
參考:https://source.android.google.cn/devices/camera/multi-camera?hl=zh-cn
踩坑記錄
- CameraDevice.TEMPLATE_RECORD的相容性問題
一般在錄製視頻的時候為了獲得比較穩定的幀率,我們可能會使用CameraDevice.TEMPLATE_RECORD創建CaptureRequest.Builder,但是CameraDevice.TEMPLATE_RECORD在某些鏡頭上
卻是不可用的,一般表現就是黑屏,查找定位發現是相機沒有數據流輸出。
解決方案就是查看API文檔註釋,發現CameraDevice.TEMPLATE_RECORD是有一定的限制的,我們根據文檔描述做相應的檢測,如果檢測到CameraDevice.TEMPLATE_RECORD不可用時回退到TEMPLATE_PREVIEW即可,
以下是文檔註釋內容:
Create a request suitable for video recording. Specifically, this means that a stable frame rate is used,
and post-processing is set for recording quality.
These requests would commonly be used with the CameraCaptureSession.setRepeatingRequest method.
This template is guaranteed to be supported on all camera devices except DEPTH_OUTPUT devices that are not BACKWARD_COMPATIBLE.
See Also:
createCaptureRequest
- 有些鏡頭明明在
CameraManager.getCameraIdList
中返回了,但是卻無法打開
後來發現這些不能打開的攝像頭StreamConfigurationMap的getOutputSizes返回空,也就是說沒有可支持的輸出圖像尺寸,因此我們在過濾攝像頭時也需要驗證StreamConfigurationMap是否有支持的尺寸輸出。
// 攝像頭是否可用
private boolean isEnableCamera(CameraCharacteristics cameraCharacteristics) {
StreamConfigurationMap configs = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] sizes = configs.getOutputSizes(ImageFormat.JPEG);
return null != sizes && sizes.length > 0;
}
- 有些鏡頭有色彩偏差
在對邏輯鏡頭進行測試時發現,從一個物理攝像頭切換到另外一個物理攝像頭,圖像有明顯的色彩偏差,例如下麵的兩幅對比圖:
很明顯後面的圖像色彩明顯不對,對於這個問題,只要在預覽時將CaptureRequest.CONTROL_CAPTURE_INTENT
設置成CaptureRequest.CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT
即可。
- 單色鏡頭
android中有一種單色攝像頭,這種攝像頭的預覽圖像是灰度圖,預覽圖如下圖所示:
這種攝像頭主要用於輔助拍攝,因此我們在篩選攝像頭時也需要過濾掉這種攝像頭,具體的過濾方法可以參考官方文檔:
單色攝像頭:https://source.android.google.cn/devices/camera/monochrome?hl=zh-cn
這次就和大家分享筆者踩過的這幾個坑,當遇到這些問題時筆者也是花了不少時間精力去定位問題,這裡分享出來希望大家在捲的路上能少走彎路...
推薦閱讀
關註我,一起進步,人生不止coding!!!