Распространяется по лицензии Apache версии 2.0 (далее – Лицензия). Использовать этот файл можно только при соблюдении условий Лицензии. Чтобы получить текст Лицензии, перейдите по ссылке:
http://www.apache.org/licenses/LICENSE-2.0
Если иное не предусмотрено действующим законодательством или письменным соглашением, программное обеспечение, распространяемое на условиях Лицензии, предоставляется на условиях "КАК ЕСТЬ", БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ ИЛИ УСЛОВИЙ, явных или подразумеваемых. See the License for the specific language governing permissions and limitations under the License. -->
Платформа Android поддерживает использование USB-камер (веб-камер) с технологией Plug and Play, используя стандартный Android Camera2 API и интерфейс 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Добавьте название поставщика внешней камеры в манифест HAL Treble устройства.
<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>Привяжите экземпляр поставщика камеры AIDL
external/0кhal_camera_serviceв файлеsepolicy/service_contextsустройства. Подробную информацию можно найти в статье SEPolicy для AIDL HAL.android.hardware.camera.provider.ICameraProvider/external/0 u:object_r:hal_camera_service:s0Если устройство работает в режиме Treble passthrough, обновите
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_DEFINEDYUV12для всех остальных буферовIMPLEMENTATION_DEFINED
Чтобы повысить производительность, вы можете заменить выходные форматы на эффективные форматы, зависящие от устройства. Вы также можете поддерживать дополнительные форматы в пользовательской реализации.
Проверка
Устройства с поддержкой внешней камеры должны пройти тест CTS для камеры. Внешняя USB-камера должна быть подключена к устройству на протяжении всего тестирования, иначе некоторые проверки не будут пройдены.