Android는 기기가 카메라 기기의 동시 스트리밍을 지원할 수 있게 합니다. 예를 들어 기기의 전면 카메라와 후면 카메라를 동시에 작동할 수 있습니다. Android 11부터 Camera2 API에는 카메라가 동시 스트리밍을 지원하는지 여부와 지원하는 스트림 구성을 확인하기 위해 앱이 호출할 수 있는 다음과 같은 메서드가 포함되어 있습니다.
getConcurrentStreamingCameraIds
: 다수의 카메라 기기 세션 구성을 동시에 지원하는, 현재 연결된 카메라 기기 식별자의 조합을 가져옵니다.isConcurrentSessionConfigurationSupported
: 제공된 카메라 기기 세트 및 상응하는 세션 구성을 동시에 설정할 수 있는지를 확인합니다.
동시 스트리밍 중에 지원해야 하는 필수 스트림 조합 집합은 SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
속성에서 카메라 기기의 카메라 특성을 통해 포함됩니다.
getConcurrentStreamingCameraIds()
를 통해 공지된 각 카메라 기기는 동시 스트림을 위해 다음과 같은 보장된 구성을 지원해야 합니다.
타겟 1 | 타겟 2 | |||
---|---|---|---|---|
유형 | 최대 크기 | 유형 | 최대 크기 | 샘플 사용 사례 |
YUV | s1440p | 인앱 동영상 또는 이미지 처리 | ||
PRIV | s1440p | 인앱 뷰파인더 분석 | ||
JPEG | s1440p | 뷰파인더 정지 이미지 캡처 없음 | ||
YUV/PRIV | s720p | JPEG | s1440p | 표준 정지 이미지 |
YUV/PRIV | s720p | YUV/PRIV | s1440p | 인앱 동영상 또는 미리보기로 처리 |
Y8을 지원하는 MONOCHROME
기능 포함 기기(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
이 포함되지 않는 기기는 동시 작업 중에 최소한 단일 Y16 스트림 Dataspace::DEPTH
를 sVGA 해상도로 지원해야 합니다(여기서 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 리소스 하나를 사용하는 카메라입니다.
기기(휴대전화)에 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은 동시에 실행하는 모든 카메라에 관해 전체 스트림 구성을 지원할 수 없는 경우 openCamera
호출에 실패하고 ERROR_MAX_CAMERAS_IN_USE
를 사용합니다.