Для устройств под управлением Android 14-QPR1 или более поздней версии Android поддерживает использование устройства в качестве веб-камеры USB. Устройства Android, поддерживающие эту функцию, рекламируются как устройства UVC , что позволяет широкому кругу USB-хостов с различными операционными системами (например, Linux, macOS, Windows и ChromeOS) использовать камеру устройства в качестве веб-камеры. Служба DeviceAsWebcam
поддерживает эту функцию, позволяющую использовать устройство в качестве веб-камеры.
Сервис DeviceAsWebcam
Служба DeviceAsWebcam
в AOSP включает действие предварительного просмотра ( DeviceAsWebcamPreview.java
), которое позволяет пользователям кадрировать сцену. Действие предварительного просмотра позволяет пользователю делать следующее:
Прежде чем начать потоковую передачу, просмотрите, как будет выглядеть изображение с веб-камеры на хост-компьютере.
Настройте изображение с веб-камеры, отправляемое хосту, следующими способами:
- Выбор камеры для потоковой передачи: передней или задней.
- Выбор уровня масштабирования с помощью ползунка или кнопок.
- Коснитесь определенной области предварительного просмотра, чтобы сфокусироваться или снять фокус с этой области.
Действие предварительного просмотра работает с общими функциями специальных возможностей Android, такими как TalkBack , Switch 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
. Для гаджета HAL гаджет UVC монтируется в ConfigFS так же, как и другие функции ConfigFS, такие как MTP или ADB.
Чтобы реализовать гаджет 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 находится либо в init поставщика, либо в службе DeviceAsWebcam
, в HAL гаджета не требуется никакой конкретной логики UVC, кроме символической связи функции UVC с ConfigFS.
Дополнительные рекомендации по реализации см. в следующем примере кода в AOSP:
Настройте ConfigFS с конфигурациями UVC.
Чтобы сообщить драйверу гаджета UVC, какие форматы, размеры и частота кадров поддерживаются веб-камерой Android, настройте ConfigFS с конфигурациями UVC. Дополнительные сведения см. в исходной документации Linux по гаджету ConfigFS UVC ABI .
Ниже приведен пример того, как поставщик init может настроить драйвер гаджета 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 составляет 2 байта на пиксель.
- Сжатые потоки 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
Учитывайте проблемы с питанием и температурой
Работа веб-камеры означает, что камера устройства может быть включена несколько часов в день, поэтому мы рекомендуем принять меры, чтобы энергопотребление и температура устройства оставались в определенных пределах. Ниже приведены рекомендуемые решения для ограничения энергопотребления:
- Для повышения производительности HAL камеры включите
STREAM_USE_CASE_VIDEO_CALL
в службеDeviceAsWebcam
. Если питание вызывает беспокойство даже при включенном
STREAM_USE_CASE_VIDEO_CALL
, службаDeviceAsWebcam
предоставляет возможность дополнительно снизить энергопотребление за счет использования физических потоков. Вы можете использовать наложения ресурсов времени выполнения (RRO), чтобы указать, какую физическую камеру использовать. Физические потоки значительно снижают качество видео и приводят к запутанному пользовательскому интерфейсу, поэтому используйте это решение только в крайнем случае. ОптимизацияSTREAM_USE_CASE_VIDEO_CALL
является предпочтительным решением проблем с питанием. Дополнительную информацию о RRO, поддерживаемых сервисомDeviceAsWebcam
, см. в readme.md .Ниже приведен пример настройки RRO для использования идентификатора физической камеры 3 вместо идентификатора логической камеры 0. Пример в AOSP см. в разделе DeviceAsWebcamRaven .
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
Проверка
Чтобы протестировать реализацию службы DeviceAsWebcam
на вашем устройстве, используйте следующие тесты:
- Веб-камера для проверки CTS: проверьте, поддерживаются ли устройством форматы, размеры и частота кадров.
- Ручные тесты: проверьте, что функция веб-камеры работает с различными хост-приложениями в различных хост-операционных системах.
Известные проблемы
Ниже приведены известные проблемы службы DeviceAsWebcam
:
Поток драйвера гаджета UVC иногда мерцает и показывает что-то похожее на поврежденные кадры. Эта проблема была исправлена и объединена в исходную версию и в GKI.
Исправления в восходящем направлении:
Устройства Android в режиме веб-камеры не работают с кабелями USB 3.0+ на хостах macOS из-за ошибки в драйвере UVC от Apple.