遷移至 Camera2

本頁面說明擴展視野系統 (EVS) 和 Camera2 的差異。並說明如何設定 Camera2 實作。

開啟及關閉攝影機

EVS

openCamera 結合了開啟裝置和設定單一串流的作業。

Camera2

如要使用 Camera2 開啟及關閉裝置,請按照下列步驟操作:

  1. 選取下列其中一個模式:

  2. 如要設定串流,請使用相關輸出介面建立擷取工作階段。舉例來說,可從 ImageReader 或 SurfaceView 取得,方法是使用 CameraDevice.createCaptureSession() (Java) 或 ACameraDevice_createCaptureSession() (NDK)。

    Camera2 支援同時多個串流。建立多個串流,用於預覽、錄製和圖像處理等用途。串流會做為平行管道,依序處理來自攝影機的原始影格。

  3. 如要關閉攝影機裝置,請使用 CameraDevice.close() (Java) 或 ACameraDevice_close() (NDK)。

請參考下列程式碼片段範例:

Java

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
    manager.openCamera(cameraId, new CameraDevice.StateCallback() {
        @Override
        public void onOpened(@NonNull CameraDevice camera) {
            // Camera opened, now create session
        }
        @Override
        public void onDisconnected(@NonNull CameraDevice camera) {}
        @Override
        public void onError(@NonNull CameraDevice camera, int error) {}
    }, handler);
} catch (CameraAccessException e) {
    // Handle exception
}

NDK

ACameraManager *cameraManager = ACameraManager_create();
ACameraDevice *cameraDevice = nullptr;
camera_status_t status = ACameraManager_openCamera(
    cameraManager, cameraId, &deviceStateCallbacks, &cameraDevice);

串流攝影機資料

本節說明如何串流攝影機資料。

EVS

在 EVS 上,請:

  1. 啟動串流,使用 startVideoStream
  2. 停止串流播放,請使用 stopVideoStream

Camera2

在 Camera2 中,如要:

  1. 建立適合預覽的 CaptureRequest,並在 Java 中使用 TEMPLATE_PREVIEW 搭配 CameraDevice.createCaptureRequest(),或在 NDK 中使用 ACameraDevice_createCaptureRequest()

  2. 提交持續串流要求,請使用 CameraCaptureSession.setSingleRepeatingRequest (Java) 或 ACameraCaptureSession_setRepeatingRequestV2 (NDK)。

  3. 停止串流,使用 CameraCaptureSession.stopRepeating (Java) 或 ACameraCaptureSession_stopRepeating (NDK)。

緩衝區管理

  • 在 EVS 中,setMaxFramesInFlight先前控制緩衝區計數, 這可能會在串流中途變更。攝影機開始串流時,EVS 會為每個影像畫面提供緩衝區 ID,這與記憶體中的相同硬體緩衝區位址相關。

  • 在 Camera2 中,AImageReaderImageReader 的圖片數量上限會在初始化工作階段時,透過 AImageReader_newImageReader.newInstance 設定。工作階段開始後,就無法動態變更這項設定。如要取得每個影格的緩衝區 ID,用戶端可以維護對應硬體緩衝區位址 (從 Image 物件取得) 與不重複 ID 的對應項。

暫停及繼續串流播放

攝影機參數

請參閱下列程式碼範例:

Java

CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.set(CaptureRequest.CONTROL_EFFECT_MODE, CaptureRequest.CONTROL_EFFECT_MODE_MONO);
// Submit this request

NDK

ACaptureRequest_setEntry_i32(captureRequest, ACAMERA_CONTROL_EFFECT_MODE, 1, &effectMode);

邏輯攝影機

  • EVS:如果是環景攝影機等邏輯攝影機,EVS 管理工具會開啟所有相關聯的實體攝影機、啟動視訊串流,並提供連貫的影像陣列。

  • Camera2:如果需要使用 Camera2 的類似功能,應用程式必須管理邏輯相機,因此您需要:

    • 找出與邏輯攝影機相關聯的實體子攝影機。
    • 開啟每個必要的實體攝影機。
    • 在每部攝影機上啟動串流。
    • 視需要同步處理影格。最好是在 HAL 處理這項作業,以進行硬體層級的同步處理。

我們會為現有 EVS 用戶端提供相容性程式庫 (墊片層),方便他們進行轉換。目標是支援 Camera2 API,同時盡量減少程式碼變更。

權限

EVS

只有具備特殊權限的專屬 ID (UID) 才能存取。例如:AID_AUTOMOTIVE_EVS。已淘汰的權限包括 android.car.permission.USE_CAR_EVS_CAMERA

Camera2

Camera2 需要 android.permission.CAMERA。特殊情況:

安全關鍵攝影機應用程式必須遵守「Design for Driving」提供的 Google 內建預先授權政策。

