Перейти на камеру2

На этой странице описаны различия между расширенной системой обзора (EVS) и Camera2. Здесь также описывается, как настроить Camera2.

Откройте и закройте камеру

ЭВС

openCamera совмещает открытие устройства и настройку единого потока.

Камера2

Чтобы открыть и закрыть устройство с помощью Camera2:

  1. Выберите один из этих режимов:

  2. Чтобы настроить потоки, создайте сеанс захвата с соответствующими выходными поверхностями. Например, из ImageReader или SurfaceView с помощью CameraDevice.createCaptureSession() (Java) или ACameraDevice_createCaptureSession() (NDK).

    Camera2 поддерживает одновременную обработку нескольких потоков . Создавайте несколько потоков для таких целей, как предварительный просмотр, запись и обработка изображений. Потоки служат параллельными конвейерами, последовательно обрабатывая необработанные кадры с камеры.

  3. Чтобы закрыть камеру, используйте CameraDevice.close() (Java) или ACameraDevice_close() (NDK).

Рассмотрим эти примеры фрагментов кода:

Ява

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
}

НДК

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

Потоковые данные с камеры

В этом разделе описывается, как передавать потоковые данные с камеры.

ЭВС

На EVS, чтобы:

  1. Чтобы начать потоковую передачу, используйте startVideoStream .
  2. Остановите потоковую передачу, используя stopVideoStream .

Камера2

На Camera2, чтобы:

  1. Создайте CaptureRequest , подходящий для предварительного просмотра, используйте TEMPLATE_PREVIEW с CameraDevice.createCaptureRequest() в Java или ACameraDevice_createCaptureRequest() в NDK.

  2. Отправьте запрос на непрерывную потоковую передачу, используя CameraCaptureSession.setSingleRepeatingRequest (Java) или ACameraCaptureSession_setRepeatingRequestV2 (NDK).

  3. Остановите потоковую передачу, используйте CameraCaptureSession.stopRepeating (Java) или ACameraCaptureSession_stopRepeating (NDK).

Управление буфером

  • В EVS setMaxFramesInFlight ранее контролировал количество буферов, которое потенциально могло изменяться во время трансляции. При запуске потоковой передачи с камеры EVS предоставлял идентификатор буфера для каждого кадра изображения, который соответствовал тому же адресу аппаратного буфера в памяти.

  • На камере Camera2 максимальное количество изображений для AImageReader или ImageReader задаётся с помощью AImageReader_new или ImageReader.newInstance при инициализации сеанса. Это значение нельзя динамически изменить после начала сеанса. Чтобы получить идентификатор буфера для каждого кадра, клиенты могут поддерживать карту, которая сопоставляет адрес аппаратного буфера, полученный из объекта Image , с уникальным идентификатором.

Приостановка и возобновление трансляции

  • EVS использовал pauseVideoStream и resumeVideoStream .

  • У Camera2 нет прямых аналогов. Вместо этого:

Параметры камеры

  • EVS использовал методы, такие как setIntParameter для изменения параметра запроса захвата камеры.

  • На Camera2 для изменения параметров вызовите API набора для конструктора CaptureRequest , а затем отправьте его.

Рассмотрим эти примеры кода:

Ява

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

НДК

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

Логические камеры

  • EVS: Для логических камер, таких как Surround View, EVS Manager открывал все связанные физические камеры, инициировал видеопотоки и предоставлял связный массив изображений.

  • Camera2: Если необходимы аналогичные функции с Camera2, приложения должны управлять логическими камерами, для чего вам необходимо:

    • Определите физические подкамеры, связанные с логической камерой.
    • Откройте каждую необходимую физическую камеру.
    • Инициировать трансляции на каждой камере.
    • При необходимости синхронизируйте кадры. Оптимально, чтобы это было реализовано на уровне HAL для аппаратной синхронизации.

Мы предоставим существующим клиентам EVS библиотеку совместимости (слой-прокладку) для облегчения перехода. Цель — обеспечить поддержку API Camera2 с минимальными изменениями в коде.

Разрешения

ЭВС

Доступ ограничен привилегированными уникальными идентификаторами (UID). Например, AID_AUTOMOTIVE_EVS . Устаревшие разрешения включают android.car.permission.USE_CAR_EVS_CAMERA .

Камера2

