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

На устройствах с 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.

  1. Пользователь выбирает USB-веб-камеру в приложении "Настройки".
  2. Приложение "Настройки" отправляет вызов связывания в 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. Архитектура 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-веб-камера.

Настройки 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.