На устройствах с Android 14 QPR1 или более поздней версией ОС поддерживается использование устройства в качестве USB-камеры. Устройства Android, поддерживающие эту функцию, рекламируются как устройства UVC, что позволяет широкому спектру USB-хостов с различными операционными системами (например, Linux, macOS, Windows и ChromeOS) использовать камеру устройства в качестве веб-камеры. Сервис DeviceAsWebcam поддерживает эту функцию, позволяя использовать устройство в качестве веб-камеры.
Сервис DeviceAsWebcam
Сервис DeviceAsWebcam в AOSP включает действие предварительного просмотра (DeviceAsWebcamPreview.java), которое позволяет пользователям кадрировать сцену. В режиме предварительного просмотра пользователь может:
Посмотреть, как будет выглядеть изображение с веб-камеры на компьютере организатора до начала трансляции.
Вы можете настроить видео с веб-камеры, которое будет отправлено организатору, следующими способами:
- Выбор камеры для трансляции (основной или фронтальной).
- Выбирать уровень масштабирования с помощью ползунка или кнопок.
- Нажатие на определенную область в режиме предпросмотра, чтобы сфокусироваться на ней или снять фокус.
Предварительный просмотр работает с общими функциями специальных возможностей Android, такими как TalkBack, Switch Access и Voice Access.
Рисунок 1. Изображение с веб-камеры передается на компьютер, где с помощью предварительного просмотра можно управлять трансляцией.
Архитектура
На рисунке 2 показана архитектура, необходимая для использования устройства в качестве веб-камеры. Ниже описано, как сервис DeviceAsWebcam взаимодействует с остальными компонентами платформы Android.
- Пользователь выбирает USB-веб-камеру в приложении "Настройки".
- Приложение "Настройки" отправляет вызов связывания в
system_serverчерез классUsbManager, сообщая, что выбранFUNCTION_UVC. - Системный сервер выполняет следующие действия:
- Сообщает HAL USB-устройства, что нужно получить функцию устройства UVC с помощью вызова интерфейса HAL
setUsbFunctions. - Сообщает HAL USB-гаджета о необходимости настроить драйвер UVC-гаджета с помощью ConfigFs.
- Сообщает HAL USB-устройства, что нужно получить функцию устройства UVC с помощью вызова интерфейса HAL
- Получив обратный вызов от HAL-модуля гаджета,
system_serverотправляет широковещательное сообщение фреймворку, которое затем получает сервисDeviceAsWebcam. - Драйвер USB-устройства запускает трансляцию с веб-камеры после получения команд конфигурации от хоста через узлы V4L2 в
/dev/video*.
Рисунок 2. Архитектура DeviceAsWebcam.
Реализация
В этом разделе рассказывается, как настроить поддержку использования устройства Android в качестве веб-камеры.
Поддержка ядра
В Android 14 и более поздних версиях Generic Kernel Image (GKI) по умолчанию включает драйвер гаджета UVC (подробнее о патче AOSP…).
Поддержка UVC в HAL гаджета
В Android 14 функция UVC включена в интерфейс HAL GadgetFunction.aidl. В Gadget HAL устройство UVC монтируется в ConfigFS так же, как и другие функции ConfigFS, например MTP или ADB.
Чтобы реализовать Gadget HAL, внесите изменения для подключения функции UVC к ConfigFS. Ниже приведен пример фрагмента реализации HAL гаджета, поддерживающего функцию UVC:
UsbGadget::setCurrentUsbFunctions(long functions) {
...
// Existing functions
if ((functions & GadgetFunction::MTP) != 0) {
...
linkFunction("ffs.mtp"); // Mount to ConfigFS
...
}
...
// UVC function follows the same pattern!
if ((functions & GadgetFunction::UVC) != 0) {
...
linkFunction("uvc.0"); // Mount to ConfigFS
...
}
...
}
Когда устройство используется в качестве веб-камеры, убедитесь, что HAL USB-гаджета передает правильные комбинации VID/PID.
Поскольку вся логика UVC находится в инициализации поставщика или в DeviceAsWebcamсервисе, в HAL устройства не требуется никакой другой логики UVC, кроме создания символической ссылки на функцию UVC в ConfigFS.
Дополнительные сведения о реализации см. в следующем образце кода в AOSP:
Как настроить ConfigFS с конфигурациями UVC
Чтобы сообщить драйверу UVC-гаджета, какие форматы, размеры и частоту кадров поддерживает веб-камера Android, настройте ConfigFS с конфигурациями UVC. Дополнительную информацию можно найти в документации по Linux в разделе ConfigFS UVC gadget ABI.
Ниже приведен пример того, как инициализация поставщика может настроить драйвер гаджета UVC (фрагмент кода в AOSP).
# uvc function
mkdir /configfs_path/functions/uvc.0
write /configfs_path/functions/uvc.0/function_name "Android Webcam"
write /configfs_path/functions/uvc.0/streaming_maxpacket 3072
# setup control params
mkdir /configfs_path/functions/uvc.0/control/header/h
symlink /configfs_path/functions/uvc.0/control/header/h \
/configfs_path/functions/uvc.0/control/class/fs/h
symlink /configfs_path/functions/uvc.0/control/header/h \
/configfs_path/functions/uvc.0/control/class/ss/h
# advertise 1080p resolution for webcam encoded as mjpeg
mkdir /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wHeight 1080
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wWidth 1920
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwMaxVideoFrameBufferSize 4147200
# advertise 30 fps support for 1080p.
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwDefaultFrameInterval 333333
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwFrameInterval "333333"
# setup streaming params
mkdir /configfs_path/functions/uvc.0/streaming/header/h
symlink /configfs_path/functions/uvc.0/streaming/mjpeg/m \
/configfs_path/functions/uvc.0/streaming/header/h/m
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/configfs_path/functions/uvc.0/streaming/class/fs/h
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/configfs_path/functions/uvc.0/streaming/class/hs/h
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/config/usb_gadget/g1/functions/uvc.0/streaming/class/ss/h
# ...
Этот фрагмент настраивает драйвер гаджета UVC для рекламы потока MJPEG 1080p со скоростью 30 кадров в секунду. Эти возможности передаются хосту USB, когда он запрашивает поддерживаемые разрешения и частоту кадров.
Ниже приведены общие рекомендации по выбору конфигураций, которые веб-камера передает в рекламе:
- Сервис
DeviceAsWebcamподдерживает два формата потока: MJPEG и несжатый YUYV. - USB 2.0 поддерживает передачу данных со скоростью 480 Мбит/с (60 МБ/с). Это означает, что при частоте 30 кадров/с размер каждого кадра не должен превышать 2 МБ, а при частоте 60 кадров/с – 1 МБ.
- Несжатые потоки (YUYV): при частоте 30 кадров в секунду максимальный поддерживаемый размер кадра – 720p, поскольку YUYV – это два байта на пиксель.
- Сжатые потоки MJPEG: при коэффициенте сжатия 1:10 из YUV USB 2.0 может поддерживать 4K (1,18 МБ на кадр).
- Основная фронтальная и задняя камеры должны поддерживать все заявленные размеры кадра. Это связано с тем, что пользователь может переключаться между идентификаторами камер с помощью интерфейса предпросмотра. Для потоков MJPEG мы рекомендуем поставщикам указывать размеры кадров 480p (640 x 480), 720p (1280 x 820) и 1080p (1920 x 1080), поскольку эти размеры [используются] по умолчанию в хост-приложениях.
- Основные фронтальная и задняя камеры должны поддерживать все заявленные частоты кадров. Мы настоятельно рекомендуем поставщикам поддерживать частоту 30 кадров в секунду.
Пример добавления конфигураций потока с веб-камеры (ConfigFS) можно найти в образце патча AOSP.
Включить веб-камеру в сборке
Чтобы включить сервис DeviceAsWebcam, задайте для системного свойства ro.usb.uvc.enabled значение true в файле device.mk.
# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
ro.usb.uvc.enabled=true
Если это системное свойство включено, в приложении "Настройки" в разделе настроек USB появится параметр Веб-камера (как показано на рисунке 3). Если этот параметр выбран, устройство Android будет распознаваться хост-устройством как USB-веб-камера.
Рисунок 3. Настройки USB в приложении "Настройки".
Вы также можете настроить устройство на функцию USB-веб-камеры с помощью adb, используя следующую команду:
adb shell svc usb setFunctions uvcУчитывайте энергопотребление и тепловыделение
Поскольку камера устройства может быть включена несколько часов в день, мы рекомендуем принять меры, чтобы энергопотребление и температура устройства не превышали определенные пределы. Чтобы не превышать допустимое энергопотребление, рекомендуем выполнить следующие действия:
- Чтобы повысить энергоэффективность аппаратно-зависимого уровня камеры, включите
STREAM_USE_CASE_VIDEO_CALLв сервисеDeviceAsWebcam. Если энергопотребление остается проблемой даже при включенном
STREAM_USE_CASE_VIDEO_CALL, сервисDeviceAsWebcamпозволяет дополнительно снизить энергопотребление за счет использования физических потоков. Вы можете использовать переопределение ресурсов во время выполнения (RRO), чтобы указать, какую физическую камеру использовать. Физические потоки значительно снижают качество видео и приводят к путанице в UX, поэтому используйте это решение только в крайнем случае. ОптимизацияSTREAM_USE_CASE_VIDEO_CALL– это предпочтительное решение проблем с питанием. Дополнительную информацию о поддерживаемыхDeviceAsWebcamправилах ограничения доступа можно найти в файле readme.md.Ниже приведен пример RRO, настроенного на использование физического идентификатора камеры 3 вместо логического идентификатора камеры 0. Пример в AOSP можно найти в DeviceAsWebcamRaven.
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
Проверка
Чтобы проверить, как на вашем устройстве реализован сервис DeviceAsWebcam, выполните следующие тесты:
- Тест CTS verifier веб-камеры. Проверяет, поддерживаются ли на устройстве форматы, размеры и частота кадров.
- Тестирование вручную. Проверьте, как функция веб-камеры работает с разными приложениями на разных операционных системах.
Известные проблемы
Ниже перечислены известные проблемы с сервисом DeviceAsWebcam.
Иногда поток драйвера гаджета UVC мерцает и показывает поврежденные кадры. Эта проблема устранена и объединена с upstream и GKI.
Исправления в вышестоящих компонентах:
Устройства Android в режиме веб-камеры не работают с кабелями USB 3.0+ на хостах macOS из-за ошибки в драйвере UVC от Apple.