동시 카메라 스트리밍

Android에서는 기기가 카메라 기기의 동시 스트리밍을 지원할 수 있습니다. 예를 들어, 이를 통해 장치는 동시에 작동하는 전면 및 후면 카메라를 모두 가질 수 있습니다. Android 11부터 Camera2 API에는 카메라가 동시 스트리밍 및 지원되는 스트림 구성을 지원하는지 확인하기 위해 앱이 호출할 수 있는 다음 메서드가 포함됩니다.

동시 스트리밍 중에 지원해야 하는 필수 스트림 조합 집합은 SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS 속성에 있는 카메라 장치의 카메라 특성을 통해 포함됩니다.

getConcurrentStreamingCameraIds() 를 통해 보급된 각 카메라 장치는 동시 스트림에 대해 다음과 같은 보장된 구성을 지원해야 합니다.

대상 1 타겟 2
유형 최대 크기 유형 최대 크기 샘플 사용 사례
YUV s1440p 인앱 비디오 또는 이미지 처리
사립 s1440p 인앱 뷰파인더 분석
JPEG s1440p 뷰파인더 정지 이미지 캡처 없음
YUV / PRIV s720p JPEG s1440p 표준 스틸 이미지
YUV / PRIV s720p YUV / PRIV s1440p 인앱 비디오 또는 미리보기로 처리

Y8을 지원하는 MONOCHROME 기능( CameraCharacteristics# CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES 포함 CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME )이 있는 기기는 보장된 모든 스트림 조합에서 YUV 스트림을 Y8로 대체하는 것을 지원해야 합니다.

s720p 는 720p(1280 x 720) 또는 StreamConfigurationMap.getOutputSizes() 에서 반환된 특정 형식에 대해 지원되는 최대 해상도를 나타냅니다. s1440p 는 1440p(1920 x 1440) 또는 StreamConfigurationMap.getOutputSizes() 에서 반환된 특정 형식에 대해 지원되는 최대 해상도를 나타냅니다. 기능에 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE 이 포함되지 않은 장치는 동시 작업 중에 sVGA 해상도가 있는 Dataspace::DEPTH 단일 Y16 스트림을 지원해야 합니다. 여기서 sVGA는 다음 두 해상도 중 더 작은 것입니다.

  • 주어진 형식에 대한 최대 출력 해상도
  • 640 x 480

구현

앱이 기기를 쿼리하여 카메라가 동시 스트리밍을 지원하는지 확인하려면 다음 메서드가 포함된 ICameraProvider@2.6 HAL 인터페이스를 구현하세요.

ICameraProvider@2.6 HAL 인터페이스의 참조 구현은 EmulatedCameraProviderHWLImpl.cpp 에서 에뮬레이트된 카메라 HAL 라이브러리를 참조하세요.

확인

이 기능의 구현이 의도한 대로 작동하는지 테스트하려면 ConcurrentCameraTest.java CTS 테스트를 사용하십시오. 또한 여러 대의 카메라를 열고 동시에 작동하는 앱을 사용하여 테스트하십시오.

리소스 할당 문제

카메라 HAL이 카메라 장치의 동시 작동 지원을 광고하면 특히 전면 및 후면(또는 기타) 카메라를 동시에 스트리밍할 수 있는 충분한 이미지 신호 프로세서(ISP) 리소스가 전화기에 있는 경우 리소스 할당 문제가 발생할 수 있습니다. , 그러나 최대 용량은 아닙니다. 이 경우 카메라 HAL은 각 카메라 장치에 제한된 하드웨어 리소스를 할당해야 합니다.

예시 시나리오

다음 시나리오에서는 이 문제를 보여 줍니다.

문제

장치의 구성은 다음과 같습니다.

  • 카메라 ID 0 은 각각 하나의 ISP 리소스를 사용하는 광각 및 초광각 카메라가 지원하는 논리적 카메라입니다.
  • 카메라 ID 1 은 하나의 ISP 리소스를 사용하는 카메라입니다.

장치(전화)에는 2개의 ISP가 있습니다. 카메라 ID 0 이 열리고 세션이 구성된 경우 카메라 HAL은 초광각 및 광각 카메라 사용을 모두 예상하는 두 개의 ISP를 예약할 수 있습니다.

이 경우 두 ISP가 모두 사용 중이므로 전면 카메라(ID 1 )에서 스트림을 구성할 수 없습니다.

해결책

이 문제를 해결하기 위해 프레임워크는 세션을 구성하기 전에 카메라 ID 01 을 모두 열어 리소스를 할당하는 방법에 대한 힌트를 카메라 HAL에 제공할 수 있습니다(이제 카메라의 동시 작동이 예상되기 때문에). 그러나 이로 인해 기능이 제한될 수 있습니다. 예를 들어 줌이 전체 줌 범위 비율을 처리하지 못할 수 있습니다(물리적 카메라 ID를 전환하는 것이 문제가 될 수 있기 때문).

이 솔루션을 구현하려면 provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds 를 다음과 같이 업데이트합니다.

  • 카메라의 동시 작동을 위해 카메라 프레임워크는 카메라 장치에서 세션을 구성하기 전에 카메라 장치( @3.2::ICameraDevice::open )를 열어야 합니다. 이를 통해 카메라 공급자는 그에 따라 리소스를 할당할 수 있습니다.

  • 전체 줌 범위 비율을 처리할 수 없는 문제를 해결하려면 카메라 앱이 카메라를 동시에 사용할 때 전체 ZOOM_RATIO_RANGE 대신 1x와 MAX_DIGITAL_ZOOM 사이의 ZOOM_RATIO 제어 설정을 사용하도록 보장해야 합니다(이렇게 하면 물리적 카메라 내부에 더 많은 ISP가 필요할 수 있음).

testDualCameraPreview 문제

위의 업데이트를 수행하면 MultiViewTest.java#testDualCameraPreview 테스트에서 허용하는 동작에 문제가 발생할 수 있습니다.

testDualCameraPreview 테스트는 모든 카메라를 연 후에만 세션을 구성하지 않습니다. 다음 순서를 따릅니다.

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

그러나 ERROR_MAX_CAMERAS_IN_USE [1] 로 카메라 열기 실패를 허용합니다. 타사 앱은 이 동작에 의존할 수 있습니다.

카메라 HAL은 세션을 구성하기 전에 동시 작업을 위해 열리는 전체 카메라 ID 세트를 알지 못하기 때문에 하드웨어 리소스를 할당하기 어려울 수 있습니다(일부 경쟁이 있다고 가정).

이 문제를 해결하고 동시 스트리밍을 지원하는 것 외에도 이전 버전과의 호환성을 유지하려면 카메라 HAL이 동시에 실행되는 모든 카메라에 대한 전체 스트림 구성을 지원할 수 없는 경우 ERROR_MAX_CAMERAS_IN_USE 와 함께 openCamera 호출에 실패해야 합니다.