Для Camera2 требуется android.permission.CAMERA . Для особых случаев:

  • android.permission.SYSTEM_CAMERA : для доступа к камерам, скрытым от сторонних приложений. Также требуется разрешение CAMERA . Подробнее см. в разделе «Системные камеры» .

  • android.permission.CAMERA_HEADLESS_SYSTEM_USER : Разрешает доступ User 0 , что критически важно для таких служб, как камеры заднего вида, которые должны работать через пользовательские коммутаторы. Требуется предварительно предоставленное разрешение CAMERA.

  • android.permission.CAMERA_PRIVACY_ALLOWLIST : позволяет OEM-производителям исключать определенные критически важные для безопасности приложения из контролируемого пользователем переключения конфиденциальности камеры.

Приложения для камер, критически важные для безопасности, должны соответствовать встроенным политикам Google по предварительному предоставлению лицензий, изложенным в документе Design for Driving .

Первичные и вторичные клиенты

Для общего доступа к камере:

  • EVS предлагал явные API-интерфейсы setPrimaryClient и forcePrimaryClient для управления основным клиентом, который имел полномочия изменять параметры.

  • Camera2: при открытии камеры в режиме общего доступа (Android 16 и выше) приоритет клиента, обращающегося к камере, определяет основной клиент. Клиент с наивысшим приоритетом (обычно приложение переднего плана) может изменять параметры запроса на захват. Для принудительного переключения в основной статус не используются прямые API. Основной статус управляется фреймворком.

Системные камеры

Чтобы разрешить доступ к камере только системным приложениям или приложениям 1P, объявите разрешение ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA в HAL-уровне камеры для этого устройства. Для подключения к этой камере у клиентов должно быть разрешение android.permission.SYSTEM_CAMERA в дополнение к android.permission.CAMERA .

CarEVSManager и CarEVSService

Для доступа к API приложения Java должны использовать стандартный android.hardware.camera2.CameraManager вместо CarEVSManager .

Для камеры заднего вида логика CarEVSService , которая отслеживает свойство GEAR_SELECTION VHAL и запускает действие, должна быть перенесена в приложение, принадлежащее OEM-производителю. Это приложение:

  • Контролирует свойство GEAR_SELECTION VHAL.
  • Включает камеру заднего вида при включении задней передачи.
  • Использует API Camera2 для отображения потока с камеры.

Для обеспечения постоянного и беспрепятственного отображения камеры заднего вида, особенно во время переключения пользователя или когда другие приложения могут загораживать предварительный просмотр, мы рекомендуем следующие рекомендации при реализации функциональности камеры заднего вида с помощью Camera2:

Отображение рендеринга

Обслуживание дисплеев EVS и автомобильных дисплеев.

Они устарели.

Камера2

Используйте стандартные методы рендеринга Android с Surface, android.hardware.display.DisplayManager и android.view.Display .

Для сценариев, требующих раннего отображения камеры, Camera2 ImageReader может обеспечить прямой доступ к аппаратному буферу, что позволяет интегрировать его с существующими реализациями отображения на основе DRM для рендеринга.

Такой ранний доступ к камерам разрешен исключительно привилегированным клиентам, имеющим AID_AUTOMOTIVE_EVS_UID , и ограничен системными камерами, расположенными снаружи транспортного средства.

Эмулятор HAL (EVS mock HAL)

Мы планируем прекратить поддержку EVS Mock HAL . Вместо этого OEM-производителям следует использовать эмулируемый HAL-файл камеры Camera2, 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 взаимодействовать со службой Emulated Camera HAL.

V4L2 UVC-камера HAL

Мы планируем прекратить поддержку EVS V4L2 HAL . Используйте поддержку внешней камеры Camera2 для USB-камер (UVC). Подробнее см. в разделе Внешние USB-камеры .

Ранний доступ к камере

Доступ к камере EVS был ограничен привилегированным клиентам с идентификатором AID_AUTOMOTIVE_EVS . Доступ к камере до завершения загрузки Android возможен при условии, что идентификатор останется AID_AUTOMOTIVE_EVS . Однако ранний доступ к камере ограничен системными камерами, расположенными снаружи автомобиля.

Ультразвуковые API

Мы планируем прекратить поддержку API EVS Ultrasonics. Вместо этого используйте свойства VHAL, представленные в Android 15 для обнаружения ультразвуковых датчиков.

Свойство Тип Определение
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>}

Расстояние, измеренное датчиком, и его погрешность (в миллиметрах). Если поддерживается только диапазон, это минимальное расстояние в обнаруженном диапазоне.