Для устройств под управлением Android 14-QPR1 и выше Android поддерживает использование устройства в качестве 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. - Сообщает USB-гаджету HAL о необходимости настройки драйвера 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 в Gadget HAL
Начиная с Android 14, функция UVC включена в интерфейс HAL GadgetFunction.aidl . Для Gadget HAL гаджет UVC монтируется в ConfigFS так же, как и другие функции ConfigFS, такие как MTP или ADB.
Чтобы реализовать Gadget HAL, внесите изменения, чтобы смонтировать функцию UVC в ConfigFS. Ниже приведён пример реализации Gadget 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 по ABI гаджета UVC ConfigFS .
Ниже приведен пример того, как вендор 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: при коэффициенте сжатия YUV 1:10 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 в файле device.mk в значение true .
# 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 verifier: проверка того, поддерживаются ли устройством форматы, размеры и частота кадров.
- Ручное тестирование: проверьте работу функции веб-камеры с различными хост-приложениями на различных хост-операционных системах.
Известные проблемы
Ниже перечислены известные проблемы службы DeviceAsWebcam :
Поток драйвера гаджета UVC иногда мерцает и отображает что-то похожее на повреждённые кадры. Эта проблема была исправлена и интегрирована в основную ветку разработки и GKI.
Исправления в восходящем направлении:
Устройства Android в режиме веб-камеры не работают с кабелями USB 3.0+ на хостах macOS из-за ошибки в драйвере UVC от Apple.