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