Используйте устройство в качестве веб-камеры

Для устройств под управлением 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:

  1. Пользователь выбирает опцию «USB-веб-камера» в приложении «Настройки».
  2. Приложение «Настройки» отправляет вызов binder на system_server через класс UsbManager , сообщая ему о том, что выбран FUNCTION_UVC .
  3. Системный сервер выполняет следующие действия:
    1. Уведомляет HAL USB-гаджета о необходимости получения функции UVC-гаджета посредством вызова интерфейса HAL setUsbFunctions .
    2. Уведомляет HAL USB-устройства о необходимости настройки драйвера UVC-устройства с помощью ConfigFs.
  4. Получив обратный вызов от HAL гаджета, system_server отправляет широковещательное сообщение фреймворку, которое будет принято службой DeviceAsWebcam .
  5. Драйвер USB-устройства запускает потоковое видео с веб-камеры после получения команд конфигурации от хоста через узлы V4L2 по адресу /dev/video* .

архитектура устройства как веб-камеры

Рисунок 2. Архитектура устройства в качестве веб-камеры.

Выполнение

В этом разделе описывается, как обеспечить поддержку использования устройства Android в качестве веб-камеры.

Поддержка ядра

Для Android 14 и выше универсальный образ ядра (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 находится либо в инициализации поставщика, либо в службе DeviceAsWebcam , в Gadget HAL не требуется никакой специфической логики UVC, кроме создания символической ссылки на функцию UVC в ConfigFS.

Дополнительные рекомендации по реализации см. в следующем примере кода на языке AOSP:

Настройка ConfigFS с использованием конфигураций UVC.

Чтобы сообщить драйверу UVC-гаджета, какие форматы, размеры и частота кадров поддерживаются веб-камерой Android, настройте ConfigFS с конфигурациями UVC. Для получения дополнительной информации см. документацию Linux по ABI UVC-гаджета ConfigFS .

Ниже приведён пример того, как инициализация поставщика может настроить драйвер 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-веб-камера.

Настройки 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 является предпочтительным решением проблем с энергопотреблением. Для получения дополнительной информации о поддерживаемых службой DeviceAsWebcam RRO см. файл readme.md .

    Ниже приведён пример настройки RRO для использования физического идентификатора камеры 3 вместо логического идентификатора камеры 0. Пример на языке AOSP см. в разделе DeviceAsWebcamRaven .

    // For logical camera id 0 - use physical camera id 3
    {"0": {"3" : "UW"}}
    

Проверка

Для проверки работы службы DeviceAsWebcam на вашем устройстве используйте следующие тесты:

  • Проверка веб-камеры с помощью CTS verifier: подтверждает, что устройство поддерживает определенные форматы, размеры и частоту кадров.
  • Ручные тесты: Проверьте, работает ли функция веб-камеры с различными приложениями на различных операционных системах.

Известные проблемы

Ниже перечислены известные проблемы, связанные со службой DeviceAsWebcam :