Платформа Android поддерживает использование USB-камер с функцией Plug-and-Play (то есть веб-камер) с использованием стандартного API-интерфейса Android Camera2 и интерфейса камеры HAL . Веб-камеры обычно поддерживают драйверы USB-видеокласса (UVC) , а в Linux для управления камерами UVC используется стандартный драйвер Video4Linux (V4L) .
Благодаря поддержке веб-камер устройства можно использовать в простых случаях, таких как видеочаты и фотокиоски. Эта функция не заменяет типичные HAL внутренней камеры на телефонах Android и не предназначена для поддержки сложных задач, требующих высокой производительности, включая высокоскоростную потоковую передачу с высоким разрешением, дополненную реальность и ручное управление интернет-провайдером, датчиком или объективом.
Процесс 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 должна оставаться подключенной к конкретному устройству в течение всего тестового прогона, иначе некоторые тестовые случаи не будут выполнены.