Данный файл распространяется под лицензией Apache License, Version 2.0 («Лицензия»); вы не можете использовать этот файл иначе, чем в соответствии с условиями Лицензии. Вы можете получить копию Лицензии по адресу:
http://www.apache.org/licenses/LICENSE-2.0
Если иное не требуется применимым законодательством или не согласовано в письменной форме, программное обеспечение, распространяемое в соответствии с настоящей Лицензией, распространяется на условиях «КАК ЕСТЬ», без каких-либо гарантий или условий, явных или подразумеваемых. См. настоящую Лицензию для получения информации о конкретных условиях и ограничениях, предусмотренных настоящей Лицензией.
Платформа Android поддерживает использование USB-камер (то есть веб-камер) по принципу Plug-and-Play, используя стандартный API Android Camera2 и интерфейс HAL камеры. Веб-камеры, как правило, поддерживают драйверы USB Video Class (UVC) , а в Linux для управления UVC-камерами используется стандартный драйвер Video4Linux (V4L) .
Благодаря поддержке веб-камер устройства можно использовать в несложных сценариях, таких как видеочаты и фотокиоски. Эта функция не заменяет стандартные внутренние HAL-модули камер на телефонах Android и не предназначена для поддержки ресурсоемких, сложных задач, связанных с потоковой передачей данных в высоком разрешении и на высокой скорости, дополненной реальностью, а также ручным управлением ISP/датчиком/объективом.
Процесс HAL USB-камеры является частью внешнего поставщика камеры, который отслеживает доступность USB-устройств и соответствующим образом перечисляет внешние камеры. Этот процесс имеет разрешения и политику SE, аналогичные встроенному процессу HAL камеры. Сторонним приложениям для веб-камер, которые взаимодействуют напрямую с USB-устройствами, требуются те же разрешения камеры для доступа к устройствам UVC, что и любому обычному приложению камеры.
Примеры и источники
Для получения дополнительной информации о реализации USB-камер см. эталонную реализацию поставщика внешних камер в ExternalCameraProvider . Реализации внешнего устройства камеры и сессии включены в ExternalCameraDevice и ExternalCameraDeviceSession . Начиная с уровня API 28, API клиента Java включает в себя аппаратный уровень EXTERNAL .
Выполнение
Реализация должна поддерживать системную функцию android.hardware.usb.host .
Необходимо также включить поддержку UVC-устройств в ядре. Это можно сделать, добавив следующее в соответствующие файлы defconfig ).
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
Чтобы включить внешний поставщик камер в соответствующей сборке устройства, что добавит необходимые разрешения SELinux, конфигурацию внешней камеры и зависимость от внешнего поставщика камер, выполните следующие шаги:
Добавьте файл конфигурации внешней камеры и библиотеку внешней камеры в
device.mk.+PRODUCT_PACKAGES += android.hardware.camera.provider-V1-external-service +PRODUCT_COPY_FILES += \ +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xmlДобавьте имя поставщика внешней камеры в манифест Treble HAL устройства.
<hal format="aidl"> <name>android.hardware.camera.provider</name> <version>1</version> <interface> <name>ICameraProvider</name> <instance>internal/0</instance> + <instance>external/0</instance> </interface> </hal>(Необязательно) Если устройство работает в режиме сквозной передачи Treble, обновите
sepolicy, чтобыcameraserverмог получить доступ к UVC-камере.+# for external camera +allow cameraserver device:dir r_dir_perms; +allow cameraserver video_device:dir r_dir_perms; +allow cameraserver video_device:chr_file rw_file_perms;
Вот пример файла external_camera_config.xml (строки, касающиеся авторских прав, опущены).
<ExternalCamera> <Provider> <ignore> <!-- Internal video devices to be ignored by external camera HAL --> <id>0</id> <!-- No leading/trailing spaces --> <id>1</id> </ignore> </Provider> <!-- See ExternalCameraUtils.cpp for default values of Device configurations below --> <Device> <!-- Max JPEG buffer size in bytes--> <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) --> <!-- Size of v4l2 buffer queue when streaming >= 30fps --> <!-- Larger value: more request can be cached pipeline (less janky) --> <!-- Smaller value: use less memory --> <NumVideoBuffers count="4"/> <!-- Size of v4l2 buffer queue when streaming < 30fps --> <NumStillBuffers count="2"/> <!-- List of maximum fps for various output sizes --> <!-- Any image size smaller than the size listed in Limit row will report fps (as minimum frame duration) up to the fpsBound value. --> <FpsList> <!-- width/height must be increasing, fpsBound must be decreasing--> <Limit width="640" height="480" fpsBound="30.0"/> <Limit width="1280" height="720" fpsBound="15.0"/> <Limit width="1920" height="1080" fpsBound="10.0"/> <!-- image size larger than the last entry will not be supported--> </FpsList> </Device> </ExternalCamera>
Настройка
Вы можете улучшить камеру Android либо с помощью общих параметров настройки, либо путем оптимизации, специфичной для конкретного устройства.
Общие настройки
Вы можете настроить внешний поставщик камер, изменив файл external_camera_config.xml . В частности, клиенты могут настроить следующие параметры:
- Исключая видеоузлы внутренних камер
- Поддерживаемые значения размера изображения и верхней границы частоты кадров
- Количество буферов в процессе обработки (компромисс между задержкой и объемом памяти)
Помимо этих параметров, вы можете добавить свои собственные параметры или разработать собственные конфигурации.
Оптимизация, специфичная для конкретного устройства
Вы также можете повысить производительность, добавив оптимизации, специфичные для конкретного устройства.
Копирование/масштабирование буфера и декодирование/кодирование JPEG.
В стандартных реализациях используется ЦП (libyuv/libjpeg), но это можно заменить оптимизациями, специфичными для конкретного устройства.
Формат вывода HAL
В стандартных реализациях используются следующие форматы вывода:
-
YUV_420_888для буферов,IMPLEMENTATION_DEFINEDвидео. -
YUV12для всех остальных буферов,IMPLEMENTATION_DEFINED
Для повышения производительности можно заменить выходные форматы на эффективные форматы, специфичные для конкретного устройства. Также можно добавить поддержку дополнительных форматов в индивидуальной реализации.
Валидация
Устройства с поддержкой внешней камеры должны пройти проверку CTS камеры . Внешняя USB-веб-камера должна оставаться подключенной к конкретному устройству на протяжении всего выполнения теста, в противном случае некоторые тестовые случаи завершатся неудачей.