Android позволяет устройствам поддерживать одновременную потоковую передачу данных с камер. Например, это позволяет устройству одновременно использовать переднюю и заднюю камеры. Начиная с Android 11, Camera2 API включает следующие методы, которые приложения могут вызывать, чтобы определить, поддерживают ли камеры параллельную потоковую передачу и какие конфигурации потоков поддерживаются.
getConcurrentCameraIds: Получает набор комбинаций идентификаторов подключенных камер, которые поддерживают одновременную настройку сеансов камеры.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 | Видеореклама в приложении или обработка с предварительным просмотром |
Устройства с возможностью MONOCHROME (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES включает CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME), поддерживающие Y8, должны поддерживать замену потоков 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;
Реализация
Чтобы приложения могли запрашивать у устройства информацию о том, поддерживают ли его камеры параллельную потоковую передачу, реализуйте интерфейс HAL ICameraProvider@2.6, который включает следующие методы:
Пример реализации интерфейса HAL ICameraProvider@2.6 можно найти в библиотеке HAL эмулируемой камеры по адресу EmulatedCameraProviderHWLImpl.cpp.
Проверка
Чтобы проверить, правильно ли работает эта функция, используйте тест CTS ConcurrentCameraTest.java. Также проведите тестирование с помощью приложения, которое открывает несколько камер и работает с ними одновременно.
Проблемы с распределением ресурсов
Если HAL камеры заявляет о поддержке одновременной работы нескольких камер, могут возникнуть проблемы с распределением ресурсов, особенно если на телефоне достаточно ресурсов процессора обработки изображений (ISP), чтобы одновременно передавать видео с передней и задней (или других) камер, но не на полную мощность. В этом случае HAL камеры должен выделять ограниченные аппаратные ресурсы для каждого устройства камеры.
Пример
Ниже описан сценарий, в котором возникает эта проблема.
Проблема
Устройство имеет следующую конфигурацию:
- Идентификатор камеры
0– это логическая камера, поддерживаемая широкоугольной и сверхширокоугольной камерами, каждая из которых использует один ресурс ISP. - Камера с идентификатором
1использует один ресурс ISP.
Устройство (телефон) подключено к двум интернет-провайдерам. Если открыт идентификатор камеры 0 и настроен сеанс, HAL камеры может зарезервировать два ISP, предполагая использование как сверхширокоугольной, так и широкоугольной камеры.
В этом случае фронтальная камера (идентификатор 1) не может настроить ни одного потока, поскольку оба поставщика услуг интернета используются.
Решение
Чтобы решить эту проблему, фреймворк может открыть оба идентификатора камеры 0 и 1
до настройки сеансов, чтобы предоставить HAL камеры подсказку о том, как
распределять ресурсы (поскольку теперь ожидается одновременная работа камер).
Однако это может привести к ограничению возможностей, например масштабирование может не поддерживать полный диапазон масштабирования (поскольку переключение физических идентификаторов камеры может быть проблематичным).
Чтобы реализовать это решение, внесите следующие изменения в файл provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds.
Для одновременной работы камер фреймворк камеры должен открывать устройства камеры (
@3.2::ICameraDevice::open) перед настройкой сеансов на них. Это позволяет поставщикам камер соответствующим образом распределять ресурсы.Чтобы решить проблему с невозможностью обработки полного диапазона масштабирования, убедитесь, что приложения камеры при одновременном использовании камер гарантированно используют настройку управления
ZOOM_RATIOтолько в диапазоне от 1x доMAX_DIGITAL_ZOOM, а не полнуюZOOM_RATIO_RANGE(это предотвращает переключение физических камер внутри системы, что потенциально требует большего количества ISP).
Проблема с testDualCameraPreview
После внесения указанных выше изменений может возникнуть проблема с поведением, разрешенным тестом MultiViewTest.java#testDualCameraPreview.
Тест testDualCameraPreview не настраивает сеансы только после открытия всех камер. в следующем порядке:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
Однако приложению ERROR_MAX_CAMERAS_IN_USE [1] разрешено не открывать камеру. Сторонние приложения могут зависеть от этого поведения.
Поскольку HAL камеры не будет знать полный набор идентификаторов камер, открытых для одновременной работы, до настройки сеансов, ему может быть сложно выделить аппаратные ресурсы (если за них идет конкуренция).
Чтобы решить эту проблему, необходимо поддерживать обратную совместимость и одновременную передачу данных. Аппаратно-зависимые уровни камеры должны возвращать ошибку openCamera с кодом ERROR_MAX_CAMERAS_IN_USE, если они не могут поддерживать полную конфигурацию потока для всех камер, работающих одновременно.