1.?常用對象
- CameraManager 相機服務。用于獲取相機對象和相機信息。
- CameraDevices 相機設備。負責連接相機、創建會話、生成拍攝請求,管理相機生命周期。
- CameraCaptureSession 相機拍攝會話。用于預覽和拍攝。一個相機只能有一個活躍會話。打開新會話時,舊會話自動關閉。
- SessionConfiguration 拍攝會話配置。
- CaptureRequest 拍攝請求。通知相機進行拍攝。每個請求產生一個CaptureResult對象,并為目標Surface產生幀。請求可以通過addTarget關聯若干個Surface,但它們必須是創建拍攝會話時使用的Surface的子集。
- CameraCharacteristics 相機信息。
- CaptureResult 部分拍攝結果信息。
- TotalCaptureResult 完整拍攝結果信息。
- ImageReader 圖片讀取器。接收圖片的對象。
- Surface 底片。接收或展示原始影像的對象,是數據管道終點。可以綁定到SurfaceView(預覽)、ImageReader(獲取圖像)或MediaRecorder(錄制視頻)。
2.?監聽器
- CameraDevice.StateCallback 相機狀態監聽器。
- CameraCaptureSession.StateCallback 相機拍攝會話狀態監聽器。
- CameraCaptureSession.CaptureCallback 拍攝結果監聽器。CaptureCallback只通知結果,圖片需要從ImageReader.OnImageAvailableListener中獲取。CaptureCallback和OnImageAvailableListener不保證發生順序。
- ImageReader.OnImageAvailableListener 圖片監聽器。
- SurfaceTexture.OnFrameAvailableListener 幀就緒監聽器。
- MediaRecorder.OnInfoListener? 錄制狀態監聽器。
- MediaRecorder.OnErrorListener 錄制錯誤監聽器。
3.?使用Camera2 API時涉及的線程/進程
- 相機服務進程 cameraserver系統進程(用戶態服務),負責管理相機硬件資源、處理底層傳感器控制和圖像處理流水線。包括打開/關閉相機設備、配置會話、處理捕獲請求和返回元數據,通過Binder與應用進程通信。
- 圖像渲染線程 處理預覽畫面和拍照結果的渲染,通常與顯示界面(如 SurfaceView/TextureView)綁定。
- SurfaceView 由系統單獨創建渲染線程(非主線程),通過雙緩沖機制高效更新預覽畫面。
- TextureView 依賴主線程或 OpenGL 線程渲染,需開啟硬件加速,但更靈活(支持縮放、旋轉)。
- 數據接收 通過ImageReader的OnImageAvailableListener在子線程中異步接收圖像數據。
- 應用主線程 管理UI交互、權限請求、生命周期回調,并協調其他線程的工作。所有Camera2耗時操作(如打開相機、創建會話)需在后臺線程執行,避免阻塞UI。通常使用HandlerThread配合Handler處理回調。通過Handler將相機事件(如 onCaptureCompleted)從后臺線程轉發到主線程更新UI。
4.?CaptureRequest分類
- 重復請求。通過setRepeatingRequest()提交的請求會持續執行,形成一個持續請求鏈,直到被手動停止(stopRepeating())或被新請求覆蓋。主要用于預覽等需連續輸出圖像流的場景,例如實時顯示攝像頭畫面。重復請求不阻塞后續請求,系統自動按幀率持續處理。但優先級較低,可被單次請求(如拍照)中斷。中斷后需要手動恢復預覽。
- 單次請求。通過capture()或captureBurst()提交,執行后自動清除。適用于拍照、手動對焦鎖定等需即時觸發的操作。單次請求優先級高,會中斷重復請求運行。請求提交后立即返回,拍攝結果通過回調異步返回。
在CameraCaptureSession中,可以連續且不等待拍攝完成就發送新CaptureRequest。但要注意避免請求過多超出流水線容量,導致幀丟棄或延遲。可以通過CaptureCallback監聽狀態,控制請求頻率。通過CameraCharacteristics的REQUEST_PIPELINE_MAX_DEPTH可以得到流水線容量。
5.?拍攝一張照片需要確認下列資源或狀態就緒
- 資源就緒。
- 獲得授權。
- 相機CameraDevice就緒。
- 相機拍攝會話CameraCaptureSession就緒。
- 圖像閱讀器ImageReader就緒(提供Surface)。
- 3A狀態就緒。
- 自動曝光AE收斂(AE_STATE_CONVERGED)或鎖定(AE_STATE_LOCKED)。否則可能過曝/欠曝。
- 自動對焦AF鎖定(AF_STATE_FOCUSED_LOCKED)。連續對焦模式下可以容忍ACTIVE_SCAN狀態。否則可能主體模糊或焦點偏移。
- 自動白平衡AWB收斂(AWB_STATE_CONVERGED)。否則可能產生色偏。
- 其他狀態
- 閃光燈充電完成(FLASH_STATE_READY)。否則可能導致閃光失敗或亮度不足。
- 光學防抖OIS鏡片穩定(LENS_STATE_STATIONARY)。否則可能防抖不生效。
- 降噪模式(NOISE_REDUCTION_MODE_HIGH_QUALITY)。否則可能降噪算法不生效。
- 傳感器穩定性(SENSOR_SENSITIVITY)。
6.?中斷3A算法的操作
- 切換控制模式CONTROL_MODE。
- 切換場景模式SCENE_MODE。
- 觸發3A操作。
- 鎖定或解鎖3A參數。
- 停止預覽流stopRepeating()。
- 請求中包含與當前3A參數沖突的3A參數。
- 重啟相機或會話。
- 光線劇烈變化。
7.?拍攝請求處理路徑
CameraCaptureSessionImpl.captureCameraDeviceImpl.captureCameraDeviceImpl.submitCaptureRequest檢查Target和Surfacethrow "Each request must have at least one Surface target"throw "Null Surface targets are not allowed"stopRepeating() // 中斷重復請求。ICameraDeviceUserWrapper.submitRequestList()ICameraDeviceUser.submitRequestList()// 通過ICameraDeviceUser.aidl調用C++代碼。CameraDeviceClient::submitRequestListCamera3Device::captureListCamera3Device::submitRequestsHelperif (repeating) Camera3Device::RequestThread::setRepeatingRequestsList<sp<CaptureRequest>> mRepeatingRequests.push_back// 后續由Camera3Device::RequestThread異步處理。elseCamera3Device::RequestThread::queueRequestListList<sp<CaptureRequest>> mRequestQueue.push_back// 后續由Camera3Device::RequestThread異步處理。
8.?后臺線程主循環
Camera3Device::RequestThread::threadLoop() {waitForNextRequestBatch();prepareHalRequests();sendRequestsBatch();Camera3Device::HalInterface::processBatchCaptureRequestsCameraDeviceSession::processCaptureRequestCameraDeviceSession::processOneCaptureRequestcamera3_device_t->ops->process_capture_requestcamera3_device_ops.process_capture_request// 通用實現。Camera::processCaptureRequestCamera::processCaptureBuffer
}
9.?使用DngCreator保存RAW_SENSOR影像的條件
- 拍攝完成,已經得到TotalCaptureResult結果。
- ImageReader.OnImageAvailableListener已經收到圖片。
10.?CaptureCallback用于跟蹤拍攝請求處理進度
- onCaptureStarted 相機開始拍攝(曝光)
- onReadoutStarted 相機開始讀取傳感器數據
- onCapturePartial 拍攝獲得部分結果
- onCaptureProgressed 拍攝獲得進展
- onCaptureCompleted 單次拍攝完成
- onCaptureFailed 拍攝失敗
- onCaptureSequenceCompleted 拍攝序列全部完成
- onCaptureSequenceAborted 拍攝序列中斷
- onCaptureBufferLost