В Android 9 появилась поддержка API для устройств с несколькими камерами благодаря новому логическому устройству камеры, состоящему из двух или более физических камер, направленных в одном направлении. Логическое устройство камеры предоставляется приложению как единый объект CameraDevice/CaptureSession, что позволяет взаимодействовать с интегрированными в HAL функциями многокамерной съемки. Приложения могут дополнительно получать доступ к базовым потокам данных с физических камер, метаданным и элементам управления, а также управлять ими.

Рисунок 1. Поддержка нескольких камер.
На этой диаграмме разные идентификаторы камер обозначены разными цветами. Приложение может одновременно передавать необработанные буферы с каждой физической камеры. Также возможно установить отдельные элементы управления и получать отдельные метаданные с разных физических камер.
Примеры и источники
Устройства с несколькими камерами должны рекламироваться с указанием логической возможности работы с несколькими камерами .
Клиенты камеры могут запросить идентификаторы физических устройств, из которых состоит конкретная логическая камера, вызвав метод getPhysicalCameraIds() . Возвращаемые в результате идентификаторы затем используются для управления отдельными физическими устройствами с помощью setPhysicalCameraId() . Результаты таких отдельных запросов можно получить из полного результата, вызвав getPhysicalCameraResults() .
Отдельные запросы к физической камере могут поддерживать лишь ограниченный набор параметров. Чтобы получить список поддерживаемых параметров, разработчики могут вызвать getAvailablePhysicalCameraRequestKeys() .
Поддержка потоковой передачи с физических камер доступна только для запросов, не требующих повторной обработки, и только для монохромных и байеровских сенсоров.
Выполнение
Контрольный список поддержки
Для добавления логических многокамерных устройств на стороне HAL:
- Добавьте возможность
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERAдля любого логического устройства камеры, поддерживающего две или более физических камер, которые также доступны приложению. - Заполните статическое поле метаданных
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDSсписком физических идентификаторов камер. - Заполните статические метаданные, связанные с глубиной, необходимые для корреляции между пикселями физических потоков с камер:
ANDROID_LENS_POSE_ROTATION,ANDROID_LENS_POSE_TRANSLATION,ANDROID_LENS_INTRINSIC_CALIBRATION,ANDROID_LENS_DISTORTION,ANDROID_LENS_POSE_REFERENCE. Установите статическое поле метаданных
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPEв следующее значение:-
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE: Для датчиков в режиме "главный-главный" аппаратная синхронизация затвора/экспозиции отсутствует. -
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED: Для датчиков в режиме основной-дополнительной камеры — аппаратная синхронизация затвора/экспозиции.
-
Заполните
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYSсписком поддерживаемых параметров для отдельных физических камер. Список может быть пустым, если логическое устройство не поддерживает отдельные запросы.Если поддерживаются индивидуальные запросы, обработайте и примените отдельные
physicalCameraSettings, которые могут поступать в составе запросов на захват изображения, и добавьте соответствующие метаданныеphysicalCameraMetadata.Для устройств Camera HAL версий 3.5 (представленных в Android 10) и выше заполните результирующий ключ
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID, используя идентификатор текущей активной физической камеры, поддерживающей логическую камеру.
Для устройств под управлением Android 9 камера должна поддерживать замену одного логического потока YUV или RAW физическими потоками того же размера (не относится к потокам RAW) и того же формата с двух физических камер. Это не относится к устройствам под управлением Android 10.
Для устройств под управлением Android 10, где версия HAL камеры 3.5 или выше, камера должна поддерживать isStreamCombinationSupported чтобы приложения могли запрашивать информацию о поддержке определенной комбинации потоков, содержащей физические потоки.
Карта конфигурации потока
Для логической камеры обязательные комбинации потоков для устройства камеры определенного аппаратного уровня совпадают с требованиями, указанными в CameraDevice.createCaptureSession . Все потоки в карте конфигурации потоков должны быть логическими потоками.
Для логического устройства камеры, поддерживающего работу в формате RAW с физическими субкамерами разных размеров, если приложение настраивает логический RAW-поток, логическое устройство камеры не должно переключаться на физические субкамеры с разными размерами сенсоров. Это гарантирует, что существующие приложения для захвата RAW-файлов не будут работать некорректно.
Чтобы воспользоваться преимуществами оптического зума, реализованного в HAL, путем переключения между физическими субкамерами во время съемки в формате RAW, приложениям необходимо настраивать потоки данных физических субкамер вместо логического потока RAW.
Гарантированное сочетание потоков
Как логическая камера, так и базовые физические камеры должны гарантировать обязательные комбинации потоков, необходимые для соответствующих уровней устройства.
Логическое устройство камеры должно работать так же, как и физическое устройство камеры, исходя из уровня его аппаратного обеспечения и возможностей. Рекомендуется, чтобы его набор функций был шире, чем у отдельных физических камер.
На устройствах под управлением Android 9 для каждой гарантированной комбинации потоков логическая камера должна поддерживать:
Замена одного логического потока YUV_420_888 или необработанного потока двумя физическими потоками того же размера и формата, каждый из которых поступает с отдельной физической камеры, при условии, что размер и формат поддерживаются физическими камерами.
Если логическая камера не поддерживает формат RAW, а физические камеры поддерживают, можно добавить два необработанных потока, по одному от каждой физической камеры. Обычно это происходит, когда физические камеры имеют разные размеры сенсоров.
Использование физических потоков вместо логического потока того же размера и формата. Это не должно замедлять частоту кадров при захвате, если минимальная длительность кадра физического и логического потоков одинакова.
Вопросы производительности и энергопотребления
Производительность:
- Настройка и потоковая передача физических видеопотоков могут замедлить скорость захвата данных логической камерой из-за ограничений ресурсов.
- Применение физических настроек камеры может замедлить скорость захвата изображения, если используемые камеры настроены на разную частоту кадров.
Власть:
- Функция оптимизации энергопотребления HAL продолжает работать и в режиме по умолчанию.
- Настройка или запрос физических потоков может переопределить внутреннюю оптимизацию энергопотребления HAL и привести к увеличению потребления энергии.
Настройка
Вы можете настроить реализацию своего устройства следующими способами.
- Сводный выходной сигнал логического устройства камеры полностью зависит от реализации HAL. Решение о том, как формируются сводный логический поток от физических камер, прозрачно для приложения и платформы камеры Android.
- Возможна опциональная поддержка отдельных физических запросов и результатов. Набор доступных параметров в таких запросах также полностью зависит от конкретной реализации HAL.
- Начиная с Android 10, HAL может уменьшить количество камер, которые приложение может открыть напрямую, отказавшись от объявления некоторых или всех PHYSICAL_ID в
getCameraIdList. В этом случае вызовgetPhysicalCameraCharacteristicsдолжен возвращать характеристики физической камеры.
Проверка
Устройства с логической многокамерной архитектурой должны проходить проверку CTS (Camera Test) так же, как и любые другие обычные камеры. Тестовые примеры, предназначенные для этого типа устройств, можно найти в модуле LogicalCameraDeviceTest .
Эти три теста ITS предназначены для проверки многокамерных систем и позволяют корректно объединять изображения:
-
scene1/test_multi_camera_match.py -
scene4/test_multi_camera_alignment.py -
sensor_fusion/test_multi_camera_frame_sync.py
Тесты для сцены 1 и сцены 4 выполняются с использованием тестового стенда ITS-in-a-box . Тест test_multi_camera_match проверяет, совпадает ли яркость центра изображений при одновременном включении обеих камер. Тест test_multi_camera_alignment проверяет правильность загрузки расстояний между камерами, их ориентации и параметров искажения. Если многокамерная система включает камеру с широким углом обзора (>90°), требуется версия ITS box rev2.
Sensor_fusion — это второй тестовый стенд, который позволяет многократно выполнять заданные движения телефона и проверяет совпадение временных меток гироскопа и датчика изображения, а также синхронизацию кадров с нескольких камер.
Все коробки можно приобрести у компаний AcuSpec, Inc. ( www.acuspecinc.com , fred@acuspecinc.com) и MYWAY Manufacturing ( www.myway.tw , sales@myway.tw). Кроме того, коробку ITS версии 1 можно приобрести у компании West-Mark ( www.west-mark.com , dgoodman@west-mark.com).
Передовые методы
Чтобы в полной мере использовать возможности многокамерной системы, сохраняя при этом совместимость с приложениями, следуйте этим рекомендациям при внедрении логического многокамерного устройства:
- (Android 10 или выше) Скрыть физические субкамеры из
getCameraIdList. Это уменьшает количество камер, которые могут быть напрямую открыты приложениями, устраняя необходимость в сложной логике выбора камеры. - (Android 11 или выше) Для логического многокамерного устройства, поддерживающего оптический зум, реализуйте API
ANDROID_CONTROL_ZOOM_RATIOи используйтеANDROID_SCALER_CROP_REGIONтолько для обрезки по пропорциям.ANDROID_CONTROL_ZOOM_RATIOпозволяет устройству уменьшать масштаб и поддерживать более высокую точность. В этом случае HAL должен скорректировать систему координатANDROID_SCALER_CROP_REGION,ANDROID_CONTROL_AE_REGIONS,ANDROID_CONTROL_AWB_REGIONS,ANDROID_CONTROL_AF_REGIONS,ANDROID_STATISTICS_FACE_RECTANGLESиANDROID_STATISTICS_FACE_LANDMARKS, чтобы рассматривать поле зрения после увеличения как активный массив датчиков. Для получения дополнительной информации о том, какANDROID_SCALER_CROP_REGIONвзаимодействует сANDROID_CONTROL_ZOOM_RATIO, см.camera3_crop_reprocess#cropping. - Для многокамерных устройств с физическими камерами, обладающими различными возможностями, убедитесь, что устройство заявляет о поддержке определенного значения или диапазона для элемента управления только в том случае, если весь диапазон масштабирования поддерживает это значение или диапазон. Например, если логическая камера состоит из сверхширокоугольной, широкоугольной и телеобъективной камер, выполните следующие действия:
- Если размеры активных массивов физических камер различаются, HAL камеры должен выполнить сопоставление активных массивов физических камер с активным массивом логической камеры для параметров
ANDROID_SCALER_CROP_REGION,ANDROID_CONTROL_AE_REGIONS,ANDROID_CONTROL_AWB_REGIONS,ANDROID_CONTROL_AF_REGIONS,ANDROID_STATISTICS_FACE_RECTANGLESиANDROID_STATISTICS_FACE_LANDMARKSтаким образом, чтобы с точки зрения приложения система координат соответствовала размеру активного массива логической камеры. - Если широкоугольная и телеобъективная камеры поддерживают автофокусировку, но сверхширокоугольная камера имеет фиксированный фокус, убедитесь, что логическая камера сообщает о поддержке автофокусировки. HAL должен имитировать конечный автомат автофокусировки для сверхширокоугольной камеры, чтобы при уменьшении масштаба приложения до сверхширокоугольного объектива тот факт, что базовая физическая камера имеет фиксированный фокус, был незаметен для приложения, и конечные автоматы автофокусировки для поддерживаемых режимов автофокусировки работали должным образом.
- Если широкоугольная и телеобъективная камеры поддерживают 4K при 60 кадрах в секунду, а сверхширокоугольная камера поддерживает только 4K при 30 кадрах в секунду или 1080p при 60 кадрах в секунду, но не 4K при 60 кадрах в секунду, убедитесь, что логическая камера не указывает поддержку 4K при 60 кадрах в секунду в поддерживаемых конфигурациях потока. Это гарантирует целостность возможностей логической камеры, обеспечивая отсутствие проблем с достижением 4K при 60 кадрах в секунду при значении
ANDROID_CONTROL_ZOOM_RATIOменьше 1.
- Если размеры активных массивов физических камер различаются, HAL камеры должен выполнить сопоставление активных массивов физических камер с активным массивом логической камеры для параметров
- В Android 10 и более поздних версиях для поддержки комбинаций потоков, включающих физические потоки, не требуется логическая многокамерная система. Если HAL поддерживает комбинацию с физическими потоками:
- (Android 11 или выше) Для более эффективной обработки таких сценариев использования, как определение глубины с помощью стереосъемки и отслеживание движения, сделайте поле зрения физических выходных потоков максимально большим, насколько это позволяет оборудование. Однако, если физический поток и логический поток исходят с одной и той же физической камеры, ограничения оборудования могут привести к тому, что поле зрения физического потока будет таким же, как и у логического потока.
- Для решения проблемы нехватки памяти, вызванной наличием нескольких физических потоков, убедитесь, что приложения используют
discardFreeBuffersдля освобождения свободных буферов (буферов, освобожденных потребителем, но еще не извлеченных из очереди производителем), если ожидается, что физический поток будет простаивать в течение определенного периода времени. - Если физические потоки с разных физических камер обычно не прикрепляются к одному и тому же запросу, убедитесь, что приложения используют
surface group, чтобы одна буферная очередь использовалась для поддержки двух поверхностей, обращенных к приложению, что позволит снизить потребление памяти.