Android에서는 기기가 카메라 기기의 동시 스트리밍을 지원할 수 있습니다. 예를 들어, 이를 통해 장치는 동시에 작동하는 전면 및 후면 카메라를 모두 가질 수 있습니다. Android 11부터 Camera2 API에는 카메라가 동시 스트리밍 및 지원되는 스트림 구성을 지원하는지 확인하기 위해 앱이 호출할 수 있는 다음 메서드가 포함됩니다.
-
getConcurrentStreamingCameraIds
: 동시에 카메라 장치 세션 구성을 지원하는 현재 연결된 카메라 장치 식별자의 조합 집합을 가져옵니다. -
isConcurrentSessionConfigurationSupported
: 제공된 카메라 장치 세트와 해당 세션 구성을 동시에 구성할 수 있는지 확인합니다.
동시 스트리밍 중에 지원해야 하는 필수 스트림 조합 집합은 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 0
과 1
을 모두 열어 리소스를 할당하는 방법에 대한 힌트를 카메라 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
호출에 실패해야 합니다.