主要和次要用戶端

如要分享攝影機存取權:

  • EVS 提供明確的 API (setPrimaryClientforcePrimaryClient) 來管理主要用戶端,該用戶端有權修改參數。

  • 如果以共用模式開啟 Camera2 (Android 16 以上版本),存取相機的用戶端優先順序會決定主要用戶端。優先順序最高的用戶端 (通常是前景應用程式) 可以修改擷取要求參數。系統不會使用任何直接 API 強制設定主要狀態。主要狀態由架構管理。

系統攝影機

如要限制系統或 1P 應用程式只能存取攝影機裝置,請在該裝置的 Camera HAL 中宣告 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA 功能。除了連線至攝影機裝置外,用戶端也必須具備 android.permission.SYSTEM_CAMERAandroid.permission.CAMERA

CarEVSManager 和 CarEVSService

如要存取 API,Java 應用程式應使用標準 android.hardware.camera2.CameraManager,而非 CarEVSManager

如果是後視攝影機,CarEVSService 中監控 GEAR_SELECTION VHAL 屬性並啟動活動的邏輯必須遷移至 OEM 擁有的應用程式。這個應用程式:

  • 監控 GEAR_SELECTION VHAL 屬性。
  • 在倒車時啟動後視攝影機活動。
  • 使用 Camera2 API 顯示相機畫面。

為確保後視攝影機畫面顯示一致且不受阻礙,特別是在使用者轉換畫面或有其他應用程式可能會遮住預覽畫面時,建議您使用 Camera2 實作後視攝影機功能時,遵循下列指南:

顯示轉譯

EVS 螢幕和車輛螢幕服務。

這些已淘汰。

Camera2

搭配使用 Surface、android.hardware.display.DisplayManagerandroid.view.Display,使用標準 Android 算繪方法。

如需提早顯示相機畫面,Camera2 ImageReader 可直接存取硬體緩衝區,方便您整合現有的 DRM 顯示實作項目,以進行算繪。

這項攝影機搶先存取權僅授予具有 AID_AUTOMOTIVE_EVS_UID 的特許用戶,且僅限於車輛外部的系統攝影機。

模擬器 HAL (EVS 模擬 HAL)

我們計畫淘汰 EVS Mock HAL。OEM 應改用 Camera2 模擬相機 HAL hardware/google/camera/devices/EmulatedCamera/,這項工具將支援:

  • 可設定攝影機數量。
  • 色條測試模式。
  • 模擬影片檔案。

如要在建構作業中加入這個 HAL,請執行下列操作:

# In device.mk
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
PRODUCT_PACKAGES += com.google.emulated.camera.provider.hal

此外,您也必須採用適當的安全增強式 Linux (SELinux) 政策,允許 cameraserver 與模擬攝影機 HAL 服務互動。

V4L2 UVC 攝影機 HAL

我們計畫淘汰 EVS V4L2 HAL。使用 Camera2 外接攝影機支援功能,支援 USB 攝影機 (UVC)。詳情請參閱「外接 USB 攝影機」。

搶先使用相機

EVS 攝影機存取權僅限於具有 AID_AUTOMOTIVE_EVS UID 的特權用戶端。在 Android 開機程序完成前存取攝影機,但前提是 UID 仍為 AID_AUTOMOTIVE_EVS。不過,搶先存取攝影機功能僅限於車輛外部的系統攝影機。

超音波 API

我們預計淘汰 EVS Ultrasonics API。請改用 Android 15 推出的 VHAL 屬性,偵測超音波感應器。

屬性 類型 定義
ULTRASONICS_SENSOR_POSITION 靜態 {<x>, <y>, <z>}

以毫米為單位,每個值代表感應器在相關聯軸上的位置,相對於 AAOS 感應器座標架構。

ULTRASONICS_SENSOR_ORIENTATION 靜態 {<qw>, <qx>, <qy>, <qz>}

這是感應器相對於 AAOS 感應器座標架構的四元數旋轉: $$w+xi+yj+zk$$

ULTRASONICS_SENSOR_FIELD_OF_VIEW 靜態 {<horizontal>, <vertical>}

感應器的水平和垂直視野 (以度為單位)。

ULTRASONICS_SENSOR_DETECTION_RANGE 靜態 {<minimum>, <maximum>}

感應器的偵測範圍,以公釐為單位。

ULTRASONICS_SENSOR_DETECTION_RANGES 靜態 {<range_min_1>, <range_max_1>, <range_min_2>, <range_max_2>}

感應器支援的偵測範圍陣列 (以毫米為單位,含頭尾)。

ULTRASONICS_SENSOR_DETECTION_RANGES 連續 {<distance>, <distance_error>}

以毫米為單位,感應器測量的距離和距離誤差。如果只支援範圍,這是偵測到的範圍內最短的距離。