Camera2로 이전

이 페이지에서는 확장 뷰 시스템 (EVS)과 Camera2의 차이점을 설명합니다. 또한 Camera2 구현을 설정하는 방법을 설명합니다.

카메라 열기 및 닫기

EVS

openCamera는 기기 열기와 단일 스트림 구성을 결합합니다.

Camera2

Camera2로 기기를 열고 닫으려면 다음을 실행하세요.

  1. 다음 모드 중 하나를 선택합니다.

  2. 스트림을 구성하려면 관련 출력 표면으로 캡처 세션을 만드세요. 예를 들어 CameraDevice.createCaptureSession() (Java) 또는 ACameraDevice_createCaptureSession() (NDK)이 있는 ImageReader 또는 SurfaceView에서 가져옵니다.

    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
}

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에서는 CameraDevice.createCaptureRequest()와 함께 TEMPLATE_PREVIEW를 사용하거나 NDK에서는 ACameraDevice_createCaptureRequest()를 사용합니다.

  2. 지속적 스트리밍 요청을 제출하려면 CameraCaptureSession.setSingleRepeatingRequest (Java) 또는 ACameraCaptureSession_setRepeatingRequestV2 (NDK)을 사용합니다.

  3. 스트리밍을 중지하고 CameraCaptureSession.stopRepeating (Java) 또는 ACameraCaptureSession_stopRepeating (NDK)을 사용합니다.

버퍼 관리

  • EVS에서 setMaxFramesInFlight는 이전에 버퍼 수를 제어했으며 스트림 중간에 변경될 수 있었습니다. 카메라 스트리밍이 시작되면 EVS는 각 이미지 프레임에 버퍼 ID를 제공했으며 이는 메모리의 동일한 하드웨어 버퍼 주소와 관련이 있었습니다.

  • Camera2에서 AImageReader 또는 ImageReader의 최대 이미지 수는 세션이 초기화될 때 AImageReader_new 또는 ImageReader.newInstance로 설정됩니다. 세션이 시작된 후에는 동적으로 변경할 수 없습니다. 각 프레임의 버퍼 ID를 가져오기 위해 클라이언트는 Image 객체에서 가져온 하드웨어 버퍼 주소를 고유 식별자와 상호 연관시키는 맵을 유지할 수 있습니다.

스트리밍 일시중지 및 재개

  • EVS는 pauseVideoStreamresumeVideoStream을 사용했습니다.

  • Camera2에는 직접 상응하는 항목이 없습니다. 다음과 같은 경우에만 사용하세요.

카메라 매개변수

  • EVS는 setIntParameter과 같은 메서드를 사용하여 카메라 캡처 요청 매개변수를 변경했습니다.

  • Camera2에서 매개변수를 수정하려면 CaptureRequest 빌더set API를 호출한 다음 제출합니다.

다음 코드 샘플을 살펴보세요.

자바

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

액세스는 권한이 있는 고유 식별자 (UID)로 제한됩니다. 예를 들면 AID_AUTOMOTIVE_EVS입니다. 지원 중단된 권한에는 android.car.permission.USE_CAR_EVS_CAMERA이 포함됩니다.

Camera2

Camera2에는 android.permission.CAMERA이 필요합니다. 특수한 경우:

안전이 중요한 카메라 앱은 운전용 설계에 제공된 Google 내장 권한 부여 전 정책을 따라야 합니다.

기본 및 보조 클라이언트

공유 카메라 액세스의 경우:

  • EVS는 매개변수를 수정할 권한이 있는 기본 클라이언트를 관리하기 위해 명시적 API인 setPrimaryClientforcePrimaryClient를 제공했습니다.

  • 카메라가 공유 모드 (Android 16 이상)로 열리면 카메라에 액세스하는 클라이언트의 우선순위에 따라 기본 클라이언트가 결정됩니다. 우선순위가 가장 높은 클라이언트 (일반적으로 포그라운드 앱)는 캡처 요청 매개변수를 수정할 수 있습니다. 기본 상태를 강제하는 데 사용되는 직접 API는 없습니다. 기본 상태는 프레임워크에서 관리합니다.

시스템 카메라

시스템 또는 1P 앱에서 액세스할 수 있도록 카메라 기기를 제한하려면 해당 기기의 카메라 HAL에서 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA 기능을 선언하세요. 클라이언트는 이 카메라 기기에 연결되는 android.permission.CAMERA 외에 android.permission.SYSTEM_CAMERA도 있어야 합니다.

CarEVSManager 및 CarEVSService

API 액세스의 경우 Java 앱은 CarEVSManager 대신 표준 android.hardware.camera2.CameraManager을 사용해야 합니다.

후방 카메라의 경우 GEAR_SELECTION VHAL 속성을 모니터링하고 활동을 실행하는 CarEVSService의 로직을 OEM 소유 앱으로 이전해야 합니다. 이 앱은 다음을 충족해야 합니다.

  • GEAR_SELECTION VHAL 속성을 모니터링합니다.
  • 후진 기어가 체결되면 후방 카메라 활동을 실행합니다.
  • Camera2 API를 사용하여 카메라 피드를 표시합니다.

특히 사용자 전환 중이나 다른 앱이 미리보기를 가릴 수 있는 경우 후방 카메라를 일관되고 방해받지 않는 방식으로 표시하려면 Camera2로 후방 카메라 기능을 구현할 때 다음 가이드라인을 따르는 것이 좋습니다.

디스플레이 렌더링

EVS 디스플레이 및 자동차 디스플레이 서비스

이러한 기능은 지원이 중단되었습니다.

Camera2

Surface, android.hardware.display.DisplayManager, android.view.Display와 함께 표준 Android 렌더링 메서드를 사용합니다.

카메라를 일찍 표시해야 하는 시나리오의 경우 Camera2 ImageReader는 하드웨어 버퍼에 직접 액세스할 수 있으므로 렌더링을 위해 기존 DRM 기반 디스플레이 구현과 통합할 수 있습니다.

이러한 초기 카메라 액세스는 AID_AUTOMOTIVE_EVS_UID가 있는 권한이 있는 클라이언트에만 허용되며 차량 외부에 있는 시스템 카메라로 제한됩니다.

에뮬레이터 HAL (EVS 모의 HAL)

EVS 모의 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

cameraserver가 에뮬레이트된 카메라 HAL 서비스와 상호작용할 수 있도록 적절한 보안 강화 Linux (SELinux) 정책도 필요합니다.

V4L2 UVC 카메라 HAL

EVS V4L2 HAL이 지원 중단될 예정입니다. USB 카메라 (UVC)에 Camera2 외부 카메라 지원 사용 자세한 내용은 외부 USB 카메라를 참고하세요.

카메라 사전 액세스

EVS 카메라 액세스는 AID_AUTOMOTIVE_EVS UID가 있는 권한이 있는 클라이언트로 제한되었습니다. Android 부팅 프로세스가 완료되기 전 카메라 액세스(UID가 AID_AUTOMOTIVE_EVS로 유지되는 경우) 하지만 초기 카메라 액세스는 차량 외부에 있는 시스템 카메라로 제한됩니다.

초음파 API

EVS 초음파 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>}

밀리미터 단위의 센서 측정 거리 및 거리 오류입니다. 범위만 지원되는 경우 감지된 범위의 최소 거리입니다.